summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorSteve Manuel <nilslice@gmail.com>2017-05-27 10:27:51 -0700
committerSteve Manuel <nilslice@gmail.com>2017-05-27 10:27:51 -0700
commit78de7ed98abff93fe5fef94907bcfa4f76dcef07 (patch)
treef58578554dc829a046762e588d8b190af89dd992 /docs
parent38aa0ebb1df97ff185d84da2d3c2f9a11888729b (diff)
adding docs to repo
Diffstat (limited to 'docs')
-rw-r--r--docs/.gitignore0
-rw-r--r--docs/CNAME1
-rw-r--r--docs/LICENSE29
-rw-r--r--docs/README.md26
-rw-r--r--docs/build/404.html772
-rw-r--r--docs/build/CLI/General-Usage/index.html1254
-rw-r--r--docs/build/CLI/Generating-References/index.html1055
-rw-r--r--docs/build/CNAME1
-rw-r--r--docs/build/Content/An-Overview/index.html969
-rw-r--r--docs/build/Content/Extending-Content/index.html959
-rw-r--r--docs/build/Form-Fields/HTML-Inputs/index.html2083
-rw-r--r--docs/build/HTTP-APIs/Content/index.html1405
-rw-r--r--docs/build/HTTP-APIs/File-Metadata/index.html954
-rw-r--r--docs/build/HTTP-APIs/Search/index.html983
-rw-r--r--docs/build/Interfaces/API/index.html1186
-rw-r--r--docs/build/Interfaces/Editor/index.html1059
-rw-r--r--docs/build/Interfaces/Format/index.html986
-rw-r--r--docs/build/Interfaces/Item/index.html2077
-rw-r--r--docs/build/Interfaces/Search/index.html983
-rw-r--r--docs/build/Ponzu-Addons/Creating-Addons/index.html846
-rw-r--r--docs/build/Ponzu-Addons/Using-Addons/index.html846
-rw-r--r--docs/build/Quickstart/Overview/index.html932
-rw-r--r--docs/build/References/Overview/index.html1163
-rw-r--r--docs/build/Running-Backups/Backups/index.html912
-rw-r--r--docs/build/System-Configuration/Settings/index.html1131
-rw-r--r--docs/build/System-Deployment/Docker/index.html977
-rw-r--r--docs/build/System-Deployment/SysV-Style/index.html899
-rw-r--r--docs/build/assets/images/favicon.icobin0 -> 1150 bytes
-rw-r--r--docs/build/assets/images/icons/bitbucket-670608a71a.svg1
-rw-r--r--docs/build/assets/images/icons/github-1da075986e.svg1
-rw-r--r--docs/build/assets/images/icons/gitlab-5ad3f9f9e5.svg1
-rw-r--r--docs/build/assets/javascripts/application-6b599127bc.js3
-rw-r--r--docs/build/assets/javascripts/modernizr-56ade86843.js1
-rw-r--r--docs/build/assets/stylesheets/application-4d0d3f2fbf.css1
-rw-r--r--docs/build/assets/stylesheets/application-f78e5cb881.palette.css1
-rw-r--r--docs/build/images/editor-checkbox.pngbin0 -> 4759 bytes
-rw-r--r--docs/build/images/editor-file-repeater.pngbin0 -> 4976 bytes
-rw-r--r--docs/build/images/editor-file.pngbin0 -> 4485 bytes
-rw-r--r--docs/build/images/editor-input-repeater.pngbin0 -> 2682 bytes
-rw-r--r--docs/build/images/editor-input.pngbin0 -> 1847 bytes
-rw-r--r--docs/build/images/editor-richtext.pngbin0 -> 9381 bytes
-rw-r--r--docs/build/images/editor-select-repeater.pngbin0 -> 4695 bytes
-rw-r--r--docs/build/images/editor-select.pngbin0 -> 3997 bytes
-rw-r--r--docs/build/images/editor-tags.pngbin0 -> 5977 bytes
-rw-r--r--docs/build/images/editor-textarea.pngbin0 -> 2747 bytes
-rw-r--r--docs/build/images/logo.pngbin0 -> 19734 bytes
-rw-r--r--docs/build/images/ponzu-banner.pngbin0 -> 909819 bytes
-rw-r--r--docs/build/index.html941
-rw-r--r--docs/build/mkdocs/js/lunr.min.js7
-rw-r--r--docs/build/mkdocs/js/mustache.min.js1
-rw-r--r--docs/build/mkdocs/js/require.js36
-rw-r--r--docs/build/mkdocs/js/search-results-template.mustache4
-rw-r--r--docs/build/mkdocs/js/search.js88
-rw-r--r--docs/build/mkdocs/js/text.js390
-rw-r--r--docs/build/mkdocs/search_index.json1104
-rw-r--r--docs/build/sitemap.xml182
-rw-r--r--docs/mkdocs.yml27
-rw-r--r--docs/release.sh16
-rw-r--r--docs/src/CLI/General-Usage.md248
-rw-r--r--docs/src/CLI/Generating-References.md123
-rw-r--r--docs/src/Content/An-Overview.md87
-rw-r--r--docs/src/Content/Extending-Content.md44
-rw-r--r--docs/src/Form-Fields/HTML-Inputs.md391
-rw-r--r--docs/src/HTTP-APIs/Content.md196
-rw-r--r--docs/src/HTTP-APIs/File-Metadata.md29
-rw-r--r--docs/src/HTTP-APIs/Search.md47
-rw-r--r--docs/src/Interfaces/API.md110
-rw-r--r--docs/src/Interfaces/Editor.md70
-rw-r--r--docs/src/Interfaces/Format.md48
-rw-r--r--docs/src/Interfaces/Item.md517
-rw-r--r--docs/src/Interfaces/Search.md44
-rw-r--r--docs/src/Ponzu-Addons/Creating-Addons.md6
-rw-r--r--docs/src/Ponzu-Addons/Using-Addons.md6
-rw-r--r--docs/src/Quickstart/Overview.md38
-rw-r--r--docs/src/References/Overview.md218
-rw-r--r--docs/src/Running-Backups/Backups.md26
-rw-r--r--docs/src/System-Configuration/Settings.md124
-rw-r--r--docs/src/System-Deployment/Docker.md34
-rw-r--r--docs/src/System-Deployment/SysV-Style.md76
-rw-r--r--docs/src/images/editor-checkbox.pngbin0 -> 4759 bytes
-rw-r--r--docs/src/images/editor-file-repeater.pngbin0 -> 4976 bytes
-rw-r--r--docs/src/images/editor-file.pngbin0 -> 4485 bytes
-rw-r--r--docs/src/images/editor-input-repeater.pngbin0 -> 2682 bytes
-rw-r--r--docs/src/images/editor-input.pngbin0 -> 1847 bytes
-rw-r--r--docs/src/images/editor-richtext.pngbin0 -> 9381 bytes
-rw-r--r--docs/src/images/editor-select-repeater.pngbin0 -> 4695 bytes
-rw-r--r--docs/src/images/editor-select.pngbin0 -> 3997 bytes
-rw-r--r--docs/src/images/editor-tags.pngbin0 -> 5977 bytes
-rw-r--r--docs/src/images/editor-textarea.pngbin0 -> 2747 bytes
-rw-r--r--docs/src/images/logo.pngbin0 -> 19734 bytes
-rw-r--r--docs/src/images/ponzu-banner.pngbin0 -> 909819 bytes
-rw-r--r--docs/src/index.md41
92 files changed, 29816 insertions, 0 deletions
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/docs/.gitignore
diff --git a/docs/CNAME b/docs/CNAME
new file mode 100644
index 0000000..119323f
--- /dev/null
+++ b/docs/CNAME
@@ -0,0 +1 @@
+docs.ponzu-cms.org
diff --git a/docs/LICENSE b/docs/LICENSE
new file mode 100644
index 0000000..720d6cd
--- /dev/null
+++ b/docs/LICENSE
@@ -0,0 +1,29 @@
+BSD 3-Clause License
+
+Copyright (c) 2016 Boss Sauce Creative, LLC.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000..990cd92
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,26 @@
+# Ponzu CMS + Server Framerwork Docs
+
+## Contributing
+
+Documentation contributions are welcome and appreciated. If you find something
+lacking in documentation or have submitted a PR that is being merged into master,
+please help everyone out and write some docs!
+
+**Note:** Docker is required to follow these instructions, but you can also use
+MkDocs natively, [see details here](http://www.mkdocs.org/#installation). Ponzu
+docs use the "Material" [theme](http://squidfunk.github.io/mkdocs-material/).
+
+
+Here is how to run a local docs server and build them for release:
+
+1. Clone this repository
+```bash
+$ git clone https://github.com/ponzu-cms/docs.git
+```
+2. Start the development server which will watch and auto-build the docs
+```bash
+$ docker run --rm -it -p 8000:8000 -v `pwd`:/docs squidfunk/mkdocs-material
+```
+3. Submit a PR with your changes. If you run the build step, please do not add it to the PR.
+
+**Thank you!**
diff --git a/docs/build/404.html b/docs/build/404.html
new file mode 100644
index 0000000..f23455a
--- /dev/null
+++ b/docs/build/404.html
@@ -0,0 +1,772 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="/assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>Ponzu</title>
+
+
+
+ <script src="/assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="/assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="/assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="/" title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="/images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+ Ponzu
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="/images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/" title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/Interfaces/API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/Interfaces/Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/Interfaces/Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/Interfaces/Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/Interfaces/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="/System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+ <h1>404 - Not found</h1>
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="/assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:""}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/CLI/General-Usage/index.html b/docs/build/CLI/General-Usage/index.html
new file mode 100644
index 0000000..884336a
--- /dev/null
+++ b/docs/build/CLI/General-Usage/index.html
@@ -0,0 +1,1254 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>Using the Ponzu Command Line Interface (CLI)</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ CLI
+ </span>
+
+
+ General Usage
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2" checked>
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ General Usage
+ </label>
+
+ <a href="./" title="General Usage" class="md-nav__link md-nav__link--active">
+ General Usage
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#commands" title="Commands" class="md-nav__link">
+ Commands
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#new" title="new" class="md-nav__link">
+ new
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#generate-gen-g" title="generate, gen, g" class="md-nav__link">
+ generate, gen, g
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#build" title="build" class="md-nav__link">
+ build
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#run" title="run" class="md-nav__link">
+ run
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#upgrade" title="upgrade" class="md-nav__link">
+ upgrade
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#add-a" title="add, a" class="md-nav__link">
+ add, a
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#version-v" title="version, v" class="md-nav__link">
+ version, v
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#contributing" title="Contributing" class="md-nav__link">
+ Contributing
+ </a>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#commands" title="Commands" class="md-nav__link">
+ Commands
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#new" title="new" class="md-nav__link">
+ new
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#generate-gen-g" title="generate, gen, g" class="md-nav__link">
+ generate, gen, g
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#build" title="build" class="md-nav__link">
+ build
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#run" title="run" class="md-nav__link">
+ run
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#upgrade" title="upgrade" class="md-nav__link">
+ upgrade
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#add-a" title="add, a" class="md-nav__link">
+ add, a
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#version-v" title="version, v" class="md-nav__link">
+ version, v
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#contributing" title="Contributing" class="md-nav__link">
+ Contributing
+ </a>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>General Usage</h1>
+
+ <div class="codehilite"><pre><span></span>$ ponzu <span class="o">[</span>flags<span class="o">]</span> <span class="nb">command</span> &lt;params&gt;
+</pre></div>
+
+
+<h2 id="commands">Commands<a class="headerlink" href="#commands" title="Permanent link">&para;</a></h2>
+<h3 id="new">new<a class="headerlink" href="#new" title="Permanent link">&para;</a></h3>
+<p>Creates a project directory of the name supplied as a parameter immediately
+following the 'new' option in the $GOPATH/src directory. Note: 'new' depends on
+the program 'git' and possibly a network connection. If there is no local
+repository to clone from at the local machine's $GOPATH, 'new' will attempt to
+clone the 'github.com/ponzu-cms/ponzu' package from over the network.</p>
+<p>Example:</p>
+<div class="codehilite"><pre><span></span>$ ponzu new github.com/nilslice/proj
+&gt; New ponzu project created at <span class="nv">$GOPATH</span>/src/github.com/nilslice/proj
+</pre></div>
+
+
+<hr />
+<h3 id="generate-gen-g">generate, gen, g<a class="headerlink" href="#generate-gen-g" title="Permanent link">&para;</a></h3>
+<p>Generate boilerplate code for various Ponzu components, such as <code>content</code>.</p>
+<p>Example:</p>
+<div class="codehilite"><pre><span></span> generator struct fields and built-in types...
+ <span class="p">|</span> <span class="p">|</span>
+ v v
+$ ponzu gen content review title:<span class="s2">&quot;string&quot;</span> body:<span class="s2">&quot;string&quot;</span>:richtext rating:<span class="s2">&quot;int&quot;</span>
+ ^ ^
+ <span class="p">|</span> <span class="p">|</span>
+ struct <span class="nb">type</span> <span class="o">(</span>optional<span class="o">)</span> input view specifier
+</pre></div>
+
+
+<p>The command above will generate the file <code>content/review.go</code> with boilerplate
+methods, as well as struct definition, and corresponding field tags like:</p>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Review</span> <span class="kd">struct</span> <span class="p">{</span>
+ <span class="nx">item</span><span class="p">.</span><span class="nx">Item</span>
+
+ <span class="nx">Title</span> <span class="kt">string</span> <span class="s">`json:&quot;title&quot;`</span>
+ <span class="nx">Body</span> <span class="kt">string</span> <span class="s">`json:&quot;body&quot;`</span>
+ <span class="nx">Rating</span> <span class="kt">int</span> <span class="s">`json:&quot;rating&quot;`</span>
+ <span class="nx">Tags</span> <span class="p">[]</span><span class="kt">string</span> <span class="s">`json:&quot;tags&quot;`</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>The generate command will intelligently parse more sophisticated field names
+such as 'field_name' and convert it to 'FieldName' and vice versa, only where
+appropriate as per common Go idioms. Errors will be reported, but successful
+generate commands return nothing.</p>
+<p><strong>Input View Specifiers</strong> <em>(optional)</em></p>
+<p>The CLI can optionally parse a third parameter on the fields provided to generate
+the type of HTML view an editor field is presented within. If no third parameter
+is added, a plain text HTML input will be generated. In the example above, the
+argument shown as <code>body:string:richtext</code> would show the Richtext input instead
+of a plain text HTML input (as shown in the screenshot). The following input
+view specifiers are implemented:</p>
+<table>
+<thead>
+<tr>
+<th>CLI parameter</th>
+<th>Generates</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>checkbox</td>
+<td><a href="../../Form-Fields/HTML-Inputs/#editorcheckbox"><code>editor.Checkbox()</code></a></td>
+</tr>
+<tr>
+<td>custom</td>
+<td>generates a pre-styled empty div to fill with HTML</td>
+</tr>
+<tr>
+<td>file</td>
+<td><a href="../../Form-Fields/HTML-Inputs/#editorfile"><code>editor.File()</code></a></td>
+</tr>
+<tr>
+<td>hidden</td>
+<td><a href="../../Form-Fields/HTML-Inputs/#editorinput"><code>editor.Input()</code></a> + uses type=hidden</td>
+</tr>
+<tr>
+<td>input, text</td>
+<td><a href="../../Form-Fields/HTML-Inputs/#editorinput"><code>editor.Input()</code></a></td>
+</tr>
+<tr>
+<td>richtext</td>
+<td><a href="../../Form-Fields/HTML-Inputs/#editorrichtext"><code>editor.Richtext()</code></a></td>
+</tr>
+<tr>
+<td>select</td>
+<td><a href="../../Form-Fields/HTML-Inputs/#editorselect"><code>editor.Select()</code></a></td>
+</tr>
+<tr>
+<td>textarea</td>
+<td><a href="../../Form-Fields/HTML-Inputs/#editortextarea"><code>editor.Textarea()</code></a></td>
+</tr>
+<tr>
+<td>tags</td>
+<td><a href="../../Form-Fields/HTML-Inputs/#editortags"><code>editor.Tags()</code></a></td>
+</tr>
+</tbody>
+</table>
+<p><strong>Generate Content References</strong></p>
+<p>It's also possible to generate all of the code needed to create references between
+your content types. The syntax to do so is below, but refer to the <a href="../../CLI/Generating-References">documentation</a>
+for more details:</p>
+<div class="codehilite"><pre><span></span>$ ponzu gen c author name:string genre:string:select
+$ ponzu gen c book title:string author:@author,name,genre
+</pre></div>
+
+
+<p>The commands above will generate a <code>Book</code> Content type with a reference to an
+<code>Author</code> item, by also generating a <a href="../../Form-Fields/HTML-Inputs/#referenceselect"><code>reference.Select</code></a>
+as the view for the <code>author</code> field.</p>
+<hr />
+<h3 id="build">build<a class="headerlink" href="#build" title="Permanent link">&para;</a></h3>
+<p>From within your Ponzu project directory, running build will copy and move
+the necessary files from your workspace into the vendored directory, and
+will build/compile the project to then be run. </p>
+<p>Optional flags:
+- <code>--gocmd</code> sets the binary used when executing <code>go build</code> within <code>ponzu</code> build step</p>
+<p>Example:</p>
+<div class="codehilite"><pre><span></span>$ ponzu build
+<span class="o">(</span>or<span class="o">)</span>
+$ ponzu build --gocmd<span class="o">=</span>go1.8rc1 <span class="c1"># useful for testing</span>
+</pre></div>
+
+
+<p>Errors will be reported, but successful build commands return nothing.</p>
+<hr />
+<h3 id="run">run<a class="headerlink" href="#run" title="Permanent link">&para;</a></h3>
+<p>Starts the HTTP server for the JSON API, Admin System, or both.
+The segments, separated by a comma, describe which services to start, either
+'admin' (Admin System / CMS backend) or 'api' (JSON API), and, optionally,
+if the server should utilize TLS encryption - served over HTTPS, which is
+automatically managed using Let's Encrypt (https://letsencrypt.org) </p>
+<p>Optional flags:
+- <code>--port</code> sets the port on which the server listens for HTTP requests [defaults to 8080]
+- <code>--https-port</code> sets the port on which the server listens for HTTPS requests [defaults to 443]
+- <code>--https</code> enables auto HTTPS management via Let's Encrypt (port is always 443)
+- <code>--dev-https</code> generates self-signed SSL certificates for development-only (port is 10443)</p>
+<p>Example: </p>
+<div class="codehilite"><pre><span></span>$ ponzu run
+<span class="o">(</span>or<span class="o">)</span>
+$ ponzu run --port<span class="o">=</span><span class="m">8080</span> --https admin,api
+<span class="o">(</span>or<span class="o">)</span>
+$ ponzu run admin
+<span class="o">(</span>or<span class="o">)</span>
+$ ponzu run --port<span class="o">=</span><span class="m">8888</span> api
+<span class="o">(</span>or<span class="o">)</span>
+$ ponzu --dev-https run
+</pre></div>
+
+
+<p>Defaults to <code>$ ponzu run --port=8080 admin,api</code> (running Admin &amp; API on port 8080, without TLS)</p>
+<p><em>Note:</em>
+Admin and API cannot run on separate processes unless you use a copy of the
+database, since the first process to open it receives a lock. If you intend
+to run the Admin and API on separate processes, you must call them with the
+'ponzu' command independently.</p>
+<hr />
+<h3 id="upgrade">upgrade<a class="headerlink" href="#upgrade" title="Permanent link">&para;</a></h3>
+<p>Will backup your own custom project code (like content, addons, uploads, etc) so
+we can safely re-clone Ponzu from the latest version you have or from the network
+if necessary. Before running <code>$ ponzu upgrade</code>, you should update the <code>ponzu</code>
+package by running <code>$ go get -u github.com/ponzu-cms/ponzu/...</code> </p>
+<p>Example:</p>
+<div class="codehilite"><pre><span></span>$ ponzu upgrade
+</pre></div>
+
+
+<hr />
+<h3 id="add-a">add, a<a class="headerlink" href="#add-a" title="Permanent link">&para;</a></h3>
+<p>Downloads an addon to GOPATH/src and copies it to the current Ponzu project's
+<code>/addons</code> directory.</p>
+<p>Example:</p>
+<div class="codehilite"><pre><span></span>$ ponzu add github.com/bosssauce/fbscheduler
+</pre></div>
+
+
+<p>Errors will be reported, but successful add commands return nothing.</p>
+<hr />
+<h3 id="version-v">version, v<a class="headerlink" href="#version-v" title="Permanent link">&para;</a></h3>
+<p>Prints the version of Ponzu your project is using. Must be called from within a
+Ponzu project directory. By passing the <code>--cli</code> flag, the <code>version</code> command will
+print the version of the Ponzu CLI you have installed.</p>
+<p>Example:</p>
+<div class="codehilite"><pre><span></span>$ ponzu version
+Ponzu v0.8.2
+<span class="c1"># (or)</span>
+$ ponzu version --cli
+Ponzu v0.9.2
+</pre></div>
+
+
+<hr />
+<h2 id="contributing">Contributing<a class="headerlink" href="#contributing" title="Permanent link">&para;</a></h2>
+<ol>
+<li>Checkout branch ponzu-dev</li>
+<li>Make code changes</li>
+<li>Test changes to ponzu-dev branch<ul>
+<li>make a commit to ponzu-dev</li>
+<li>to manually test, you will need to use a new copy (ponzu new path/to/code),
+but pass the <code>--dev</code> flag so that ponzu generates a new copy from the <code>ponzu-dev</code>
+branch, not master by default (i.e. <code>$ponzu new --dev /path/to/code</code>)</li>
+<li>build and run with <code>$ ponzu build</code> and <code>$ ponzu run</code></li>
+</ul>
+</li>
+<li>To add back to master: <ul>
+<li>first push to origin ponzu-dev</li>
+<li>create a pull request </li>
+<li>will then be merged into master</li>
+</ul>
+</li>
+</ol>
+<p><em>A typical contribution workflow might look like:</em></p>
+<div class="codehilite"><pre><span></span><span class="c1"># clone the repository and checkout ponzu-dev</span>
+$ git clone https://github.com/ponzu-cms/ponzu path/to/local/ponzu <span class="c1"># (or your fork)</span>
+$ git checkout ponzu-dev
+
+<span class="c1"># install ponzu with go get or from your own local path</span>
+$ go get github.com/ponzu-cms/ponzu/...
+<span class="c1"># or</span>
+$ <span class="nb">cd</span> /path/to/local/ponzu
+$ go install ./...
+
+<span class="c1"># edit files, add features, etc</span>
+$ git add -A
+$ git commit -m <span class="s1">&#39;edited files, added features, etc&#39;</span>
+
+<span class="c1"># now you need to test the feature.. make a new ponzu project, but pass --dev flag</span>
+$ ponzu --dev new /path/to/new/project <span class="c1"># will create $GOPATH/src/path/to/new/project</span>
+
+<span class="c1"># build &amp; run ponzu from the new project directory</span>
+$ <span class="nb">cd</span> /path/to/new/project
+$ ponzu build <span class="o">&amp;&amp;</span> ponzu run
+
+<span class="c1"># push to your origin:ponzu-dev branch and create a PR at ponzu-cms/ponzu</span>
+$ git push origin ponzu-dev
+<span class="c1"># ... go to https://github.com/ponzu-cms/ponzu and create a PR</span>
+</pre></div>
+
+
+<p><strong>Note:</strong> if you intend to work on your own fork and contribute from it, you will
+need to also pass <code>--fork=path/to/your/fork</code> (using OS-standard filepath structure),
+where <code>path/to/your/fork</code> <em>must</em> be within <code>$GOPATH/src</code>, and you are working from a branch
+called <code>ponzu-dev</code>. </p>
+<p>For example: </p>
+<div class="codehilite"><pre><span></span><span class="c1"># ($GOPATH/src is implied in the fork path, do not add it yourself)</span>
+$ ponzu new --dev --fork<span class="o">=</span>github.com/nilslice/ponzu /path/to/new/project
+</pre></div>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../.." title="Home" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ Home
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../Generating-References/" title="Generating References" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ Generating References
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/CLI/Generating-References/index.html b/docs/build/CLI/Generating-References/index.html
new file mode 100644
index 0000000..38c50a6
--- /dev/null
+++ b/docs/build/CLI/Generating-References/index.html
@@ -0,0 +1,1055 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>How to Generate References using Ponzu CLI</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ CLI
+ </span>
+
+
+ Generating References
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2" checked>
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ Generating References
+ </label>
+
+ <a href="./" title="Generating References" class="md-nav__link md-nav__link--active">
+ Generating References
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#syntax" title="Syntax" class="md-nav__link">
+ Syntax
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#_1" title="@" class="md-nav__link">
+ @
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#_2" title="[]" class="md-nav__link">
+ []
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#arg1arg2argn" title=",arg1,arg2,argN" class="md-nav__link">
+ ,arg1,arg2,argN
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#syntax" title="Syntax" class="md-nav__link">
+ Syntax
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#_1" title="@" class="md-nav__link">
+ @
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#_2" title="[]" class="md-nav__link">
+ []
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#arg1arg2argn" title=",arg1,arg2,argN" class="md-nav__link">
+ ,arg1,arg2,argN
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>Generating References</h1>
+
+ <p>In Ponzu, users make connections between Content types using references. In order
+to use the CLI to generate these references, a slightly different syntax is required.
+In all cases, the Content type you wish to reference does not need to exist prior
+to the "parent" type referencing it at generate-time, but in the following examples,
+the referenced "child" type will be shown before the parent type for clarity.</p>
+<h2 id="syntax">Syntax<a class="headerlink" href="#syntax" title="Permanent link">&para;</a></h2>
+<h3 id="_1">@<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3>
+<p>The <strong>@</strong> symbol is used to declare that the following name is a reference. The
+CLI will take care to parse the name and treat it as a Content type to which the
+current type refers.</p>
+<h3 id="_2">[]<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3>
+<p>The <code>[]</code>, which if used, is always in front of the <strong>@</strong> symbol. It signifies
+that the reference type is a slice or a collection of references. When <code>[]</code>
+is used, the CLI will automatically generate a <code>reference.SelectRepeater()</code> view
+for you.</p>
+<h3 id="arg1arg2argn">,arg1,arg2,argN<a class="headerlink" href="#arg1arg2argn" title="Permanent link">&para;</a></h3>
+<p>Immediately following the reference name (after the @ symbol), users may optionally
+pass arguments to specify how the reference is displayed in the parent type's
+editor. References are included in the parent types editor as a dropdown menu, with
+each possible reference as an option. These arguments define what goes inside the
+<code>&lt;option&gt;&lt;/option&gt;</code> text node, as would be seen by an Admin.</p>
+<p>The arguments must be valid JSON struct tag names from the reference type's fields.
+Notice in the example below, the <code>title</code> and <code>price</code> are formatted exactly as they
+were in the generate command for the <code>product</code> type.</p>
+<hr />
+<h3 id="_3"><a class="headerlink" href="#_3" title="Permanent link">&para;</a></h3>
+<h5 id="example">Example<a class="headerlink" href="#example" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span>$ ponzu gen content product title:string price:int description:string:textarea
+$ ponzu gen content catalog year:int products:<span class="s2">&quot;[]@product&quot;</span>,title,price
+</pre></div>
+
+
+<p>The commands above output the following. For demonstration, we will omit the full
+code generated for the <code>Product</code>, since the reference is in the <code>Catalog</code> type.</p>
+<div class="codehilite"><pre><span></span><span class="c1">// content/product.go</span>
+<span class="kn">package</span> <span class="nx">content</span>
+<span class="o">...</span>
+
+<span class="kd">type</span> <span class="nx">Product</span> <span class="kd">struct</span> <span class="p">{</span>
+ <span class="nx">item</span><span class="p">.</span><span class="nx">Item</span>
+
+ <span class="nx">Title</span> <span class="kt">string</span> <span class="s">`json:&quot;title&quot;`</span>
+ <span class="nx">Price</span> <span class="kt">int</span> <span class="s">`json:&quot;price&quot;`</span>
+ <span class="nx">Description</span> <span class="kt">string</span> <span class="s">`json:&quot;description&quot;`</span>
+<span class="p">}</span>
+
+<span class="o">...</span>
+</pre></div>
+
+
+<div class="codehilite"><pre><span></span><span class="kn">package</span> <span class="nx">content</span>
+
+<span class="kn">import</span> <span class="p">(</span>
+ <span class="s">&quot;fmt&quot;</span>
+
+ <span class="s">&quot;github.com/bosssauce/reference&quot;</span>
+
+ <span class="s">&quot;github.com/ponzu-cms/ponzu/management/editor&quot;</span>
+ <span class="s">&quot;github.com/ponzu-cms/ponzu/system/item&quot;</span>
+<span class="p">)</span>
+
+<span class="kd">type</span> <span class="nx">Catalog</span> <span class="kd">struct</span> <span class="p">{</span>
+ <span class="nx">item</span><span class="p">.</span><span class="nx">Item</span>
+
+ <span class="nx">Year</span> <span class="kt">int</span> <span class="s">`json:&quot;year&quot;`</span>
+ <span class="c1">// all references are stored as []string or string types</span>
+ <span class="nx">Products</span> <span class="p">[]</span><span class="kt">string</span> <span class="s">`json:&quot;products&quot;`</span>
+<span class="p">}</span>
+
+<span class="kd">func</span> <span class="p">(</span><span class="nx">c</span> <span class="o">*</span><span class="nx">Catalog</span><span class="p">)</span> <span class="nx">MarshalEditor</span><span class="p">()</span> <span class="p">([]</span><span class="kt">byte</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
+ <span class="nx">view</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">Form</span><span class="p">(</span><span class="nx">c</span><span class="p">,</span>
+ <span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">Input</span><span class="p">(</span><span class="s">&quot;Year&quot;</span><span class="p">,</span> <span class="nx">c</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Year&quot;</span><span class="p">,</span>
+ <span class="s">&quot;type&quot;</span><span class="p">:</span> <span class="s">&quot;text&quot;</span><span class="p">,</span>
+ <span class="s">&quot;placeholder&quot;</span><span class="p">:</span> <span class="s">&quot;Enter the Year here&quot;</span><span class="p">,</span>
+ <span class="p">}),</span>
+ <span class="p">},</span>
+ <span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="c1">// reference.SelectRepeater since []@product was used</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">reference</span><span class="p">.</span><span class="nx">SelectRepeater</span><span class="p">(</span><span class="s">&quot;Products&quot;</span><span class="p">,</span> <span class="nx">c</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Products&quot;</span><span class="p">,</span>
+ <span class="p">},</span>
+ <span class="s">&quot;Product&quot;</span><span class="p">,</span> <span class="c1">// generated from @product</span>
+ <span class="s">`{{ .title }} {{ .price }} `</span><span class="p">,</span> <span class="c1">// generated from ,title,price args</span>
+ <span class="p">),</span>
+ <span class="p">},</span>
+ <span class="p">)</span>
+
+ <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Errorf</span><span class="p">(</span><span class="s">&quot;Failed to render Catalog editor view: %s&quot;</span><span class="p">,</span> <span class="nx">err</span><span class="p">.</span><span class="nx">Error</span><span class="p">())</span>
+ <span class="p">}</span>
+
+ <span class="k">return</span> <span class="nx">view</span><span class="p">,</span> <span class="kc">nil</span>
+<span class="p">}</span>
+
+<span class="kd">func</span> <span class="nx">init</span><span class="p">()</span> <span class="p">{</span>
+ <span class="nx">item</span><span class="p">.</span><span class="nx">Types</span><span class="p">[</span><span class="s">&quot;Catalog&quot;</span><span class="p">]</span> <span class="p">=</span> <span class="kd">func</span><span class="p">()</span> <span class="kd">interface</span><span class="p">{}</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">new</span><span class="p">(</span><span class="nx">Catalog</span><span class="p">)</span> <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p><strong>Note:</strong>
+If the reference should be only a single item, rather than a slice (or collection)
+of items, omit the <code>[]</code>, changing the command to:</p>
+<div class="codehilite"><pre><span></span>$ ponzu gen content catalog year:int product:@product,title,price
+</pre></div>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../General-Usage/" title="General Usage" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ General Usage
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ An Overview
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/CNAME b/docs/build/CNAME
new file mode 100644
index 0000000..119323f
--- /dev/null
+++ b/docs/build/CNAME
@@ -0,0 +1 @@
+docs.ponzu-cms.org
diff --git a/docs/build/Content/An-Overview/index.html b/docs/build/Content/An-Overview/index.html
new file mode 100644
index 0000000..19c8117
--- /dev/null
+++ b/docs/build/Content/An-Overview/index.html
@@ -0,0 +1,969 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>Content Overview</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ Content
+ </span>
+
+
+ An Overview
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3" checked>
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ An Overview
+ </label>
+
+ <a href="./" title="An Overview" class="md-nav__link md-nav__link--active">
+ An Overview
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#generating-content-types" title="Generating Content types" class="md-nav__link">
+ Generating Content types
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#related-packages" title="Related packages" class="md-nav__link">
+ Related packages
+ </a>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#generating-content-types" title="Generating Content types" class="md-nav__link">
+ Generating Content types
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#related-packages" title="Related packages" class="md-nav__link">
+ Related packages
+ </a>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>An Overview</h1>
+
+ <p>Nearly everything you work on in Ponzu is inside content files on the content types you create. These types must all reside in the <code>content</code> package and are the fundamental core of your CMS. In order for Content types to be rendered and managed by the CMS, they must implement the <code>editor.Editable</code> interface, and add their own <code>interface{}</code> container to the global <code>item.Types</code> map. </p>
+<p>Sound like a lot? Don't worry, all of this can be done for you by using the code-generating command line tools that come with Ponzu.</p>
+<p>It is rare to hand-write a new Content type, and should be generated instead!</p>
+<h3 id="generating-content-types">Generating Content types<a class="headerlink" href="#generating-content-types" title="Permanent link">&para;</a></h3>
+<p>To generate content types and boilerplate code, use the Ponzu CLI <code>generate</code> command as such:</p>
+<div class="codehilite"><pre><span></span>$ ponzu generate content post title:string body:string:richtext author:string
+</pre></div>
+
+
+<p>The command above will create a file at <code>content/post.go</code> and will generate the following code:</p>
+<div class="codehilite"><pre><span></span><span class="kn">package</span> <span class="nx">content</span>
+
+<span class="kn">import</span> <span class="p">(</span>
+ <span class="s">&quot;fmt&quot;</span>
+
+ <span class="s">&quot;github.com/ponzu-cms/ponzu/management/editor&quot;</span>
+ <span class="s">&quot;github.com/ponzu-cms/ponzu/system/item&quot;</span>
+<span class="p">)</span>
+
+<span class="kd">type</span> <span class="nx">Post</span> <span class="kd">struct</span> <span class="p">{</span>
+ <span class="nx">item</span><span class="p">.</span><span class="nx">Item</span>
+
+ <span class="nx">Title</span> <span class="kt">string</span> <span class="s">`json:&quot;title&quot;`</span>
+ <span class="nx">Body</span> <span class="kt">string</span> <span class="s">`json:&quot;body&quot;`</span>
+ <span class="nx">Author</span> <span class="kt">string</span> <span class="s">`json:&quot;author&quot;`</span>
+<span class="p">}</span>
+
+<span class="c1">// MarshalEditor writes a buffer of html to edit a Post within the CMS</span>
+<span class="c1">// and implements editor.Editable</span>
+<span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">MarshalEditor</span><span class="p">()</span> <span class="p">([]</span><span class="kt">byte</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
+ <span class="nx">view</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">Form</span><span class="p">(</span><span class="nx">p</span><span class="p">,</span>
+ <span class="c1">// Take note that the first argument to these Input-like functions</span>
+ <span class="c1">// is the string version of each Post field, and must follow</span>
+ <span class="c1">// this pattern for auto-decoding and auto-encoding reasons:</span>
+ <span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">Input</span><span class="p">(</span><span class="s">&quot;Title&quot;</span><span class="p">,</span> <span class="nx">p</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Title&quot;</span><span class="p">,</span>
+ <span class="s">&quot;type&quot;</span><span class="p">:</span> <span class="s">&quot;text&quot;</span><span class="p">,</span>
+ <span class="s">&quot;placeholder&quot;</span><span class="p">:</span> <span class="s">&quot;Enter the Title here&quot;</span><span class="p">,</span>
+ <span class="p">}),</span>
+ <span class="p">},</span>
+ <span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">Richtext</span><span class="p">(</span><span class="s">&quot;Body&quot;</span><span class="p">,</span> <span class="nx">p</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Body&quot;</span><span class="p">,</span>
+ <span class="s">&quot;placeholder&quot;</span><span class="p">:</span> <span class="s">&quot;Enter the Body here&quot;</span><span class="p">,</span>
+ <span class="p">}),</span>
+ <span class="p">},</span>
+ <span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">Input</span><span class="p">(</span><span class="s">&quot;Author&quot;</span><span class="p">,</span> <span class="nx">p</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Author&quot;</span><span class="p">,</span>
+ <span class="s">&quot;type&quot;</span><span class="p">:</span> <span class="s">&quot;text&quot;</span><span class="p">,</span>
+ <span class="s">&quot;placeholder&quot;</span><span class="p">:</span> <span class="s">&quot;Enter the Author here&quot;</span><span class="p">,</span>
+ <span class="p">}),</span>
+ <span class="p">},</span>
+ <span class="p">)</span>
+
+ <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Errorf</span><span class="p">(</span><span class="s">&quot;Failed to render Post editor view: %s&quot;</span><span class="p">,</span> <span class="nx">err</span><span class="p">.</span><span class="nx">Error</span><span class="p">())</span>
+ <span class="p">}</span>
+
+ <span class="k">return</span> <span class="nx">view</span><span class="p">,</span> <span class="kc">nil</span>
+<span class="p">}</span>
+
+<span class="kd">func</span> <span class="nx">init</span><span class="p">()</span> <span class="p">{</span>
+ <span class="nx">item</span><span class="p">.</span><span class="nx">Types</span><span class="p">[</span><span class="s">&quot;Post&quot;</span><span class="p">]</span> <span class="p">=</span> <span class="kd">func</span><span class="p">()</span> <span class="kd">interface</span><span class="p">{}</span> <span class="p">{</span> <span class="k">return</span> <span class="nb">new</span><span class="p">(</span><span class="nx">Post</span><span class="p">)</span> <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>The code above is the baseline amount required to manage content for the <code>Post</code> type from within the CMS. See <a href="../../Content/Extending-Content">Extending Content</a> for information about how to add more functionality to your Content types. </p>
+<p>All content managed by the CMS and exposed via the API is considered an "item", and thus should embed the <code>item.Item</code> type. There are many benefits to this, such as becoming automatically sortable by time, and being given default methods that are useful inside and out of the CMS. All content types that are created by the <code>generate</code> command via Ponzu CLI will embed Item. </p>
+<h3 id="related-packages">Related packages<a class="headerlink" href="#related-packages" title="Permanent link">&para;</a></h3>
+<p>The <code>item</code> package has a number of useful interfaces, which make it simple to add functionality to all content types and other types that embed Item. </p>
+<p>The <code>editor</code> package has the Editable interface, which allows types to create an editor for their fields within the CMS. Additionally, there is a helper function <code>editor.Form</code> which simplifies defining the editor's input layout and input types using <code>editor.Input</code> and various other functions to make HTML input elements like Select, Checkbox, Richtext, Textarea and more.</p>
+<p>The <code>api</code> package has interfaces including <code>api.Createable</code> and <code>api.Mergeable</code> which make it trivial to accept and approve or reject content submitted from 3rd parties (POST from HTML forms, mobile clients, etc).</p>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ Generating References
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../Extending-Content/" title="Extending Content" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ Extending Content
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/Content/Extending-Content/index.html b/docs/build/Content/Extending-Content/index.html
new file mode 100644
index 0000000..fc63245
--- /dev/null
+++ b/docs/build/Content/Extending-Content/index.html
@@ -0,0 +1,959 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>Extending Content through built-in Interfaces and optional Addons</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ Content
+ </span>
+
+
+ Extending Content
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3" checked>
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ Extending Content
+ </label>
+
+ <a href="./" title="Extending Content" class="md-nav__link md-nav__link--active">
+ Extending Content
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#item-interfaces" title="Item Interfaces" class="md-nav__link">
+ Item Interfaces
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#api-interfaces" title="API Interfaces" class="md-nav__link">
+ API Interfaces
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editor-interfaces" title="Editor Interfaces" class="md-nav__link">
+ Editor Interfaces
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#search-interfaces" title="Search Interfaces" class="md-nav__link">
+ Search Interfaces
+ </a>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#item-interfaces" title="Item Interfaces" class="md-nav__link">
+ Item Interfaces
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#api-interfaces" title="API Interfaces" class="md-nav__link">
+ API Interfaces
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editor-interfaces" title="Editor Interfaces" class="md-nav__link">
+ Editor Interfaces
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#search-interfaces" title="Search Interfaces" class="md-nav__link">
+ Search Interfaces
+ </a>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>Extending Content</h1>
+
+ <p>Extending your Content types with more features and functionality within the system
+is done by implementing the various built-in interfaces provided by Ponzu. To learn
+more about interfaces, see <a href="https://tour.golang.org/methods/10">A Tour of Go - Interfaces</a>.</p>
+<p>It is also common to add more advanced functionality to Content types using Addons. Refer to the <a href="../../Ponzu-Addons">Addon documentation</a> for more information about how to use and create Ponzu Addons.</p>
+<h2 id="item-interfaces"><a href="../../Interfaces/Item">Item Interfaces</a><a class="headerlink" href="#item-interfaces" title="Permanent link">&para;</a></h2>
+<p>All Content types which embed an <code>item.Item</code> will implicitly <a href="#">implement</a> its many
+interfaces. In Ponzu, the following interfaces are exported from the <code>system/item</code>
+package and have a default implementation which can be overridden to change your
+content types' functionality within the system.</p>
+<ul>
+<li><a href="../../Interfaces/Item#itempushable"><code>item.Pushable</code></a></li>
+<li><a href="../../Interfaces/Item#itemhideable"><code>item.Hideable</code></a></li>
+<li><a href="../../Interfaces/Item#itemomittable"><code>item.Omittable</code></a></li>
+<li><a href="../../Interfaces/Item#itemhookable"><code>item.Hookable</code></a></li>
+<li><a href="../../Interfaces/Item#itemidentifiable"><code>item.Identifiable</code></a></li>
+<li><a href="../../Interfaces/Item#itemsortable"><code>item.Sortable</code></a></li>
+<li><a href="../../Interfaces/Item#itemsluggable"><code>item.Sluggable</code></a></li>
+</ul>
+<h2 id="api-interfaces"><a href="../../Interfaces/API">API Interfaces</a><a class="headerlink" href="#api-interfaces" title="Permanent link">&para;</a></h2>
+<p>To enable 3rd-party clients to interact with your Content types, you can extend your types with the API interfaces:</p>
+<ul>
+<li><a href="../../Interfaces/API/#apicreateable"><code>api.Createable</code></a></li>
+<li><a href="../../Interfaces/API/#apiupdateable"><code>api.Updateable</code></a></li>
+<li><a href="../../Interfaces/API/#apideleteable"><code>api.Deleteable</code></a></li>
+<li><a href="../../Interfaces/API/#apitrustable"><code>api.Trustable</code></a></li>
+</ul>
+<h2 id="editor-interfaces"><a href="../../Interfaces/Editor">Editor Interfaces</a><a class="headerlink" href="#editor-interfaces" title="Permanent link">&para;</a></h2>
+<p>To manage how content is edited and handled in the CMS, use the following Editor interfaces:</p>
+<ul>
+<li><a href="../../Interfaces/Editor/#editoreditable"><code>editor.Editable</code></a></li>
+<li><a href="../../Interfaces/Editor/#editormergeable"><code>editor.Mergeable</code></a></li>
+</ul>
+<h2 id="search-interfaces"><a href="../../Interfaces/Search">Search Interfaces</a><a class="headerlink" href="#search-interfaces" title="Permanent link">&para;</a></h2>
+<p>To enable and customize full-text search on your content types, use the following interfaces:</p>
+<ul>
+<li><a href="../../Interfaces/Search/#searchsearchable"><code>search.Searchable</code></a></li>
+</ul>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../An-Overview/" title="An Overview" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ An Overview
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ HTML Inputs
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/Form-Fields/HTML-Inputs/index.html b/docs/build/Form-Fields/HTML-Inputs/index.html
new file mode 100644
index 0000000..ed74b06
--- /dev/null
+++ b/docs/build/Form-Fields/HTML-Inputs/index.html
@@ -0,0 +1,2083 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>HTML Input Elements for Ponzu Editor Forms</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ Form Fields
+ </span>
+
+
+ HTML Inputs
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4" checked>
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ HTML Inputs
+ </label>
+
+ <a href="./" title="HTML Inputs" class="md-nav__link md-nav__link--active">
+ HTML Inputs
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#field-input-functions" title="Field Input Functions" class="md-nav__link">
+ Field Input Functions
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#editorinput" title="editor.Input" class="md-nav__link">
+ editor.Input
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editorinputrepeater" title="editor.InputRepeater" class="md-nav__link">
+ editor.InputRepeater
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_1" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_1" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_1" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editorcheckbox" title="editor.Checkbox" class="md-nav__link">
+ editor.Checkbox
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_2" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_2" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_2" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editorrichtext" title="editor.Richtext" class="md-nav__link">
+ editor.Richtext
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_3" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_3" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_3" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editortags" title="editor.Tags" class="md-nav__link">
+ editor.Tags
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_4" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_4" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_4" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editorfile" title="editor.File" class="md-nav__link">
+ editor.File
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_5" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_5" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_5" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editorfilerepeater" title="editor.FileRepeater" class="md-nav__link">
+ editor.FileRepeater
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_6" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_6" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_6" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editorselect" title="editor.Select" class="md-nav__link">
+ editor.Select
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_7" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_7" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_7" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editorselectrepeater" title="editor.SelectRepeater" class="md-nav__link">
+ editor.SelectRepeater
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_8" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_8" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_8" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editortextarea" title="editor.Textarea" class="md-nav__link">
+ editor.Textarea
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_9" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_9" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_9" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#data-references" title="Data References" class="md-nav__link">
+ Data References
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#referenceselect" title="reference.Select" class="md-nav__link">
+ reference.Select
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_10" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_10" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_10" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#referenceselectrepeater" title="reference.SelectRepeater" class="md-nav__link">
+ reference.SelectRepeater
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_11" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_11" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_11" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#field-input-functions" title="Field Input Functions" class="md-nav__link">
+ Field Input Functions
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#editorinput" title="editor.Input" class="md-nav__link">
+ editor.Input
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editorinputrepeater" title="editor.InputRepeater" class="md-nav__link">
+ editor.InputRepeater
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_1" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_1" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_1" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editorcheckbox" title="editor.Checkbox" class="md-nav__link">
+ editor.Checkbox
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_2" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_2" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_2" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editorrichtext" title="editor.Richtext" class="md-nav__link">
+ editor.Richtext
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_3" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_3" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_3" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editortags" title="editor.Tags" class="md-nav__link">
+ editor.Tags
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_4" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_4" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_4" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editorfile" title="editor.File" class="md-nav__link">
+ editor.File
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_5" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_5" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_5" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editorfilerepeater" title="editor.FileRepeater" class="md-nav__link">
+ editor.FileRepeater
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_6" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_6" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_6" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editorselect" title="editor.Select" class="md-nav__link">
+ editor.Select
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_7" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_7" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_7" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editorselectrepeater" title="editor.SelectRepeater" class="md-nav__link">
+ editor.SelectRepeater
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_8" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_8" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_8" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editortextarea" title="editor.Textarea" class="md-nav__link">
+ editor.Textarea
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_9" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_9" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_9" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#data-references" title="Data References" class="md-nav__link">
+ Data References
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#referenceselect" title="reference.Select" class="md-nav__link">
+ reference.Select
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_10" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_10" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_10" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#referenceselectrepeater" title="reference.SelectRepeater" class="md-nav__link">
+ reference.SelectRepeater
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#screenshot_11" title="Screenshot" class="md-nav__link">
+ Screenshot
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#function-signature_11" title="Function Signature" class="md-nav__link">
+ Function Signature
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example_11" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>HTML Inputs</h1>
+
+ <p>Ponzu provides a number of helpful HTML Inputs to create forms which CMS admins
+use to manage content. The input functions are typically used inside a Content
+type's <code>MarshalEditor()</code> func from within an <code>editor.Form()</code> - for example:</p>
+<div class="codehilite"><pre><span></span><span class="c1">// MarshalEditor writes a buffer of html to edit a Post within the CMS</span>
+<span class="c1">// and implements editor.Editable</span>
+<span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">MarshalEditor</span><span class="p">()</span> <span class="p">([]</span><span class="kt">byte</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
+ <span class="nx">view</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">Form</span><span class="p">(</span><span class="nx">p</span><span class="p">,</span>
+ <span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span> <span class="c1">// &lt;- editor.Fields contain input-like funcs</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">Input</span><span class="p">(</span><span class="s">&quot;Title&quot;</span><span class="p">,</span> <span class="nx">p</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span> <span class="c1">// &lt;- makes a text input</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Title&quot;</span><span class="p">,</span>
+ <span class="s">&quot;type&quot;</span><span class="p">:</span> <span class="s">&quot;text&quot;</span><span class="p">,</span>
+ <span class="s">&quot;placeholder&quot;</span><span class="p">:</span> <span class="s">&quot;Enter the Title here&quot;</span><span class="p">,</span>
+ <span class="p">}),</span>
+ <span class="p">},</span>
+ <span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">Richtext</span><span class="p">(</span><span class="s">&quot;Body&quot;</span><span class="p">,</span> <span class="nx">p</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span> <span class="c1">// &lt;- makes a WYSIWIG editor</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Body&quot;</span><span class="p">,</span>
+ <span class="s">&quot;placeholder&quot;</span><span class="p">:</span> <span class="s">&quot;Enter the Body here&quot;</span><span class="p">,</span>
+ <span class="p">}),</span>
+ <span class="p">},</span>
+ <span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">Input</span><span class="p">(</span><span class="s">&quot;Author&quot;</span><span class="p">,</span> <span class="nx">p</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Author&quot;</span><span class="p">,</span>
+ <span class="s">&quot;type&quot;</span><span class="p">:</span> <span class="s">&quot;text&quot;</span><span class="p">,</span>
+ <span class="s">&quot;placeholder&quot;</span><span class="p">:</span> <span class="s">&quot;Enter the Author here&quot;</span><span class="p">,</span>
+ <span class="p">}),</span>
+ <span class="p">},</span>
+ <span class="p">)</span>
+
+ <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Errorf</span><span class="p">(</span><span class="s">&quot;Failed to render Post editor view: %s&quot;</span><span class="p">,</span> <span class="nx">err</span><span class="p">.</span><span class="nx">Error</span><span class="p">())</span>
+ <span class="p">}</span>
+
+ <span class="k">return</span> <span class="nx">view</span><span class="p">,</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<hr />
+<h2 id="field-input-functions">Field Input Functions<a class="headerlink" href="#field-input-functions" title="Permanent link">&para;</a></h2>
+<p>There are many of these input-like HTML view funcs exported from Ponzu's
+<code>management/editor</code> package. Below is a list of the built-in options:</p>
+<h3 id="editorinput"><code>editor.Input</code><a class="headerlink" href="#editorinput" title="Permanent link">&para;</a></h3>
+<p>The <code>editor.Input</code> function produces a standard text input.</p>
+<h5 id="screenshot">Screenshot<a class="headerlink" href="#screenshot" title="Permanent link">&para;</a></h5>
+<p><img alt="HTML Input" src="../../images/editor-input.png" /></p>
+<h5 id="function-signature">Function Signature<a class="headerlink" href="#function-signature" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="nx">Input</span><span class="p">(</span><span class="nx">fieldName</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">p</span> <span class="kd">interface</span><span class="p">{},</span> <span class="nx">attrs</span><span class="p">,</span> <span class="nx">options</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">)</span> <span class="p">[]</span><span class="kt">byte</span>
+</pre></div>
+
+
+<h5 id="example">Example<a class="headerlink" href="#example" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="o">...</span>
+<span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">Input</span><span class="p">(</span><span class="s">&quot;Title&quot;</span><span class="p">,</span> <span class="nx">s</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Title&quot;</span><span class="p">,</span>
+ <span class="s">&quot;type&quot;</span><span class="p">:</span> <span class="s">&quot;text&quot;</span><span class="p">,</span>
+ <span class="s">&quot;placeholder&quot;</span><span class="p">:</span> <span class="s">&quot;Enter the Title here&quot;</span><span class="p">,</span>
+ <span class="p">}),</span>
+<span class="p">},</span>
+<span class="o">...</span>
+</pre></div>
+
+
+<hr />
+<h3 id="editorinputrepeater"><code>editor.InputRepeater</code><a class="headerlink" href="#editorinputrepeater" title="Permanent link">&para;</a></h3>
+<p>The <code>editor.InputRepeater</code> function applies a controller UI to the <code>editor.Input</code>
+view so any arbitrary number of inputs can be added for your field.</p>
+<div class="admonition warning">
+<p class="admonition-title">Using Repeaters</p>
+<p>When using the <code>editor.InputRepeater</code> make sure it's corresponding field is a <strong>slice <code>[]T</code></strong>
+type. You will experience errors if it is not.</p>
+</div>
+<h5 id="screenshot_1">Screenshot<a class="headerlink" href="#screenshot_1" title="Permanent link">&para;</a></h5>
+<p><img alt="HTML Input" src="../../images/editor-input-repeater.png" /></p>
+<h5 id="function-signature_1">Function Signature<a class="headerlink" href="#function-signature_1" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="nx">InputRepeater</span><span class="p">(</span><span class="nx">fieldName</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">p</span> <span class="kd">interface</span><span class="p">{},</span> <span class="nx">attrs</span><span class="p">,</span> <span class="nx">options</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">)</span> <span class="p">[]</span><span class="kt">byte</span>
+</pre></div>
+
+
+<h5 id="example_1">Example<a class="headerlink" href="#example_1" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="o">...</span>
+<span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">InputRepeater</span><span class="p">(</span><span class="s">&quot;Title&quot;</span><span class="p">,</span> <span class="nx">s</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Titles&quot;</span><span class="p">,</span>
+ <span class="s">&quot;type&quot;</span><span class="p">:</span> <span class="s">&quot;text&quot;</span><span class="p">,</span>
+ <span class="s">&quot;placeholder&quot;</span><span class="p">:</span> <span class="s">&quot;Enter the Title here&quot;</span><span class="p">,</span>
+ <span class="p">}),</span>
+<span class="p">},</span>
+<span class="o">...</span>
+</pre></div>
+
+
+<hr />
+<h3 id="editorcheckbox"><code>editor.Checkbox</code><a class="headerlink" href="#editorcheckbox" title="Permanent link">&para;</a></h3>
+<p>The <code>editor.Checkbox</code> function returns any number of checkboxes in a collection,
+defined by the value:name map of options.</p>
+<h5 id="screenshot_2">Screenshot<a class="headerlink" href="#screenshot_2" title="Permanent link">&para;</a></h5>
+<p><img alt="HTML Checkbox" src="../../images/editor-checkbox.png" /></p>
+<h5 id="function-signature_2">Function Signature<a class="headerlink" href="#function-signature_2" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="nx">Checkbox</span><span class="p">(</span><span class="nx">fieldName</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">p</span> <span class="kd">interface</span><span class="p">{},</span> <span class="nx">attrs</span><span class="p">,</span> <span class="nx">options</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">)</span> <span class="p">[]</span><span class="kt">byte</span>
+</pre></div>
+
+
+<h5 id="example_2">Example<a class="headerlink" href="#example_2" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="o">...</span>
+<span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">Checkbox</span><span class="p">(</span><span class="s">&quot;Options&quot;</span><span class="p">,</span> <span class="nx">s</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Options&quot;</span><span class="p">,</span>
+ <span class="p">},</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="c1">// &quot;value&quot;: &quot;Display Name&quot;,</span>
+ <span class="s">&quot;1&quot;</span><span class="p">:</span> <span class="s">&quot;First&quot;</span><span class="p">,</span>
+ <span class="s">&quot;2&quot;</span><span class="p">:</span> <span class="s">&quot;Second&quot;</span><span class="p">,</span>
+ <span class="s">&quot;3&quot;</span><span class="p">:</span> <span class="s">&quot;Third&quot;</span><span class="p">,</span>
+ <span class="p">}),</span>
+<span class="p">},</span>
+<span class="o">...</span>
+</pre></div>
+
+
+<hr />
+<h3 id="editorrichtext"><code>editor.Richtext</code><a class="headerlink" href="#editorrichtext" title="Permanent link">&para;</a></h3>
+<p>The <code>editor.Richetext</code> function displays an HTML5 rich text / WYSYWIG editor which
+supports text formatting and styling, images, quotes, arbitrary HTML, and more. </p>
+<p>The rich text editor is a modified version of <a href="http://summernote.org/">Summernote</a>
+using a theme called <a href="https://github.com/Cerealkillerway/materialNote">MaterialNote</a></p>
+<h5 id="screenshot_3">Screenshot<a class="headerlink" href="#screenshot_3" title="Permanent link">&para;</a></h5>
+<p><img alt="HTML Richtext Input" src="../../images/editor-richtext.png" /></p>
+<h5 id="function-signature_3">Function Signature<a class="headerlink" href="#function-signature_3" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="nx">Richtext</span><span class="p">(</span><span class="nx">fieldName</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">p</span> <span class="kd">interface</span><span class="p">{},</span> <span class="nx">attrs</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">)</span> <span class="p">[]</span><span class="kt">byte</span>
+</pre></div>
+
+
+<h5 id="example_3">Example<a class="headerlink" href="#example_3" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="o">...</span>
+<span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">Richtext</span><span class="p">(</span><span class="s">&quot;Opinion&quot;</span><span class="p">,</span> <span class="nx">s</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Rich Text Editor&quot;</span><span class="p">,</span>
+ <span class="s">&quot;placeholder&quot;</span><span class="p">:</span> <span class="s">&quot;Enter the Opinion here&quot;</span><span class="p">,</span>
+ <span class="p">}),</span>
+<span class="p">},</span>
+<span class="o">...</span>
+</pre></div>
+
+
+<hr />
+<h3 id="editortags"><code>editor.Tags</code><a class="headerlink" href="#editortags" title="Permanent link">&para;</a></h3>
+<p>The <code>editor.Tags</code> function returns a container input element for lists of arbitrary
+bits of information.</p>
+<h5 id="screenshot_4">Screenshot<a class="headerlink" href="#screenshot_4" title="Permanent link">&para;</a></h5>
+<p><img alt="HTML Tags Input" src="../../images/editor-tags.png" /></p>
+<h5 id="function-signature_4">Function Signature<a class="headerlink" href="#function-signature_4" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="nx">Tags</span><span class="p">(</span><span class="nx">fieldName</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">p</span> <span class="kd">interface</span><span class="p">{},</span> <span class="nx">attrs</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">)</span> <span class="p">[]</span><span class="kt">byte</span>
+</pre></div>
+
+
+<h5 id="example_4">Example<a class="headerlink" href="#example_4" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="o">...</span>
+<span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">Tags</span><span class="p">(</span><span class="s">&quot;Category&quot;</span><span class="p">,</span> <span class="nx">s</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Tags&quot;</span><span class="p">,</span>
+ <span class="s">&quot;placeholder&quot;</span><span class="p">:</span> <span class="s">&quot;+Category&quot;</span><span class="p">,</span>
+ <span class="p">}),</span>
+<span class="p">},</span>
+<span class="o">...</span>
+</pre></div>
+
+
+<hr />
+<h3 id="editorfile"><code>editor.File</code><a class="headerlink" href="#editorfile" title="Permanent link">&para;</a></h3>
+<p>The <code>editor.File</code> function returns an HTML file upload element, which saves files
+into the <code>/uploads</code> directory, and can be viewed from the "Uploads" section in the
+Admin dashboard. See also the <a href="../../HTTP-APIs/File-Metadata/">File Metadata API</a>.</p>
+<div class="admonition warning">
+<p class="admonition-title">Field Type</p>
+<p>When using the <code>editor.File</code> function, its corresponding field type must be
+a <strong><code>string</code></strong>, as files will be stored as URL paths in the database. </p>
+</div>
+<h5 id="screenshot_5">Screenshot<a class="headerlink" href="#screenshot_5" title="Permanent link">&para;</a></h5>
+<p><img alt="HTML File Input" src="../../images/editor-file.png" /></p>
+<h5 id="function-signature_5">Function Signature<a class="headerlink" href="#function-signature_5" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="nx">File</span><span class="p">(</span><span class="nx">fieldName</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">p</span> <span class="kd">interface</span><span class="p">{},</span> <span class="nx">attrs</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">)</span> <span class="p">[]</span><span class="kt">byte</span>
+</pre></div>
+
+
+<h5 id="example_5">Example<a class="headerlink" href="#example_5" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="o">...</span>
+<span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">File</span><span class="p">(</span><span class="s">&quot;Photo&quot;</span><span class="p">,</span> <span class="nx">s</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;File Upload&quot;</span><span class="p">,</span>
+ <span class="s">&quot;placeholder&quot;</span><span class="p">:</span> <span class="s">&quot;Upload the Photo here&quot;</span><span class="p">,</span>
+ <span class="p">}),</span>
+<span class="p">},</span>
+<span class="o">...</span>
+</pre></div>
+
+
+<hr />
+<h3 id="editorfilerepeater"><code>editor.FileRepeater</code><a class="headerlink" href="#editorfilerepeater" title="Permanent link">&para;</a></h3>
+<p>The <code>editor.FileRepeater</code> function applies a controller UI to the <code>editor.File</code>
+view so any arbitrary number of uploads can be added for your field.</p>
+<div class="admonition warning">
+<p class="admonition-title">Using Repeaters</p>
+<p>When using the <code>editor.FileRepeater</code> make sure it's corresponding field is a <strong>slice <code>[]string</code></strong>
+type. You will experience errors if it is not.</p>
+</div>
+<h5 id="screenshot_6">Screenshot<a class="headerlink" href="#screenshot_6" title="Permanent link">&para;</a></h5>
+<p><img alt="HTML File Input" src="../../images/editor-file-repeater.png" /></p>
+<h5 id="function-signature_6">Function Signature<a class="headerlink" href="#function-signature_6" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="nx">FileRepeater</span><span class="p">(</span><span class="nx">fieldName</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">p</span> <span class="kd">interface</span><span class="p">{},</span> <span class="nx">attrs</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">)</span> <span class="p">[]</span><span class="kt">byte</span>
+</pre></div>
+
+
+<h5 id="example_6">Example<a class="headerlink" href="#example_6" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="o">...</span>
+<span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">FileRepeater</span><span class="p">(</span><span class="s">&quot;Photo&quot;</span><span class="p">,</span> <span class="nx">s</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;File Upload Repeater&quot;</span><span class="p">,</span>
+ <span class="s">&quot;placeholder&quot;</span><span class="p">:</span> <span class="s">&quot;Upload the Photo here&quot;</span><span class="p">,</span>
+ <span class="p">}),</span>
+<span class="p">},</span>
+<span class="o">...</span>
+</pre></div>
+
+
+<hr />
+<h3 id="editorselect"><code>editor.Select</code><a class="headerlink" href="#editorselect" title="Permanent link">&para;</a></h3>
+<p>The <code>editor.Select</code> function returns a single HTML select input with options
+as defined in the <code>options map[string]string</code> parameter of the function call.</p>
+<h5 id="screenshot_7">Screenshot<a class="headerlink" href="#screenshot_7" title="Permanent link">&para;</a></h5>
+<p><img alt="HTML Select Input" src="../../images/editor-select.png" /></p>
+<h5 id="function-signature_7">Function Signature<a class="headerlink" href="#function-signature_7" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="nx">Select</span><span class="p">(</span><span class="nx">fieldName</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">p</span> <span class="kd">interface</span><span class="p">{},</span> <span class="nx">attrs</span><span class="p">,</span> <span class="nx">options</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">)</span> <span class="p">[]</span><span class="kt">byte</span>
+</pre></div>
+
+
+<h5 id="example_7">Example<a class="headerlink" href="#example_7" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="o">...</span>
+<span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">Select</span><span class="p">(</span><span class="s">&quot;Rating&quot;</span><span class="p">,</span> <span class="nx">s</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Select Dropdown&quot;</span><span class="p">,</span>
+ <span class="p">},</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="c1">// &quot;value&quot;: &quot;Display Name&quot;,</span>
+ <span class="s">&quot;G&quot;</span><span class="p">:</span> <span class="s">&quot;G&quot;</span><span class="p">,</span>
+ <span class="s">&quot;PG&quot;</span><span class="p">:</span> <span class="s">&quot;PG&quot;</span><span class="p">,</span>
+ <span class="s">&quot;PG-13&quot;</span><span class="p">:</span> <span class="s">&quot;PG-13&quot;</span><span class="p">,</span>
+ <span class="s">&quot;R&quot;</span><span class="p">:</span> <span class="s">&quot;R&quot;</span><span class="p">,</span>
+ <span class="p">}),</span>
+<span class="p">},</span>
+<span class="o">...</span>
+</pre></div>
+
+
+<hr />
+<h3 id="editorselectrepeater"><code>editor.SelectRepeater</code><a class="headerlink" href="#editorselectrepeater" title="Permanent link">&para;</a></h3>
+<p>The <code>editor.SelectRepeater</code> function applies a controller UI to the <code>editor.Select</code>
+view so any arbitrary number of dropdowns can be added for your field.</p>
+<h5 id="screenshot_8">Screenshot<a class="headerlink" href="#screenshot_8" title="Permanent link">&para;</a></h5>
+<p><img alt="HTML Select Input" src="../../images/editor-select-repeater.png" /></p>
+<h5 id="function-signature_8">Function Signature<a class="headerlink" href="#function-signature_8" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="nx">SelectRepeater</span><span class="p">(</span><span class="nx">fieldName</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">p</span> <span class="kd">interface</span><span class="p">{},</span> <span class="nx">attrs</span><span class="p">,</span> <span class="nx">options</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">)</span> <span class="p">[]</span><span class="kt">byte</span>
+</pre></div>
+
+
+<h5 id="example_8">Example<a class="headerlink" href="#example_8" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="o">...</span>
+<span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">SelectRepeater</span><span class="p">(</span><span class="s">&quot;Rating&quot;</span><span class="p">,</span> <span class="nx">s</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Select Dropdown Repeater&quot;</span><span class="p">,</span>
+ <span class="p">},</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="c1">// &quot;value&quot;: &quot;Display Name&quot;,</span>
+ <span class="s">&quot;G&quot;</span><span class="p">:</span> <span class="s">&quot;G&quot;</span><span class="p">,</span>
+ <span class="s">&quot;PG&quot;</span><span class="p">:</span> <span class="s">&quot;PG&quot;</span><span class="p">,</span>
+ <span class="s">&quot;PG-13&quot;</span><span class="p">:</span> <span class="s">&quot;PG-13&quot;</span><span class="p">,</span>
+ <span class="s">&quot;R&quot;</span><span class="p">:</span> <span class="s">&quot;R&quot;</span><span class="p">,</span>
+ <span class="p">}),</span>
+<span class="p">},</span>
+<span class="o">...</span>
+</pre></div>
+
+
+<hr />
+<h3 id="editortextarea"><code>editor.Textarea</code><a class="headerlink" href="#editortextarea" title="Permanent link">&para;</a></h3>
+<p>The <code>editor.Textarea</code> function returns an HTML textarea input to add unstyled text
+blocks. Newlines in the textarea are preserved.</p>
+<h5 id="screenshot_9">Screenshot<a class="headerlink" href="#screenshot_9" title="Permanent link">&para;</a></h5>
+<p><img alt="HTML Textarea Input" src="../../images/editor-textarea.png" /></p>
+<h5 id="function-signature_9">Function Signature<a class="headerlink" href="#function-signature_9" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="nx">Textarea</span><span class="p">(</span><span class="nx">fieldName</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">p</span> <span class="kd">interface</span><span class="p">{},</span> <span class="nx">attrs</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">)</span> <span class="p">[]</span><span class="kt">byte</span>
+</pre></div>
+
+
+<h5 id="example_9">Example<a class="headerlink" href="#example_9" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="o">...</span>
+<span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">Textarea</span><span class="p">(</span><span class="s">&quot;Readme&quot;</span><span class="p">,</span> <span class="nx">s</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Textarea&quot;</span><span class="p">,</span>
+ <span class="s">&quot;placeholder&quot;</span><span class="p">:</span> <span class="s">&quot;Enter the Readme here&quot;</span><span class="p">,</span>
+ <span class="p">}),</span>
+<span class="p">},</span>
+<span class="o">...</span>
+</pre></div>
+
+
+<hr />
+<h2 id="data-references">Data References<a class="headerlink" href="#data-references" title="Permanent link">&para;</a></h2>
+<p>It is common to want to keep a reference from one Content type to another. To do
+this in Ponzu, use the <a href="https://github.com/bosssauce/reference"><code>bosssauce/reference</code></a>
+package. It comes pre-installed with Ponzu as an <a href="../../Ponzu-Addons/Using-Addons">"Addon"</a>.</p>
+<h3 id="referenceselect"><code>reference.Select</code><a class="headerlink" href="#referenceselect" title="Permanent link">&para;</a></h3>
+<h5 id="screenshot_10">Screenshot<a class="headerlink" href="#screenshot_10" title="Permanent link">&para;</a></h5>
+<p><img alt="HTML Select Input" src="../../images/editor-select.png" /></p>
+<h5 id="function-signature_10">Function Signature<a class="headerlink" href="#function-signature_10" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="nx">Select</span><span class="p">(</span><span class="nx">fieldName</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">p</span> <span class="kd">interface</span><span class="p">{},</span> <span class="nx">attrs</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">,</span> <span class="nx">contentType</span><span class="p">,</span> <span class="nx">tmplString</span> <span class="kt">string</span><span class="p">)</span> <span class="p">[]</span><span class="kt">byte</span>
+</pre></div>
+
+
+<h5 id="example_10">Example<a class="headerlink" href="#example_10" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="o">...</span>
+<span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">reference</span><span class="p">.</span><span class="nx">Select</span><span class="p">(</span><span class="s">&quot;DirectedBy&quot;</span><span class="p">,</span> <span class="nx">s</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Select Dropdown&quot;</span><span class="p">,</span>
+ <span class="p">},</span> <span class="s">&quot;Director&quot;</span><span class="p">,</span> <span class="s">`{{.last-name}}, {{.first_name}}`</span><span class="p">),</span>
+<span class="p">},</span>
+<span class="o">...</span>
+</pre></div>
+
+
+<hr />
+<h3 id="referenceselectrepeater"><code>reference.SelectRepeater</code><a class="headerlink" href="#referenceselectrepeater" title="Permanent link">&para;</a></h3>
+<h5 id="screenshot_11">Screenshot<a class="headerlink" href="#screenshot_11" title="Permanent link">&para;</a></h5>
+<p><img alt="HTML Select Input" src="../../images/editor-select-repeater.png" /></p>
+<h5 id="function-signature_11">Function Signature<a class="headerlink" href="#function-signature_11" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="nx">SelectRepeater</span><span class="p">(</span><span class="nx">fieldName</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">p</span> <span class="kd">interface</span><span class="p">{},</span> <span class="nx">attrs</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">,</span> <span class="nx">contentType</span><span class="p">,</span> <span class="nx">tmplString</span> <span class="kt">string</span><span class="p">)</span> <span class="p">[]</span><span class="kt">byte</span>
+</pre></div>
+
+
+<h5 id="example_11">Example<a class="headerlink" href="#example_11" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="o">...</span>
+<span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">reference</span><span class="p">.</span><span class="nx">SelectRepeater</span><span class="p">(</span><span class="s">&quot;PlacesFilmed&quot;</span><span class="p">,</span> <span class="nx">s</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Select Dropdown Repeater&quot;</span><span class="p">,</span>
+ <span class="p">},</span> <span class="s">&quot;Location&quot;</span><span class="p">,</span> <span class="s">`{{.name}}, {{.region}}`</span><span class="p">),</span>
+<span class="p">},</span>
+<span class="o">...</span>
+</pre></div>
+
+
+<hr />
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ Extending Content
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ Content
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/HTTP-APIs/Content/index.html b/docs/build/HTTP-APIs/Content/index.html
new file mode 100644
index 0000000..4eb39c5
--- /dev/null
+++ b/docs/build/HTTP-APIs/Content/index.html
@@ -0,0 +1,1405 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>Content HTTP API</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ HTTP APIs
+ </span>
+
+
+ Content
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5" checked>
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ Content
+ </label>
+
+ <a href="./" title="Content" class="md-nav__link md-nav__link--active">
+ Content
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#endpoints" title="Endpoints" class="md-nav__link">
+ Endpoints
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#get-content-by-type" title="Get Content by Type" class="md-nav__link">
+ Get Content by Type
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#sample-response" title="Sample Response" class="md-nav__link">
+ Sample Response
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#get-contents-by-type" title="Get Contents by Type" class="md-nav__link">
+ Get Contents by Type
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#sample-response_1" title="Sample Response" class="md-nav__link">
+ Sample Response
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#get-content-by-slug" title="Get Content by Slug" class="md-nav__link">
+ Get Content by Slug
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#sample-response_2" title="Sample Response" class="md-nav__link">
+ Sample Response
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#new-content" title="New Content" class="md-nav__link">
+ New Content
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#sample-response_3" title="Sample Response" class="md-nav__link">
+ Sample Response
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#update-content" title="Update Content" class="md-nav__link">
+ Update Content
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#sample-response_4" title="Sample Response" class="md-nav__link">
+ Sample Response
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#delete-content" title="Delete Content" class="md-nav__link">
+ Delete Content
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#sample-response_5" title="Sample Response" class="md-nav__link">
+ Sample Response
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#additional-information" title="Additional Information" class="md-nav__link">
+ Additional Information
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#response-headers" title="Response Headers" class="md-nav__link">
+ Response Headers
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#http11" title="HTTP/1.1" class="md-nav__link">
+ HTTP/1.1
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#http2" title="HTTP/2" class="md-nav__link">
+ HTTP/2
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#helpful-links" title="Helpful links" class="md-nav__link">
+ Helpful links
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#endpoints" title="Endpoints" class="md-nav__link">
+ Endpoints
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#get-content-by-type" title="Get Content by Type" class="md-nav__link">
+ Get Content by Type
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#sample-response" title="Sample Response" class="md-nav__link">
+ Sample Response
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#get-contents-by-type" title="Get Contents by Type" class="md-nav__link">
+ Get Contents by Type
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#sample-response_1" title="Sample Response" class="md-nav__link">
+ Sample Response
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#get-content-by-slug" title="Get Content by Slug" class="md-nav__link">
+ Get Content by Slug
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#sample-response_2" title="Sample Response" class="md-nav__link">
+ Sample Response
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#new-content" title="New Content" class="md-nav__link">
+ New Content
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#sample-response_3" title="Sample Response" class="md-nav__link">
+ Sample Response
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#update-content" title="Update Content" class="md-nav__link">
+ Update Content
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#sample-response_4" title="Sample Response" class="md-nav__link">
+ Sample Response
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#delete-content" title="Delete Content" class="md-nav__link">
+ Delete Content
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#sample-response_5" title="Sample Response" class="md-nav__link">
+ Sample Response
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#additional-information" title="Additional Information" class="md-nav__link">
+ Additional Information
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#response-headers" title="Response Headers" class="md-nav__link">
+ Response Headers
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#http11" title="HTTP/1.1" class="md-nav__link">
+ HTTP/1.1
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#http2" title="HTTP/2" class="md-nav__link">
+ HTTP/2
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#helpful-links" title="Helpful links" class="md-nav__link">
+ Helpful links
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>Content</h1>
+
+ <p>Ponzu provides a read &amp; write HTTP API to access and interact with content on a
+system. By default, write access (including create, update and delete) and search
+are disabled. See the section on Ponzu's <a href="../../Interfaces/API">API Interfaces</a> to learn
+more about how to enable these endpoints.</p>
+<hr />
+<h2 id="endpoints">Endpoints<a class="headerlink" href="#endpoints" title="Permanent link">&para;</a></h2>
+<h3 id="get-content-by-type">Get Content by Type<a class="headerlink" href="#get-content-by-type" title="Permanent link">&para;</a></h3>
+<p><kbd>GET</kbd> <code>/api/content?type=&lt;Type&gt;&amp;id=&lt;ID&gt;</code></p>
+<h5 id="sample-response">Sample Response<a class="headerlink" href="#sample-response" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="p">{</span>
+ <span class="s2">&quot;data&quot;</span><span class="o">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="s2">&quot;uuid&quot;</span><span class="o">:</span> <span class="s2">&quot;024a5797-e064-4ee0-abe3-415cb6d3ed18&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;id&quot;</span><span class="o">:</span> <span class="mi">6</span><span class="p">,</span>
+ <span class="s2">&quot;slug&quot;</span><span class="o">:</span> <span class="s2">&quot;item-id-024a5797-e064-4ee0-abe3-415cb6d3ed18&quot;</span> <span class="c1">// customizable</span>
+ <span class="s2">&quot;timestamp&quot;</span><span class="o">:</span> <span class="mi">1493926453826</span><span class="p">,</span> <span class="c1">// milliseconds since Unix epoch</span>
+ <span class="s2">&quot;updated&quot;</span><span class="o">:</span> <span class="mi">1493926453826</span><span class="p">,</span>
+ <span class="c1">// your content data...,</span>
+ <span class="p">}</span>
+ <span class="p">]</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<hr />
+<h3 id="get-contents-by-type">Get Contents by Type<a class="headerlink" href="#get-contents-by-type" title="Permanent link">&para;</a></h3>
+<p><kbd>GET</kbd> <code>/api/contents?type=&lt;Type&gt;</code></p>
+<ul>
+<li>optional params:<ol>
+<li><code>order</code> (string: ASC / DESC, default: DESC)</li>
+<li><code>count</code> (int: -1 - N, default: 10, -1 returns all)</li>
+<li><code>offset</code> (int: 0 - N, default: 0)</li>
+</ol>
+</li>
+</ul>
+<h5 id="sample-response_1">Sample Response<a class="headerlink" href="#sample-response_1" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="p">{</span>
+ <span class="s2">&quot;data&quot;</span><span class="o">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="s2">&quot;uuid&quot;</span><span class="o">:</span> <span class="s2">&quot;024a5797-e064-4ee0-abe3-415cb6d3ed18&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;id&quot;</span><span class="o">:</span> <span class="mi">6</span><span class="p">,</span>
+ <span class="s2">&quot;slug&quot;</span><span class="o">:</span> <span class="s2">&quot;item-id-024a5797-e064-4ee0-abe3-415cb6d3ed18&quot;</span><span class="p">,</span> <span class="c1">// customizable</span>
+ <span class="s2">&quot;timestamp&quot;</span><span class="o">:</span> <span class="mi">1493926453826</span><span class="p">,</span> <span class="c1">// milliseconds since Unix epoch</span>
+ <span class="s2">&quot;updated&quot;</span><span class="o">:</span> <span class="mi">1493926453826</span><span class="p">,</span>
+ <span class="c1">// your content data...,</span>
+ <span class="p">},</span>
+ <span class="p">{</span>
+ <span class="s2">&quot;uuid&quot;</span><span class="o">:</span> <span class="s2">&quot;5a9177c7-634d-4fb1-88a6-ef6c45de797c&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;id&quot;</span><span class="o">:</span> <span class="mi">7</span><span class="p">,</span>
+ <span class="s2">&quot;slug&quot;</span><span class="o">:</span> <span class="s2">&quot;item-id-5a9177c7-634d-4fb1-88a6-ef6c45de797c&quot;</span><span class="p">,</span> <span class="c1">// customizable</span>
+ <span class="s2">&quot;timestamp&quot;</span><span class="o">:</span> <span class="mi">1493926453826</span><span class="p">,</span> <span class="c1">// milliseconds since Unix epoch</span>
+ <span class="s2">&quot;updated&quot;</span><span class="o">:</span> <span class="mi">1493926453826</span><span class="p">,</span>
+ <span class="c1">// your content data...,</span>
+ <span class="p">},</span>
+ <span class="c1">// more objects...</span>
+ <span class="p">]</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<hr />
+<h3 id="get-content-by-slug">Get Content by Slug<a class="headerlink" href="#get-content-by-slug" title="Permanent link">&para;</a></h3>
+<p><kbd>GET</kbd> <code>/api/content?slug=&lt;Slug&gt;</code></p>
+<h5 id="sample-response_2">Sample Response<a class="headerlink" href="#sample-response_2" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="p">{</span>
+ <span class="s2">&quot;data&quot;</span><span class="o">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="s2">&quot;uuid&quot;</span><span class="o">:</span> <span class="s2">&quot;024a5797-e064-4ee0-abe3-415cb6d3ed18&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;id&quot;</span><span class="o">:</span> <span class="mi">6</span><span class="p">,</span>
+ <span class="s2">&quot;slug&quot;</span><span class="o">:</span> <span class="s2">&quot;item-id-024a5797-e064-4ee0-abe3-415cb6d3ed18&quot;</span><span class="p">,</span> <span class="c1">// customizable</span>
+ <span class="s2">&quot;timestamp&quot;</span><span class="o">:</span> <span class="mi">1493926453826</span><span class="p">,</span> <span class="c1">// milliseconds since Unix epoch</span>
+ <span class="s2">&quot;updated&quot;</span><span class="o">:</span> <span class="mi">1493926453826</span><span class="p">,</span>
+ <span class="c1">// your content data...,</span>
+ <span class="p">}</span>
+ <span class="p">]</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<hr />
+<h3 id="new-content">New Content<a class="headerlink" href="#new-content" title="Permanent link">&para;</a></h3>
+<p><kbd>POST</kbd> <code>/api/content/create?type=&lt;Type&gt;</code></p>
+<div class="admonition note">
+<p class="admonition-title">Request Data Encoding</p>
+<p>Request must be <code>multipart/form-data</code> encoded. If not, a <code>400 Bad Request</code>
+Response will be returned.</p>
+</div>
+<h5 id="sample-response_3">Sample Response<a class="headerlink" href="#sample-response_3" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="p">{</span>
+ <span class="s2">&quot;data&quot;</span><span class="o">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="s2">&quot;id&quot;</span><span class="o">:</span> <span class="mi">6</span><span class="p">,</span> <span class="c1">// will be omitted if status is pending</span>
+ <span class="s2">&quot;type&quot;</span><span class="o">:</span> <span class="s2">&quot;Review&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;status&quot;</span><span class="o">:</span> <span class="s2">&quot;public&quot;</span>
+ <span class="p">}</span>
+ <span class="p">]</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<hr />
+<h3 id="update-content">Update Content<a class="headerlink" href="#update-content" title="Permanent link">&para;</a></h3>
+<p><kbd>POST</kbd> <code>/api/content/update?type=&lt;Type&gt;&amp;id=&lt;id&gt;</code></p>
+<div class="admonition note">
+<p class="admonition-title">Request Data Encoding</p>
+<p>Request must be <code>multipart/form-data</code> encoded. If not, a <code>400 Bad Request</code>
+Response will be returned.</p>
+</div>
+<h5 id="sample-response_4">Sample Response<a class="headerlink" href="#sample-response_4" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="p">{</span>
+ <span class="s2">&quot;data&quot;</span><span class="o">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="s2">&quot;id&quot;</span><span class="o">:</span> <span class="mi">6</span><span class="p">,</span>
+ <span class="s2">&quot;type&quot;</span><span class="o">:</span> <span class="s2">&quot;Review&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;status&quot;</span><span class="o">:</span> <span class="s2">&quot;public&quot;</span>
+ <span class="p">}</span>
+ <span class="p">]</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<hr />
+<h3 id="delete-content">Delete Content<a class="headerlink" href="#delete-content" title="Permanent link">&para;</a></h3>
+<p><kbd>POST</kbd> <code>/api/content/delete?type=&lt;Type&gt;&amp;id=&lt;id&gt;</code></p>
+<div class="admonition note">
+<p class="admonition-title">Request Data Encoding</p>
+<p>Request must be <code>multipart/form-data</code> encoded. If not, a <code>400 Bad Request</code>
+Response will be returned.</p>
+</div>
+<h5 id="sample-response_5">Sample Response<a class="headerlink" href="#sample-response_5" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="p">{</span>
+ <span class="s2">&quot;data&quot;</span><span class="o">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="s2">&quot;id&quot;</span><span class="o">:</span> <span class="mi">6</span><span class="p">,</span>
+ <span class="s2">&quot;type&quot;</span><span class="o">:</span> <span class="s2">&quot;Review&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;status&quot;</span><span class="o">:</span> <span class="s2">&quot;deleted&quot;</span>
+ <span class="p">}</span>
+ <span class="p">]</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<hr />
+<h3 id="additional-information">Additional Information<a class="headerlink" href="#additional-information" title="Permanent link">&para;</a></h3>
+<p>All API endpoints are CORS-enabled (can be disabled in configuration at run-time) and API requests are recorded by your system to generate graphs of total requests and unique client requests within the Admin dashboard.</p>
+<h4 id="response-headers">Response Headers<a class="headerlink" href="#response-headers" title="Permanent link">&para;</a></h4>
+<p>The following headers are common across all Ponzu API responses. Some of them can be modified
+in the <a href="../../System-Configuration/Settings">system configuration</a> while your system is running.</p>
+<h5 id="http11">HTTP/1.1<a class="headerlink" href="#http11" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span>HTTP/1.1 200 OK
+Access-Control-Allow-Headers: Accept, Authorization, Content-Type
+Access-Control-Allow-Origin: *
+Cache-Control: max-age=2592000, public
+Content-Encoding: gzip
+Content-Type: application/json
+Etag: MTQ5Mzk0NTYzNQ==
+Vary: Accept-Encoding
+Date: Fri, 05 May 2017 01:15:49 GMT
+Content-Length: 199
+</pre></div>
+
+
+<h5 id="http2">HTTP/2<a class="headerlink" href="#http2" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span>access-control-allow-headers: Accept, Authorization, Content-Type
+access-control-allow-origin: *
+cache-control: max-age=2592000, public
+content-encoding: gzip
+content-length: 199
+content-type: application/json
+date: Fri, 05 May 2017 01:38:11 GMT
+etag: MTQ5Mzk0ODI4MA==
+status: 200
+vary: Accept-Encoding
+</pre></div>
+
+
+<h4 id="helpful-links">Helpful links<a class="headerlink" href="#helpful-links" title="Permanent link">&para;</a></h4>
+<p><a href="https://github.com/natdm/typewriter">Typewriter</a>
+Generate &amp; sync front-end data structures from Ponzu content types. (<a href="https://github.com/natdm/typewriter/blob/master/EXAMPLES.md#example-use-in-a-package-like-ponzu">Ponzu example</a>)</p>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ HTML Inputs
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../File-Metadata/" title="File Metadata" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ File Metadata
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/HTTP-APIs/File-Metadata/index.html b/docs/build/HTTP-APIs/File-Metadata/index.html
new file mode 100644
index 0000000..ba62cbc
--- /dev/null
+++ b/docs/build/HTTP-APIs/File-Metadata/index.html
@@ -0,0 +1,954 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>File Metadata HTTP API</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ HTTP APIs
+ </span>
+
+
+ File Metadata
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5" checked>
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ File Metadata
+ </label>
+
+ <a href="./" title="File Metadata" class="md-nav__link md-nav__link--active">
+ File Metadata
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#endpoints" title="Endpoints" class="md-nav__link">
+ Endpoints
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#get-file-by-slug-single-item" title="Get File by Slug (single item)" class="md-nav__link">
+ Get File by Slug (single item)
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#sample-response" title="Sample Response" class="md-nav__link">
+ Sample Response
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#endpoints" title="Endpoints" class="md-nav__link">
+ Endpoints
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#get-file-by-slug-single-item" title="Get File by Slug (single item)" class="md-nav__link">
+ Get File by Slug (single item)
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#sample-response" title="Sample Response" class="md-nav__link">
+ Sample Response
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>File Metadata</h1>
+
+ <p>Ponzu provides a read-only HTTP API to get metadata about the files that have been uploaded to your system. As a security and bandwidth abuse precaution, the API is only queryable by "slug" which is the normalized filename of the uploaded file. </p>
+<hr />
+<h3 id="endpoints">Endpoints<a class="headerlink" href="#endpoints" title="Permanent link">&para;</a></h3>
+<h4 id="get-file-by-slug-single-item">Get File by Slug (single item)<a class="headerlink" href="#get-file-by-slug-single-item" title="Permanent link">&para;</a></h4>
+<p><kbd>GET</kbd> <code>/api/uploads?slug=&lt;Slug&gt;</code></p>
+<h5 id="sample-response">Sample Response<a class="headerlink" href="#sample-response" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="p">{</span>
+ <span class="s2">&quot;data&quot;</span><span class="o">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="s2">&quot;uuid&quot;</span><span class="o">:</span> <span class="s2">&quot;024a5797-e064-4ee0-abe3-415cb6d3ed18&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;id&quot;</span><span class="o">:</span> <span class="mi">6</span><span class="p">,</span>
+ <span class="s2">&quot;slug&quot;</span><span class="o">:</span> <span class="s2">&quot;filename.jpg&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;timestamp&quot;</span><span class="o">:</span> <span class="mi">1493926453826</span><span class="p">,</span> <span class="c1">// milliseconds since Unix epoch</span>
+ <span class="s2">&quot;updated&quot;</span><span class="o">:</span> <span class="mi">1493926453826</span><span class="p">,</span>
+ <span class="s2">&quot;name&quot;</span><span class="o">:</span> <span class="s2">&quot;filename.jpg&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;path&quot;</span><span class="o">:</span> <span class="s2">&quot;/api/uploads/2017/05/filename.jpg&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;content_length&quot;</span><span class="o">:</span> <span class="mi">357557</span><span class="p">,</span>
+ <span class="s2">&quot;content_type&quot;</span><span class="o">:</span> <span class="s2">&quot;image/jpeg&quot;</span><span class="p">,</span>
+ <span class="p">}</span>
+ <span class="p">]</span>
+<span class="p">}</span>
+</pre></div>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../Content/" title="Content" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ Content
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../Search/" title="Search" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ Search
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/HTTP-APIs/Search/index.html b/docs/build/HTTP-APIs/Search/index.html
new file mode 100644
index 0000000..45c41f2
--- /dev/null
+++ b/docs/build/HTTP-APIs/Search/index.html
@@ -0,0 +1,983 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>Full-text Search HTTP API</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ HTTP APIs
+ </span>
+
+
+ Search
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5" checked>
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ Search
+ </label>
+
+ <a href="./" title="Search" class="md-nav__link md-nav__link--active">
+ Search
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#endpoints" title="Endpoints" class="md-nav__link">
+ Endpoints
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#search-content" title="Search Content" class="md-nav__link">
+ Search Content
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#sample-response" title="Sample Response" class="md-nav__link">
+ Sample Response
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#endpoints" title="Endpoints" class="md-nav__link">
+ Endpoints
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#search-content" title="Search Content" class="md-nav__link">
+ Search Content
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#sample-response" title="Sample Response" class="md-nav__link">
+ Sample Response
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>Search</h1>
+
+ <p>Ponzu provides a read-only HTTP API to search the contents of your system's database.
+Full-text search is made possible by the use of <a href="http://blevesearch.com">Bleve</a>,
+which handles the indexing and querying. </p>
+<hr />
+<h3 id="endpoints">Endpoints<a class="headerlink" href="#endpoints" title="Permanent link">&para;</a></h3>
+<h4 id="search-content">Search Content<a class="headerlink" href="#search-content" title="Permanent link">&para;</a></h4>
+<p><kbd>GET</kbd> <code>/api/search?type=&lt;Type&gt;&amp;q=&lt;Query String&gt;</code></p>
+<div class="admonition warning">
+<p class="admonition-title">Search must be enabled individually for each Content type</p>
+<ul>
+<li>Search is not on by default to protect your data in case it shouldn't be indexed and published via the API.</li>
+<li><code>SearchMapping()</code> is implemented with default mapping (ideal for 99% of use cases). </li>
+<li>To enable search, add a <code>IndexContent() bool</code> method to your content type and return <code>true</code> (default implementation returns false).</li>
+</ul>
+</div>
+<ul>
+<li>
+<p><code>&lt;Type&gt;</code> must implement <a href="../../Interfaces/Search/#searchsearchable">db.Searchable</a></p>
+</li>
+<li>
+<p>Search is currently limited to single <code>&lt;Type&gt;</code> per request</p>
+</li>
+<li>
+<p><code>&lt;Query String&gt;</code> documentation here: <a href="http://www.blevesearch.com/docs/Query-String-Query/">Bleve Docs - Query String</a></p>
+</li>
+<li>
+<p>Search results are formatted exactly the same as standard Content API calls, so you don't need to change your client data model </p>
+</li>
+<li>
+<p>Search handler will respect other interface implementations on your content, including: </p>
+<ul>
+<li><a href="https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Hideable"><code>item.Hideable</code></a></li>
+<li><a href="https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Omittable"><code>item.Omittable</code></a> </li>
+<li><a href="https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Pushable"><code>item.Pushable</code></a> <em>(Note: only the first search result will be pushed)</em></li>
+</ul>
+</li>
+</ul>
+<h5 id="sample-response">Sample Response<a class="headerlink" href="#sample-response" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="p">{</span>
+ <span class="s2">&quot;data&quot;</span><span class="o">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="s2">&quot;uuid&quot;</span><span class="o">:</span> <span class="s2">&quot;024a5797-e064-4ee0-abe3-415cb6d3ed18&quot;</span><span class="p">,</span>
+ <span class="s2">&quot;id&quot;</span><span class="o">:</span> <span class="mi">6</span><span class="p">,</span>
+ <span class="s2">&quot;slug&quot;</span><span class="o">:</span> <span class="s2">&quot;item-id-024a5797-e064-4ee0-abe3-415cb6d3ed18&quot;</span><span class="p">,</span> <span class="c1">// customizable</span>
+ <span class="s2">&quot;timestamp&quot;</span><span class="o">:</span> <span class="mi">1493926453826</span><span class="p">,</span> <span class="c1">// milliseconds since Unix epoch</span>
+ <span class="s2">&quot;updated&quot;</span><span class="o">:</span> <span class="mi">1493926453826</span><span class="p">,</span>
+ <span class="c1">// your content data...,</span>
+ <span class="p">}</span>
+ <span class="p">]</span>
+<span class="p">}</span>
+</pre></div>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../File-Metadata/" title="File Metadata" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ File Metadata
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../../Interfaces/API/" title="API" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ API
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/Interfaces/API/index.html b/docs/build/Interfaces/API/index.html
new file mode 100644
index 0000000..448562d
--- /dev/null
+++ b/docs/build/Interfaces/API/index.html
@@ -0,0 +1,1186 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>API Package Interfaces</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ Interfaces
+ </span>
+
+
+ API
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6" checked>
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ API
+ </label>
+
+ <a href="./" title="API" class="md-nav__link md-nav__link--active">
+ API
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#interfaces" title="Interfaces" class="md-nav__link">
+ Interfaces
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#apicreateable" title="api.Createable" class="md-nav__link">
+ api.Createable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#apiupdateable" title="api.Updateable" class="md-nav__link">
+ api.Updateable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set_1" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation_1" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#apideleteable" title="api.Deleteable" class="md-nav__link">
+ api.Deleteable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set_2" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation_2" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#apitrustable" title="api.Trustable" class="md-nav__link">
+ api.Trustable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#implementation_3" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#interfaces" title="Interfaces" class="md-nav__link">
+ Interfaces
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#apicreateable" title="api.Createable" class="md-nav__link">
+ api.Createable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#apiupdateable" title="api.Updateable" class="md-nav__link">
+ api.Updateable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set_1" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation_1" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#apideleteable" title="api.Deleteable" class="md-nav__link">
+ api.Deleteable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set_2" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation_2" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#apitrustable" title="api.Trustable" class="md-nav__link">
+ api.Trustable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#implementation_3" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>API</h1>
+
+ <p>Ponzu provides a set of interfaces from the <code>system/api</code> package which enable
+richer interaction with your system from external clients. If you need to allow
+3rd-party apps to manage content, use the following interfaces.</p>
+<p>The API interfaces adhere to a common function signature, expecting an
+<code>http.ResponseWriter</code> and <code>*http.Request</code> as arguments and returning an <code>error</code>.
+This provides Ponzu developers with full control over the request/response
+life-cycle.</p>
+<hr />
+<h2 id="interfaces">Interfaces<a class="headerlink" href="#interfaces" title="Permanent link">&para;</a></h2>
+<h3 id="apicreateable"><a href="https://godoc.org/github.com/ponzu-cms/ponzu/system/api#Createable">api.Createable</a><a class="headerlink" href="#apicreateable" title="Permanent link">&para;</a></h3>
+<p>Externalable enables 3rd-party clients (outside the CMS) to send content via a
+<code>multipart/form-data</code> encoded <code>POST</code> request to a specific endpoint:
+<code>/api/content/create?type=&lt;Type&gt;</code>. When <code>api.Createable</code> is implemented, content
+will be saved from the request in a "Pending" section which will is visible only
+within the CMS.</p>
+<p>To work with "Pending" data, implement the <a href="../../Interfaces/Editor#editormergeable"><code>editor.Mergeable</code></a>
+interface, which will add "Approve" and "Reject" buttons to your Content types'
+editor -- or implement <a href="#apitrustable"><code>api.Trustable</code></a> to bypass
+the "Pending" section altogether and become "Public" immediately. </p>
+<h5 id="method-set">Method Set<a class="headerlink" href="#method-set" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Createable</span> <span class="kd">interface</span> <span class="p">{</span>
+ <span class="nx">Create</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h5 id="implementation">Implementation<a class="headerlink" href="#implementation" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">Create</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<hr />
+<h3 id="apiupdateable"><a href="https://godoc.org/github.com/ponzu-cms/ponzu/system/api#Updateable">api.Updateable</a><a class="headerlink" href="#apiupdateable" title="Permanent link">&para;</a></h3>
+<p>Updateable enables 3rd-party clients (outside the CMS) to update existing content
+via a <code>multipart/form-data</code> encoded <code>POST</code> request to a specific endpoint:
+<code>/api/content/update?type=&lt;Type&gt;&amp;id=&lt;id&gt;</code>. Request validation should be employed
+otherwise any client could change data in your database.</p>
+<h5 id="method-set_1">Method Set<a class="headerlink" href="#method-set_1" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Updateable</span> <span class="kd">interface</span> <span class="p">{</span>
+ <span class="nx">Update</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h5 id="implementation_1">Implementation<a class="headerlink" href="#implementation_1" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">Update</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<hr />
+<h3 id="apideleteable"><a href="https://godoc.org/github.com/ponzu-cms/ponzu/system/api#Deleteable">api.Deleteable</a><a class="headerlink" href="#apideleteable" title="Permanent link">&para;</a></h3>
+<p>Updateable enables 3rd-party clients (outside the CMS) to delete existing content
+via a <code>multipart/form-data</code> encoded <code>POST</code> request to a specific endpoint:
+<code>/api/content/delete?type=&lt;Type&gt;&amp;id=&lt;id&gt;</code>. Request validation should be employed
+otherwise any client could delete data from your database.</p>
+<h5 id="method-set_2">Method Set<a class="headerlink" href="#method-set_2" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Deleteable</span> <span class="kd">interface</span> <span class="p">{</span>
+ <span class="nx">Delete</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h5 id="implementation_2">Implementation<a class="headerlink" href="#implementation_2" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">Delete</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<hr />
+<h3 id="apitrustable"><a href="https://godoc.org/github.com/ponzu-cms/ponzu/system/api#Trustable">api.Trustable</a><a class="headerlink" href="#apitrustable" title="Permanent link">&para;</a></h3>
+<p>Trustable provides a way for submitted content (via <code>api.Createable</code>) to bypass
+the <code>editor.Mergeable</code> step in which CMS end-users must manually click the
+"Approve" button in order for content to be put in the "Public" section and access
+via the content API endpoints. <code>api.Trustable</code> has a single method: <code>AutoApprove</code>
+which will automatically approve content, bypassing the "Pending" section
+altogether.</p>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Trustable</span> <span class="kd">interface</span> <span class="p">{</span>
+ <span class="nx">AutoApprove</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h5 id="implementation_3">Implementation<a class="headerlink" href="#implementation_3" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">AutoApprove</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ Search
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../Editor/" title="Editor" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ Editor
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/Interfaces/Editor/index.html b/docs/build/Interfaces/Editor/index.html
new file mode 100644
index 0000000..c6b25f7
--- /dev/null
+++ b/docs/build/Interfaces/Editor/index.html
@@ -0,0 +1,1059 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>Editor Package Interfaces</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ Interfaces
+ </span>
+
+
+ Editor
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6" checked>
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ Editor
+ </label>
+
+ <a href="./" title="Editor" class="md-nav__link md-nav__link--active">
+ Editor
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#interfaces" title="Interfaces" class="md-nav__link">
+ Interfaces
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#editoreditable" title="editor.Editable" class="md-nav__link">
+ editor.Editable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editormergeable" title="editor.Mergeable" class="md-nav__link">
+ editor.Mergeable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set_1" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#interfaces" title="Interfaces" class="md-nav__link">
+ Interfaces
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#editoreditable" title="editor.Editable" class="md-nav__link">
+ editor.Editable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#editormergeable" title="editor.Mergeable" class="md-nav__link">
+ editor.Mergeable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set_1" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>Editor</h1>
+
+ <p>Ponzu provides a set of interfaces from the <code>management/editor</code> package which
+extend the system's functionality and determine how content editors are rendered
+within the CMS.</p>
+<hr />
+<h2 id="interfaces">Interfaces<a class="headerlink" href="#interfaces" title="Permanent link">&para;</a></h2>
+<h3 id="editoreditable"><a href="https://godoc.org/github.com/ponzu-cms/ponzu/management/editor#Editable">editor.Editable</a><a class="headerlink" href="#editoreditable" title="Permanent link">&para;</a></h3>
+<p>Editable determines what <code>[]bytes</code> are rendered inside the editor page. Use
+Edtiable on anything inside your CMS that you want to provide configuration, editable
+fields, or any HTML/markup to display to an end-user.</p>
+<div class="admonition note">
+<p class="admonition-title">Implementing <code>editor.Editable</code></p>
+<p>Most of the time, Ponzu developers generate the majority of this code using
+the Ponzu CLI <a href="../../CLI/Usage"><code>generate</code> command</a>.</p>
+</div>
+<h5 id="method-set">Method Set<a class="headerlink" href="#method-set" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Editable</span> <span class="kd">interface</span> <span class="p">{</span>
+ <span class="nx">MarshalEditor</span><span class="p">()</span> <span class="p">([]</span><span class="kt">byte</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h5 id="implementation">Implementation<a class="headerlink" href="#implementation" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">MarshalEditor</span><span class="p">()</span> <span class="p">([]</span><span class="kt">byte</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
+ <span class="c1">// The editor.Form func sets up a structured UI with default styles and form</span>
+ <span class="c1">// elements based on the fields provided. Most often, Ponzu developers will</span>
+ <span class="c1">// have the `$ ponzu generate` command generate the MarshalEditor func and </span>
+ <span class="c1">// its internal form fields</span>
+ <span class="nx">view</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">Form</span><span class="p">(</span><span class="nx">p</span><span class="p">,</span>
+ <span class="nx">editor</span><span class="p">.</span><span class="nx">Field</span><span class="p">{</span>
+ <span class="nx">View</span><span class="p">:</span> <span class="nx">editor</span><span class="p">.</span><span class="nx">Input</span><span class="p">(</span><span class="s">&quot;Name&quot;</span><span class="p">,</span> <span class="nx">p</span><span class="p">,</span> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;label&quot;</span><span class="p">:</span> <span class="s">&quot;Name&quot;</span><span class="p">,</span>
+ <span class="s">&quot;type&quot;</span><span class="p">:</span> <span class="s">&quot;text&quot;</span><span class="p">,</span>
+ <span class="s">&quot;placeholder&quot;</span><span class="p">:</span> <span class="s">&quot;Enter the Name here&quot;</span><span class="p">,</span>
+ <span class="p">}),</span>
+ <span class="p">},</span>
+ <span class="p">)</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<div class="admonition note">
+<p class="admonition-title">MarshalEditor() &amp; View Rendering</p>
+<p>Although it is common to use the <code>editor.Form</code> and <code>editor.Fields</code> to structure your content editor inside <code>MarshalEditor()</code>, the method signature defines that its return value needs only to be <code>[]byte, error</code>. Keep in mind that you can return a <code>[]byte</code> of any raw HTML or other markup to be rendered in the editor view.</p>
+</div>
+<hr />
+<h3 id="editormergeable"><a href="https://godoc.org/github.com/ponzu-cms/ponzu/management/editor#Mergeable">editor.Mergeable</a><a class="headerlink" href="#editormergeable" title="Permanent link">&para;</a></h3>
+<p>Mergable enables a CMS end-user to merge the "Pending" content from an outside source into the "Public" section, and thus making it visible via the public content API. It also allows the end-user to reject content. "Approve" and "Reject" buttons will be visible on the edit page for content submitted.</p>
+<h5 id="method-set_1">Method Set<a class="headerlink" href="#method-set_1" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Mergeable</span> <span class="kd">interface</span> <span class="p">{</span>
+ <span class="nx">Approve</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h5 id="example">Example<a class="headerlink" href="#example" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">Approve</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../API/" title="API" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ API
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../Format/" title="Format" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ Format
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/Interfaces/Format/index.html b/docs/build/Interfaces/Format/index.html
new file mode 100644
index 0000000..d85bd14
--- /dev/null
+++ b/docs/build/Interfaces/Format/index.html
@@ -0,0 +1,986 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>Format Package Interfaces</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ Interfaces
+ </span>
+
+
+ Format
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6" checked>
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ Format
+ </label>
+
+ <a href="./" title="Format" class="md-nav__link md-nav__link--active">
+ Format
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#interfaces" title="Interfaces" class="md-nav__link">
+ Interfaces
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#formatcsvformattable" title="format.CSVFormattable" class="md-nav__link">
+ format.CSVFormattable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#interfaces" title="Interfaces" class="md-nav__link">
+ Interfaces
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#formatcsvformattable" title="format.CSVFormattable" class="md-nav__link">
+ format.CSVFormattable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>Format</h1>
+
+ <p>Ponzu provides a set of interfaces from the <code>management/format</code> package which
+determine how content data should be converted and formatted for exporting via
+the Admin interface.</p>
+<hr />
+<h2 id="interfaces">Interfaces<a class="headerlink" href="#interfaces" title="Permanent link">&para;</a></h2>
+<h3 id="formatcsvformattable"><a href="https://godoc.org/github.com/ponzu-cms/ponzu/management/format#CSVFormattable">format.CSVFormattable</a><a class="headerlink" href="#formatcsvformattable" title="Permanent link">&para;</a></h3>
+<p>CSVFormattable controls if an "Export" button is added to the contents view for
+a Content type in the CMS to export the data to CSV. If it is implemented, a
+button will be present beneath the "New" button per Content type. </p>
+<h5 id="method-set">Method Set<a class="headerlink" href="#method-set" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">CSVFormattable</span> <span class="kd">interface</span> <span class="p">{</span>
+ <span class="nx">FormatCSV</span><span class="p">()</span> <span class="p">[]</span><span class="kt">string</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h5 id="implementation">Implementation<a class="headerlink" href="#implementation" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">FormatCSV</span><span class="p">()</span> <span class="p">[]</span><span class="kt">string</span> <span class="p">{</span>
+ <span class="c1">// []string contains the JSON struct tags generated for your Content type </span>
+ <span class="c1">// implementing the interface</span>
+ <span class="k">return</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;id&quot;</span><span class="p">,</span>
+ <span class="s">&quot;timestamp&quot;</span><span class="p">,</span>
+ <span class="s">&quot;slug&quot;</span><span class="p">,</span>
+ <span class="s">&quot;title&quot;</span><span class="p">,</span>
+ <span class="s">&quot;photos&quot;</span><span class="p">,</span>
+ <span class="s">&quot;body&quot;</span><span class="p">,</span>
+ <span class="s">&quot;written_by&quot;</span><span class="p">,</span>
+ <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<div class="admonition note">
+<p class="admonition-title">FormatCSV() []string</p>
+<p>Just like other Ponzu content extension interfaces, like <code>Push()</code>, you will
+return the JSON struct tags for the fields you want exported to the CSV file.
+These will also be the "header" row in the CSV file to give titles to the file
+columns. Keep in mind that all of item.Item's fields are available here as well.</p>
+</div>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../Editor/" title="Editor" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ Editor
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../Item/" title="Item" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ Item
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/Interfaces/Item/index.html b/docs/build/Interfaces/Item/index.html
new file mode 100644
index 0000000..aafe017
--- /dev/null
+++ b/docs/build/Interfaces/Item/index.html
@@ -0,0 +1,2077 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>Item Package Interfaces</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ Interfaces
+ </span>
+
+
+ Item
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6" checked>
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ Item
+ </label>
+
+ <a href="./" title="Item" class="md-nav__link md-nav__link--active">
+ Item
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#interfaces" title="Interfaces" class="md-nav__link">
+ Interfaces
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#itempushable" title="item.Pushable" class="md-nav__link">
+ item.Pushable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#itemhideable" title="item.Hideable" class="md-nav__link">
+ item.Hideable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set_1" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation_1" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#itemomittable" title="item.Omittable" class="md-nav__link">
+ item.Omittable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set_2" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation_2" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#itemhookable" title="item.Hookable" class="md-nav__link">
+ item.Hookable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set_3" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementations" title="Implementations" class="md-nav__link">
+ Implementations
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforeapicreate" title="BeforeAPICreate" class="md-nav__link">
+ BeforeAPICreate
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afterapicreate" title="AfterAPICreate" class="md-nav__link">
+ AfterAPICreate
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforeapprove" title="BeforeApprove" class="md-nav__link">
+ BeforeApprove
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afterapprove" title="AfterApprove" class="md-nav__link">
+ AfterApprove
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforereject" title="BeforeReject" class="md-nav__link">
+ BeforeReject
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afterreject" title="AfterReject" class="md-nav__link">
+ AfterReject
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforesave" title="BeforeSave" class="md-nav__link">
+ BeforeSave
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#aftersave" title="AfterSave" class="md-nav__link">
+ AfterSave
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforedelete" title="BeforeDelete" class="md-nav__link">
+ BeforeDelete
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afterdelete" title="AfterDelete" class="md-nav__link">
+ AfterDelete
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforeapidelete" title="BeforeAPIDelete" class="md-nav__link">
+ BeforeAPIDelete
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afterapidelete" title="AfterAPIDelete" class="md-nav__link">
+ AfterAPIDelete
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforeapiupdate" title="BeforeAPIUpdate" class="md-nav__link">
+ BeforeAPIUpdate
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afterapiupdate" title="AfterAPIUpdate" class="md-nav__link">
+ AfterAPIUpdate
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforeadmincreate" title="BeforeAdminCreate" class="md-nav__link">
+ BeforeAdminCreate
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afteradmincreate" title="AfterAdminCreate" class="md-nav__link">
+ AfterAdminCreate
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforeadminupdate" title="BeforeAdminUpdate" class="md-nav__link">
+ BeforeAdminUpdate
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afteradminupdate" title="AfterAdminUpdate" class="md-nav__link">
+ AfterAdminUpdate
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforeadmindelete" title="BeforeAdminDelete" class="md-nav__link">
+ BeforeAdminDelete
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afteradmindelete" title="AfterAdminDelete" class="md-nav__link">
+ AfterAdminDelete
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforeenable" title="BeforeEnable" class="md-nav__link">
+ BeforeEnable
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afterenable" title="AfterEnable" class="md-nav__link">
+ AfterEnable
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforedisable" title="BeforeDisable" class="md-nav__link">
+ BeforeDisable
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afterdisable" title="AfterDisable" class="md-nav__link">
+ AfterDisable
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#itemidentifiable" title="item.Identifiable" class="md-nav__link">
+ item.Identifiable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set_4" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation_3" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#itemsluggable" title="item.Sluggable" class="md-nav__link">
+ item.Sluggable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set_5" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation_4" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#itemsortable" title="item.Sortable" class="md-nav__link">
+ item.Sortable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set_6" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation_5" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#interfaces" title="Interfaces" class="md-nav__link">
+ Interfaces
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#itempushable" title="item.Pushable" class="md-nav__link">
+ item.Pushable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#itemhideable" title="item.Hideable" class="md-nav__link">
+ item.Hideable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set_1" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation_1" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#itemomittable" title="item.Omittable" class="md-nav__link">
+ item.Omittable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set_2" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation_2" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#itemhookable" title="item.Hookable" class="md-nav__link">
+ item.Hookable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set_3" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementations" title="Implementations" class="md-nav__link">
+ Implementations
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforeapicreate" title="BeforeAPICreate" class="md-nav__link">
+ BeforeAPICreate
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afterapicreate" title="AfterAPICreate" class="md-nav__link">
+ AfterAPICreate
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforeapprove" title="BeforeApprove" class="md-nav__link">
+ BeforeApprove
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afterapprove" title="AfterApprove" class="md-nav__link">
+ AfterApprove
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforereject" title="BeforeReject" class="md-nav__link">
+ BeforeReject
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afterreject" title="AfterReject" class="md-nav__link">
+ AfterReject
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforesave" title="BeforeSave" class="md-nav__link">
+ BeforeSave
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#aftersave" title="AfterSave" class="md-nav__link">
+ AfterSave
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforedelete" title="BeforeDelete" class="md-nav__link">
+ BeforeDelete
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afterdelete" title="AfterDelete" class="md-nav__link">
+ AfterDelete
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforeapidelete" title="BeforeAPIDelete" class="md-nav__link">
+ BeforeAPIDelete
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afterapidelete" title="AfterAPIDelete" class="md-nav__link">
+ AfterAPIDelete
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforeapiupdate" title="BeforeAPIUpdate" class="md-nav__link">
+ BeforeAPIUpdate
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afterapiupdate" title="AfterAPIUpdate" class="md-nav__link">
+ AfterAPIUpdate
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforeadmincreate" title="BeforeAdminCreate" class="md-nav__link">
+ BeforeAdminCreate
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afteradmincreate" title="AfterAdminCreate" class="md-nav__link">
+ AfterAdminCreate
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforeadminupdate" title="BeforeAdminUpdate" class="md-nav__link">
+ BeforeAdminUpdate
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afteradminupdate" title="AfterAdminUpdate" class="md-nav__link">
+ AfterAdminUpdate
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforeadmindelete" title="BeforeAdminDelete" class="md-nav__link">
+ BeforeAdminDelete
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afteradmindelete" title="AfterAdminDelete" class="md-nav__link">
+ AfterAdminDelete
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforeenable" title="BeforeEnable" class="md-nav__link">
+ BeforeEnable
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afterenable" title="AfterEnable" class="md-nav__link">
+ AfterEnable
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#beforedisable" title="BeforeDisable" class="md-nav__link">
+ BeforeDisable
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#afterdisable" title="AfterDisable" class="md-nav__link">
+ AfterDisable
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#itemidentifiable" title="item.Identifiable" class="md-nav__link">
+ item.Identifiable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set_4" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation_3" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#itemsluggable" title="item.Sluggable" class="md-nav__link">
+ item.Sluggable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set_5" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation_4" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#itemsortable" title="item.Sortable" class="md-nav__link">
+ item.Sortable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set_6" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#implementation_5" title="Implementation" class="md-nav__link">
+ Implementation
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>Item</h1>
+
+ <p>Ponzu provides a set of interfaces from the <code>system/item</code> package which extend
+the functionality of the content in your system and how it interacts with other
+components inside and outside of Ponzu. </p>
+<hr />
+<h2 id="interfaces">Interfaces<a class="headerlink" href="#interfaces" title="Permanent link">&para;</a></h2>
+<h3 id="itempushable"><a href="https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Pushable">item.Pushable</a><a class="headerlink" href="#itempushable" title="Permanent link">&para;</a></h3>
+<p>Pushable, if <a href="https://http2.github.io/http2-spec/#PushResources">HTTP/2 Server Push</a>
+is supported by the client, can tell a handler which resources it would like to
+have "pushed" preemptively to the client. This saves follow-on roundtrip requests
+for other items which are referenced by the Pushable item. The <code>Push</code> method, the
+only method in Pushable, must return a <code>[]string</code> containing the <code>json</code> field tags
+of the referenced items within the type.</p>
+<h5 id="method-set">Method Set<a class="headerlink" href="#method-set" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Pushable</span> <span class="kd">interface</span> <span class="p">{</span>
+ <span class="c1">// the values contained in fields returned by Push must be URL paths</span>
+ <span class="nx">Push</span><span class="p">()</span> <span class="p">[]</span><span class="kt">string</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h5 id="implementation">Implementation<a class="headerlink" href="#implementation" title="Permanent link">&para;</a></h5>
+<p>The <code>Push</code> method returns a <code>[]string</code> containing the <code>json</code> tag field names for
+which you want to have pushed to a supported client. The values for the field
+names <strong>must</strong> be URL paths, and cannot be from another origin.</p>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Post</span> <span class="kd">struct</span> <span class="p">{</span>
+ <span class="nx">item</span><span class="p">.</span><span class="nx">Item</span>
+
+ <span class="nx">HeaderPhoto</span> <span class="kt">string</span> <span class="s">`json:&quot;header_photo&quot;`</span>
+ <span class="nx">Author</span> <span class="kt">string</span> <span class="s">`json:&quot;author&quot;`</span> <span class="c1">// reference `/api/content/?type=Author&amp;id=2`</span>
+ <span class="c1">// ...</span>
+<span class="p">}</span>
+
+<span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">Push</span><span class="p">()</span> <span class="p">[]</span><span class="kt">string</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;header_photo&quot;</span><span class="p">,</span>
+ <span class="s">&quot;author&quot;</span><span class="p">,</span>
+ <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<hr />
+<h3 id="itemhideable"><a href="https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Hideable">item.Hideable</a><a class="headerlink" href="#itemhideable" title="Permanent link">&para;</a></h3>
+<p>Hideable tells an API handler that data of this type shouldn’t be exposed outside
+the system. Hideable types cannot be used as references (relations in Content types).
+The <code>Hide</code> method, the only method in Hideable, takes an <code>http.ResponseWriter, *http.Request</code>
+and returns an <code>error</code>. A special error in the <code>items</code> package, <code>ErrAllowHiddenItem</code>
+can be returned as the error from Hide to instruct handlers to show hidden
+content in specific cases.</p>
+<h5 id="method-set_1">Method Set<a class="headerlink" href="#method-set_1" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Hideable</span> <span class="kd">interface</span> <span class="p">{</span>
+ <span class="nx">Hide</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h5 id="implementation_1">Implementation<a class="headerlink" href="#implementation_1" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">Hide</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<hr />
+<h3 id="itemomittable"><a href="https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Omittable">item.Omittable</a><a class="headerlink" href="#itemomittable" title="Permanent link">&para;</a></h3>
+<p>Omittable tells a content API handler to keep certain fields from being exposed
+through the JSON response. It's single method, <code>Omit</code> takes no arguments and
+returns a <code>[]string</code> which must be made up of the JSON struct tags for the type
+containing fields to be omitted.</p>
+<h5 id="method-set_2">Method Set<a class="headerlink" href="#method-set_2" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Omittable</span> <span class="kd">interface</span> <span class="p">{</span>
+ <span class="nx">Omit</span><span class="p">()</span> <span class="p">[]</span><span class="kt">string</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h5 id="implementation_2">Implementation<a class="headerlink" href="#implementation_2" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Post</span> <span class="kd">struct</span> <span class="p">{</span>
+ <span class="nx">item</span><span class="p">.</span><span class="nx">Item</span>
+
+ <span class="nx">HeaderPhoto</span> <span class="kt">string</span> <span class="s">`json:&quot;header_photo&quot;`</span>
+ <span class="nx">Author</span> <span class="kt">string</span> <span class="s">`json:&quot;author&quot;`</span>
+ <span class="c1">// ...</span>
+<span class="p">}</span>
+
+<span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">Omit</span><span class="p">()</span> <span class="p">[]</span><span class="kt">string</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="s">&quot;header_photo&quot;</span><span class="p">,</span>
+ <span class="s">&quot;author&quot;</span><span class="p">,</span>
+ <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<hr />
+<h3 id="itemhookable"><a href="https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Hookable">item.Hookable</a><a class="headerlink" href="#itemhookable" title="Permanent link">&para;</a></h3>
+<p>Hookable provides lifecycle hooks into the http handlers which manage Save, Delete,
+Approve, and Reject routines. All methods in its set take an
+<code>http.ResponseWriter, *http.Request</code> and return an <code>error</code>.</p>
+<h5 id="method-set_3">Method Set<a class="headerlink" href="#method-set_3" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Hookable</span> <span class="kd">interface</span> <span class="p">{</span>
+ <span class="nx">BeforeAPICreate</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+ <span class="nx">AfterAPICreate</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+
+ <span class="nx">BeforeAPIUpdate</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+ <span class="nx">AfterAPIUpdate</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+
+ <span class="nx">BeforeAPIDelete</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+ <span class="nx">AfterAPIDelete</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+
+ <span class="nx">BeforeAdminCreate</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+ <span class="nx">AfterAdminCreate</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+
+ <span class="nx">BeforeAdminUpdate</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+ <span class="nx">AfterAdminUpdate</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+
+ <span class="nx">BeforeAdminDelete</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+ <span class="nx">AfterAdminDelete</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+
+ <span class="nx">BeforeSave</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+ <span class="nx">AfterSave</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+
+ <span class="nx">BeforeDelete</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+ <span class="nx">AfterDelete</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+
+ <span class="nx">BeforeApprove</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+ <span class="nx">AfterApprove</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+
+ <span class="nx">BeforeReject</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+ <span class="nx">AfterReject</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+
+ <span class="c1">// Enable/Disable used exclusively for addons</span>
+ <span class="nx">BeforeEnable</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+ <span class="nx">AfterEnable</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+
+ <span class="nx">BeforeDisable</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+ <span class="nx">AfterDisable</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h5 id="implementations">Implementations<a class="headerlink" href="#implementations" title="Permanent link">&para;</a></h5>
+<h4 id="beforeapicreate">BeforeAPICreate<a class="headerlink" href="#beforeapicreate" title="Permanent link">&para;</a></h4>
+<p>BeforeAPICreate is called before an item is created via a 3rd-party client. If a
+non-nil <code>error</code> value is returned, the item will not be created/saved.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">BeforeAPICreate</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="afterapicreate">AfterAPICreate<a class="headerlink" href="#afterapicreate" title="Permanent link">&para;</a></h4>
+<p>AfterAPICreate is called after an item has been created via a 3rd-party client.
+At this point, the item has been saved to the database. If a non-nil <code>error</code> is
+returned, it will respond to the client with an empty response, so be sure to
+use the <code>http.ResponseWriter</code> from within your hook appropriately.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">AfterAPICreate</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="beforeapprove">BeforeApprove<a class="headerlink" href="#beforeapprove" title="Permanent link">&para;</a></h4>
+<p>BeforeApprove is called before an item is merged as "Public" from its prior
+status as "Pending". If a non-nil <code>error</code> value is returned, the item will not be
+appproved, and an error message is displayed to the Admin. </p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">BeforeApprove</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="afterapprove">AfterApprove<a class="headerlink" href="#afterapprove" title="Permanent link">&para;</a></h4>
+<p>AfterApprove is called after an item has been merged as "Public" from its prior
+status as "Pending". If a non-nil <code>error</code> is returned, an error message is
+displayed to the Admin, however the item will already be irreversibly merged.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">AfterApprove</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="beforereject">BeforeReject<a class="headerlink" href="#beforereject" title="Permanent link">&para;</a></h4>
+<p>BeforeReject is called before an item is rejected and deleted by default. To reject
+an item, but not delete it, return a non-nil <code>error</code> from this hook - doing so
+will allow the hook to do what you want it to do prior to the return, but the item
+will remain in the "Pending" section.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">BeforeReject</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="afterreject">AfterReject<a class="headerlink" href="#afterreject" title="Permanent link">&para;</a></h4>
+<p>AfterReject is called after an item is rejected and has been deleted.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">AfterReject</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="beforesave">BeforeSave<a class="headerlink" href="#beforesave" title="Permanent link">&para;</a></h4>
+<p>BeforeSave is called before any CMS Admin or 3rd-party client triggers a save to
+the database. This could be done by clicking the 'Save' button on a Content editor,
+or by a API call to Create or Update the Content item. By returning a non-nil
+<code>error</code> value, the item will not be saved.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">BeforeSave</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="aftersave">AfterSave<a class="headerlink" href="#aftersave" title="Permanent link">&para;</a></h4>
+<p>AfterSave is called after any CMS Admin or 3rd-party client triggers a save to
+the database. This could be done by clicking the 'Save' button on a Content editor,
+or by a API call to Create or Update the Content item.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">AfterSave</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="beforedelete">BeforeDelete<a class="headerlink" href="#beforedelete" title="Permanent link">&para;</a></h4>
+<p>BeforeDelete is called before any CMS Admin or 3rd-party client triggers a delete to
+the database. This could be done by clicking the 'Delete' button on a Content editor,
+or by a API call to Delete the Content item. By returning a non-nil <code>error</code> value,
+the item will not be deleted.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">BeforeDelete</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="afterdelete">AfterDelete<a class="headerlink" href="#afterdelete" title="Permanent link">&para;</a></h4>
+<p>AfterSave is called after any CMS Admin or 3rd-party client triggers a delete to
+the database. This could be done by clicking the 'Delete' button on a Content editor,
+or by a API call to Delete the Content item.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">AfterDelete</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="beforeapidelete">BeforeAPIDelete<a class="headerlink" href="#beforeapidelete" title="Permanent link">&para;</a></h4>
+<p>BeforeDelete is only called before a 3rd-party client triggers a delete to the
+database. By returning a non-nil <code>error</code> value, the item will not be deleted.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">BeforeAPIDelete</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="afterapidelete">AfterAPIDelete<a class="headerlink" href="#afterapidelete" title="Permanent link">&para;</a></h4>
+<p>AfterAPIDelete is only called after a 3rd-party client triggers a delete to the
+database.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">AfterAPIDelete</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="beforeapiupdate">BeforeAPIUpdate<a class="headerlink" href="#beforeapiupdate" title="Permanent link">&para;</a></h4>
+<p>BeforeAPIUpdate is only called before a 3rd-party client triggers an update to
+the database. By returning a non-nil <code>error</code> value, the item will not be updated.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">BeforeAPIUpdate</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="afterapiupdate">AfterAPIUpdate<a class="headerlink" href="#afterapiupdate" title="Permanent link">&para;</a></h4>
+<p>AfterAPIUpdate is only called after a 3rd-party client triggers an update to
+the database.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">AfterAPIUpdate</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="beforeadmincreate">BeforeAdminCreate<a class="headerlink" href="#beforeadmincreate" title="Permanent link">&para;</a></h4>
+<p>BeforeAdminCreate is only called before a CMS Admin creates a new Content item.
+It is not called for subsequent saves to the item once it has been created and
+assigned an ID. By returning a non-nil <code>error</code> value, the item will not be created.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">BeforeAdminCreate</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="afteradmincreate">AfterAdminCreate<a class="headerlink" href="#afteradmincreate" title="Permanent link">&para;</a></h4>
+<p>AfterAdminCreate is only called after a CMS Admin creates a new Content item.
+It is not called for subsequent saves to the item once it has been created and
+assigned an ID.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">AfterAdminCreate</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="beforeadminupdate">BeforeAdminUpdate<a class="headerlink" href="#beforeadminupdate" title="Permanent link">&para;</a></h4>
+<p>BeforeAdminUpdate is only called before a CMS Admin updates a Content item. By
+returning a non-nil <code>error</code>, the item will not be updated.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">BeforeAdminUpdate</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="afteradminupdate">AfterAdminUpdate<a class="headerlink" href="#afteradminupdate" title="Permanent link">&para;</a></h4>
+<p>AfterAdminUpdate is only called after a CMS Admin updates a Content item.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">AfterAdminUpdate</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="beforeadmindelete">BeforeAdminDelete<a class="headerlink" href="#beforeadmindelete" title="Permanent link">&para;</a></h4>
+<p>BeforeAdminDelete is only called before a CMS Admin deletes a Content item. By
+returning a non-nil <code>error</code> value, the item will not be deleted.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">BeforeAdminDelete</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="afteradmindelete">AfterAdminDelete<a class="headerlink" href="#afteradmindelete" title="Permanent link">&para;</a></h4>
+<p>AfterAdminDelete is only called after a CMS Admin deletes a Content item.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">AfterAdminDelete</span><span class="p">(</span><span class="nx">res</span> <span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="nx">req</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="beforeenable">BeforeEnable<a class="headerlink" href="#beforeenable" title="Permanent link">&para;</a></h4>
+<p>BeforeEnable is only applicable to Addon items, and is called before the addon
+changes status to "Enabled". By returning a non-nil <code>error</code> value, the addon
+will not become enabled.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">BeforeEnable</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="afterenable">AfterEnable<a class="headerlink" href="#afterenable" title="Permanent link">&para;</a></h4>
+<p>AfterEnable is only applicable to Addon items, and is called after the addon
+changes status to "Enabled".</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">AfterEnable</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="beforedisable">BeforeDisable<a class="headerlink" href="#beforedisable" title="Permanent link">&para;</a></h4>
+<p>BeforeDisable is only applicable to Addon items, and is called before the addon
+changes status to "Disabled". By returning a non-nil <code>error</code> value, the addon
+will not become disabled.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">BeforeDisable</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h4 id="afterdisable">AfterDisable<a class="headerlink" href="#afterdisable" title="Permanent link">&para;</a></h4>
+<p>AfterDisable is only applicable to Addon items, and is called after the addon
+changes status to "Disabled".</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">p</span> <span class="o">*</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">AfterDisable</span><span class="p">(</span><span class="nx">http</span><span class="p">.</span><span class="nx">ResponseWriter</span><span class="p">,</span> <span class="o">*</span><span class="nx">http</span><span class="p">.</span><span class="nx">Request</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">nil</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>Hookable is implemented by Item by default as no-ops which are expected to be overridden. </p>
+<div class="admonition note">
+<p class="admonition-title">Note</p>
+<p>returning an error from any of these <code>Hookable</code> methods will end the request,
+causing it to halt immediately after the hook. For example, returning an <code>error</code>
+from <code>BeforeDelete</code> will result in the content being kept in the database.
+The same logic applies to all of these interface methods that return an error
+- <strong>the error defines the behavior</strong>.</p>
+</div>
+<hr />
+<h3 id="itemidentifiable"><a href="https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Identifiable">item.Identifiable</a><a class="headerlink" href="#itemidentifiable" title="Permanent link">&para;</a></h3>
+<p>Identifiable enables a struct to have its ID set/get. Typically this is done to set an ID to -1 indicating it is new for DB inserts, since by default a newly initialized struct would have an ID of 0, the int zero-value, and BoltDB's starting key per bucket is 0, thus overwriting the first record.
+Most notable, Identifiable’s <code>String</code> method is used to set a meaningful display name for an Item. <code>String</code> is called by default in the Admin dashboard to show the Items of certain types, and in the default creation of an Item’s slug.
+Identifiable is implemented by Item by default.</p>
+<h5 id="method-set_4">Method Set<a class="headerlink" href="#method-set_4" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Identifiable</span> <span class="kd">interface</span> <span class="p">{</span>
+ <span class="nx">ItemID</span><span class="p">()</span> <span class="kt">int</span>
+ <span class="nx">SetItemID</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span>
+ <span class="nx">UniqueID</span><span class="p">()</span> <span class="nx">uuid</span><span class="p">.</span><span class="nx">UUID</span>
+ <span class="nx">String</span><span class="p">()</span> <span class="kt">string</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h5 id="implementation_3">Implementation<a class="headerlink" href="#implementation_3" title="Permanent link">&para;</a></h5>
+<p><code>item.Identifiable</code> has a default implementation in the <code>system/item</code> package.
+It is not advised to override these methods, with the exception of <code>String()</code>,
+which is commonly used to set the display name of Content items when listed in
+the CMS, and to customize slugs.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">i</span> <span class="nx">Item</span><span class="p">)</span> <span class="nx">ItemID</span><span class="p">()</span> <span class="kt">int</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="nx">i</span><span class="p">.</span><span class="nx">ID</span>
+<span class="p">}</span>
+
+<span class="kd">func</span> <span class="p">(</span><span class="nx">i</span> <span class="o">*</span><span class="nx">Item</span><span class="p">)</span> <span class="nx">SetItemID</span><span class="p">(</span><span class="nx">id</span> <span class="kt">int</span><span class="p">)</span> <span class="p">{</span>
+ <span class="nx">i</span><span class="p">.</span><span class="nx">ID</span> <span class="p">=</span> <span class="nx">id</span>
+<span class="p">}</span>
+
+<span class="kd">func</span> <span class="p">(</span><span class="nx">i</span> <span class="nx">Item</span><span class="p">)</span> <span class="nx">UniqueID</span><span class="p">()</span> <span class="nx">uuid</span><span class="p">.</span><span class="nx">UUID</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="nx">i</span><span class="p">.</span><span class="nx">UUID</span>
+<span class="p">}</span>
+
+<span class="kd">func</span> <span class="p">(</span><span class="nx">i</span> <span class="nx">Item</span><span class="p">)</span> <span class="nx">String</span><span class="p">()</span> <span class="kt">string</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="nx">fmt</span><span class="p">.</span><span class="nx">Sprintf</span><span class="p">(</span><span class="s">&quot;Item ID: %s&quot;</span><span class="p">,</span> <span class="nx">i</span><span class="p">.</span><span class="nx">UniqueID</span><span class="p">())</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<hr />
+<h3 id="itemsluggable"><a href="https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Sluggable">item.Sluggable</a><a class="headerlink" href="#itemsluggable" title="Permanent link">&para;</a></h3>
+<p>Sluggable makes a struct locatable by URL with it's own path. As an Item implementing Sluggable, slugs may overlap. If this is an issue, make your content struct (or one which embeds Item) implement Sluggable and it will override the slug created by Item's <code>SetSlug</code> method with your own.
+It is not recommended to override <code>SetSlug</code>, but rather the <code>String</code> method on your content struct, which will have a similar, more predictable effect.
+Sluggable is implemented by Item by default.</p>
+<h5 id="method-set_5">Method Set<a class="headerlink" href="#method-set_5" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Sluggable</span> <span class="kd">interface</span> <span class="p">{</span>
+ <span class="nx">SetSlug</span><span class="p">(</span><span class="kt">string</span><span class="p">)</span>
+ <span class="nx">ItemSlug</span><span class="p">()</span> <span class="kt">string</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h5 id="implementation_4">Implementation<a class="headerlink" href="#implementation_4" title="Permanent link">&para;</a></h5>
+<p><code>item.Sluggable</code> has a default implementation in the <code>system/item</code> package. It is
+possible to override these methods on your own Content types, but beware, behavior
+is undefined. It is tempting to override the <code>SetSlug()</code> method to customize your
+Content item slug, but try first to override the <code>String()</code> method found in the
+<code>item.Identifiable</code> interface instead. If you don't get the desired results, try
+<code>SetSlug()</code>.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">i</span> <span class="o">*</span><span class="nx">Item</span><span class="p">)</span> <span class="nx">SetSlug</span><span class="p">(</span><span class="nx">slug</span> <span class="kt">string</span><span class="p">)</span> <span class="p">{</span>
+ <span class="nx">i</span><span class="p">.</span><span class="nx">Slug</span> <span class="p">=</span> <span class="nx">slug</span>
+<span class="p">}</span>
+
+<span class="kd">func</span> <span class="p">(</span><span class="nx">i</span> <span class="o">*</span><span class="nx">Item</span><span class="p">)</span> <span class="nx">ItemSlug</span><span class="p">()</span> <span class="kt">string</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="nx">i</span><span class="p">.</span><span class="nx">Slug</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<hr />
+<h3 id="itemsortable"><a href="https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Sortable">item.Sortable</a><a class="headerlink" href="#itemsortable" title="Permanent link">&para;</a></h3>
+<p>Sortable enables items to be sorted by time, as per the sort.Interface interface. Sortable is implemented by Item by default.</p>
+<h5 id="method-set_6">Method Set<a class="headerlink" href="#method-set_6" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Sortable</span> <span class="kd">interface</span> <span class="p">{</span>
+ <span class="nx">Time</span><span class="p">()</span> <span class="kt">int64</span>
+ <span class="nx">Touch</span><span class="p">()</span> <span class="kt">int64</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h5 id="implementation_5">Implementation<a class="headerlink" href="#implementation_5" title="Permanent link">&para;</a></h5>
+<p><code>item.Sortable</code> has a default implementation in the <code>system/item</code> package. It is
+possible to override these methods on your own Content type, but beware, behavior
+is undefined.</p>
+<div class="codehilite"><pre><span></span><span class="kd">func</span> <span class="p">(</span><span class="nx">i</span> <span class="nx">Item</span><span class="p">)</span> <span class="nx">Time</span><span class="p">()</span> <span class="kt">int64</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="nx">i</span><span class="p">.</span><span class="nx">Timestamp</span>
+<span class="p">}</span>
+
+<span class="kd">func</span> <span class="p">(</span><span class="nx">i</span> <span class="nx">Item</span><span class="p">)</span> <span class="nx">Touch</span><span class="p">()</span> <span class="kt">int64</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="nx">i</span><span class="p">.</span><span class="nx">Updated</span>
+<span class="p">}</span>
+</pre></div>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../Format/" title="Format" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ Format
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../Search/" title="Search" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ Search
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/Interfaces/Search/index.html b/docs/build/Interfaces/Search/index.html
new file mode 100644
index 0000000..1c328c7
--- /dev/null
+++ b/docs/build/Interfaces/Search/index.html
@@ -0,0 +1,983 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>Search Package Interfaces</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ Interfaces
+ </span>
+
+
+ Search
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6" checked>
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ Search
+ </label>
+
+ <a href="./" title="Search" class="md-nav__link md-nav__link--active">
+ Search
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#interfaces" title="Interfaces" class="md-nav__link">
+ Interfaces
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#searchsearchable" title="search.Searchable" class="md-nav__link">
+ search.Searchable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#interfaces" title="Interfaces" class="md-nav__link">
+ Interfaces
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#searchsearchable" title="search.Searchable" class="md-nav__link">
+ search.Searchable
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#method-set" title="Method Set" class="md-nav__link">
+ Method Set
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#example" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>Search</h1>
+
+ <p>Ponzu provides a set of interfaces from the <code>system/search</code> package to enable and customize full-text search access to content in your system. <strong>Search is not enabled by default</strong>, and must be enabled per Content type individually.</p>
+<h2 id="interfaces">Interfaces<a class="headerlink" href="#interfaces" title="Permanent link">&para;</a></h2>
+<h3 id="searchsearchable"><a href="https://godoc.org/github.com/ponzu-cms/ponzu/system/search#Searchable">search.Searchable</a><a class="headerlink" href="#searchsearchable" title="Permanent link">&para;</a></h3>
+<p>Searchable determines how content is indexed and whether the system should index the content when it is created and updated or be removed from the index when content is deleted.</p>
+<div class="admonition warning">
+<p>Search is <strong>disabled</strong> for all Content items by default. Each Content item that should be indexed and searchable must implement the <code>search.Searchable</code> interface.</p>
+</div>
+<h5 id="method-set">Method Set<a class="headerlink" href="#method-set" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Searchable</span> <span class="kd">interface</span> <span class="p">{</span>
+ <span class="nx">SearchMapping</span><span class="p">()</span> <span class="p">(</span><span class="o">*</span><span class="nx">mapping</span><span class="p">.</span><span class="nx">IndexMappingImpl</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span>
+ <span class="nx">IndexContent</span><span class="p">()</span> <span class="kt">bool</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>By default, Ponzu sets up the <a href="http://blevesearch.com">Bleve's</a> "default mapping", which is typically what you want for most content-based systems. This can be overridden by implementing your own <code>SearchMapping() (*mapping.IndexMappingImpl, error)</code> method on your Content type. </p>
+<p>This way, all you need to do to get full-text search is to add the <code>IndexContent() bool</code> method to each Content type you want search enabled. Return <code>true</code> from this method to enable search. </p>
+<h5 id="example">Example<a class="headerlink" href="#example" title="Permanent link">&para;</a></h5>
+<div class="codehilite"><pre><span></span><span class="c1">// ...</span>
+
+<span class="kd">type</span> <span class="nx">Song</span> <span class="kd">struct</span> <span class="p">{</span>
+ <span class="nx">item</span><span class="p">.</span><span class="nx">Item</span>
+
+ <span class="nx">Name</span> <span class="kt">string</span> <span class="s">`json:&quot;name&quot;`</span>
+ <span class="c1">// ...</span>
+<span class="p">}</span>
+
+<span class="kd">func</span> <span class="p">(</span><span class="nx">s</span> <span class="o">*</span><span class="nx">Song</span><span class="p">)</span> <span class="nx">IndexContent</span><span class="p">()</span> <span class="kt">bool</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="kc">true</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<div class="admonition tip">
+<p class="admonition-title">Indexing Existing Content</p>
+<p>If you previously had search disabled and had already added content to your system, you will need to re-index old content items in your CMS. Otherwise, they will not show up in search queries.. This requires you to manually open each item and click 'Save'. This could be scripted and Ponzu <em>might</em> ship with a re-indexing function at some point in the fututre.</p>
+</div>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../Item/" title="Item" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ Item
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ Creating Addons
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/Ponzu-Addons/Creating-Addons/index.html b/docs/build/Ponzu-Addons/Creating-Addons/index.html
new file mode 100644
index 0000000..690b103
--- /dev/null
+++ b/docs/build/Ponzu-Addons/Creating-Addons/index.html
@@ -0,0 +1,846 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>How to create Ponzu Addons</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ Ponzu Addons
+ </span>
+
+
+ Creating Addons
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7" checked>
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+
+
+ <a href="./" title="Creating Addons" class="md-nav__link md-nav__link--active">
+ Creating Addons
+ </a>
+
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1 id="coming-soon">Coming soon<a class="headerlink" href="#coming-soon" title="Permanent link">&para;</a></h1>
+<p>For a reference to creating your own addons, see:
+<a href="https://github.com/bosssauce/fbscheduler">https://github.com/bosssauce/fbscheduler</a></p>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../../Interfaces/Search/" title="Search" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ Search
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../Using-Addons/" title="Using Addons" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ Using Addons
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/Ponzu-Addons/Using-Addons/index.html b/docs/build/Ponzu-Addons/Using-Addons/index.html
new file mode 100644
index 0000000..cfe1d76
--- /dev/null
+++ b/docs/build/Ponzu-Addons/Using-Addons/index.html
@@ -0,0 +1,846 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>How to use Ponzu Addons</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ Ponzu Addons
+ </span>
+
+
+ Using Addons
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7" checked>
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+
+
+ <a href="./" title="Using Addons" class="md-nav__link md-nav__link--active">
+ Using Addons
+ </a>
+
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1 id="coming-soon">Coming soon<a class="headerlink" href="#coming-soon" title="Permanent link">&para;</a></h1>
+<p>For a reference to creating your own addons, see:
+<a href="https://github.com/bosssauce/fbscheduler">https://github.com/bosssauce/fbscheduler</a></p>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../Creating-Addons/" title="Creating Addons" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ Creating Addons
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ Overview
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/Quickstart/Overview/index.html b/docs/build/Quickstart/Overview/index.html
new file mode 100644
index 0000000..fe023d6
--- /dev/null
+++ b/docs/build/Quickstart/Overview/index.html
@@ -0,0 +1,932 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>Overview - Ponzu</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ Quickstart
+ </span>
+
+
+ Overview
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8" checked>
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ Overview
+ </label>
+
+ <a href="./" title="Overview" class="md-nav__link md-nav__link--active">
+ Overview
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#quickstart-steps" title="Quickstart Steps" class="md-nav__link">
+ Quickstart Steps
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#notes" title="Notes" class="md-nav__link">
+ Notes
+ </a>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#quickstart-steps" title="Quickstart Steps" class="md-nav__link">
+ Quickstart Steps
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#notes" title="Notes" class="md-nav__link">
+ Notes
+ </a>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>Overview</h1>
+
+ <h3 id="quickstart-steps">Quickstart Steps<a class="headerlink" href="#quickstart-steps" title="Permanent link">&para;</a></h3>
+<p>1) Install <a href="https://golang.org/dl/">Go 1.8+</a></p>
+<p>2) Install Ponzu CLI:</p>
+<div class="codehilite"><pre><span></span>$ go get github.com/ponzu-cms/ponzu/…
+</pre></div>
+
+
+<p>3) Create a new project (path is created in your GOPATH):</p>
+<div class="codehilite"><pre><span></span>$ ponzu new github.com/nilslice/reviews
+</pre></div>
+
+
+<p>4) Enter your new project directory:</p>
+<div class="codehilite"><pre><span></span>$ <span class="nb">cd</span> <span class="nv">$GOPATH</span>/src/github.com/nilslice/reviews
+</pre></div>
+
+
+<p>5) Generate content type file and boilerplate code (creates <code>content/review.go</code>):</p>
+<div class="codehilite"><pre><span></span>$ ponzu generate content review title:<span class="s2">&quot;string&quot;</span> author:<span class="s2">&quot;string&quot;</span> rating:<span class="s2">&quot;float64&quot;</span> body:<span class="s2">&quot;string&quot;</span>:richtext website_url:<span class="s2">&quot;string&quot;</span> items:<span class="s2">&quot;[]string&quot;</span> photo:string:file<span class="sb">`</span>
+</pre></div>
+
+
+<p>6) Build your project:</p>
+<div class="codehilite"><pre><span></span>$ ponzu build
+</pre></div>
+
+
+<p>7) Run your project with defaults:</p>
+<div class="codehilite"><pre><span></span>$ ponzu run
+</pre></div>
+
+
+<p>8) Open browser to <a href="http://localhost:8080/admin"><code>http://localhost:8080/admin</code></a></p>
+<h3 id="notes">Notes<a class="headerlink" href="#notes" title="Permanent link">&para;</a></h3>
+<ul>
+<li>One-time initialization to set configuration</li>
+<li>All fields can be changed in Configuration afterward</li>
+</ul>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ Using Addons
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../../References/Overview/" title="Overview" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ Overview
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/References/Overview/index.html b/docs/build/References/Overview/index.html
new file mode 100644
index 0000000..6766130
--- /dev/null
+++ b/docs/build/References/Overview/index.html
@@ -0,0 +1,1163 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>References in Ponzu</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ References
+ </span>
+
+
+ Overview
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9" checked>
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ Overview
+ </label>
+
+ <a href="./" title="Overview" class="md-nav__link md-nav__link--active">
+ Overview
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#create-your-content-types" title="Create Your Content Types" class="md-nav__link">
+ Create Your Content Types
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#designed-for-http2" title="Designed For HTTP/2" class="md-nav__link">
+ Designed For HTTP/2
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#requestresponse-multiplexing" title="Request/Response Multiplexing" class="md-nav__link">
+ Request/Response Multiplexing
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#server-push" title="Server Push" class="md-nav__link">
+ Server Push
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#example" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#other-considerations" title="Other Considerations" class="md-nav__link">
+ Other Considerations
+ </a>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#create-your-content-types" title="Create Your Content Types" class="md-nav__link">
+ Create Your Content Types
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#designed-for-http2" title="Designed For HTTP/2" class="md-nav__link">
+ Designed For HTTP/2
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#requestresponse-multiplexing" title="Request/Response Multiplexing" class="md-nav__link">
+ Request/Response Multiplexing
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#server-push" title="Server Push" class="md-nav__link">
+ Server Push
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#example" title="Example" class="md-nav__link">
+ Example
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#other-considerations" title="Other Considerations" class="md-nav__link">
+ Other Considerations
+ </a>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>Overview</h1>
+
+ <p>References in Ponzu allow you to create relationships between your Content types.
+Ponzu uses an embedded database, rather than a more traditional relational database
+with SQL support. This may seem unnatural since there is no native concept of
+"foreign keys" or "joins" like you may be used to. Instead, Ponzu wires up your
+data using references, which are simply URL paths, like <code>/api/content?type=Post&amp;id=1</code></p>
+<p>A foreign key as a URL path?! Am I crazy? No! For the purpose Ponzu serves,
+this structure works quite well, especially given its creation was specifically
+tuned for HTTP/2 features such as "Request/Response Multiplexing" and "Server Push." </p>
+<p>There is a deeper dive into the HTTP/2 concepts <a href="../../References/Overview/#designed-for-http2">below</a>, but first we'll walk through
+a quick tutorial on Ponzu's references. </p>
+<p>To generate references from the CLI, please <a href="../../CLI/Generating-References">read through the documentation</a>.
+The example below assumes you understand the syntax. </p>
+<hr />
+<h3 id="create-your-content-types">Create Your Content Types<a class="headerlink" href="#create-your-content-types" title="Permanent link">&para;</a></h3>
+<p>Here we are creating two Content types, <code>Author</code> and <code>Book</code>. A <code>Book</code> will keep
+a reference to an <code>Author</code> in the sense that an author wrote the book.</p>
+<div class="codehilite"><pre><span></span>$ ponzu gen c author name:string photo:string:file bio:string:textarea
+$ ponzu gen c book title:string author:@author,name pages:int year:int
+</pre></div>
+
+
+<p>The structs generated for each look like:</p>
+<p><code>content/author.go</code></p>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Author</span> <span class="kd">struct</span> <span class="p">{</span>
+ <span class="nx">item</span><span class="p">.</span><span class="nx">Item</span>
+
+ <span class="nx">Name</span> <span class="kt">string</span> <span class="s">`json:&quot;name&quot;`</span>
+ <span class="nx">Photo</span> <span class="kt">string</span> <span class="s">`json:&quot;photo&quot;`</span>
+ <span class="nx">Bio</span> <span class="kt">string</span> <span class="s">`json:&quot;bio&quot;`</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p><code>content/book.go</code></p>
+<div class="codehilite"><pre><span></span><span class="kd">type</span> <span class="nx">Book</span> <span class="kd">struct</span> <span class="p">{</span>
+ <span class="nx">item</span><span class="p">.</span><span class="nx">Item</span>
+
+ <span class="nx">Title</span> <span class="kt">string</span> <span class="s">`json:&quot;title&quot;`</span>
+ <span class="nx">Author</span> <span class="kt">string</span> <span class="s">`json:&quot;author&quot;`</span>
+ <span class="nx">Pages</span> <span class="kt">int</span> <span class="s">`json:&quot;pages&quot;`</span>
+ <span class="nx">Year</span> <span class="kt">int</span> <span class="s">`json:&quot;year&quot;`</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>Notice how the <code>Author</code> field within the <code>Book</code> struct is a <code>string</code> type, not
+an <code>Author</code> type. This is because the <code>Author</code> is stored as a <code>string</code> in our
+database, as a reference to the <code>Author</code>, instead of embedding the <code>Author</code> data
+inside the <code>Book</code>. </p>
+<p>Some example JSON data for the two structs looks like:</p>
+<p><kbd>GET</kbd> <code>/api/content?type=Author&amp;id=1</code> (<code>Author</code>)</p>
+<div class="codehilite"><pre><span></span><span class="p">{</span>
+ <span class="nt">&quot;data&quot;</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="nt">&quot;uuid&quot;</span><span class="p">:</span> <span class="s2">&quot;024a5797-e064-4ee0-abe3-415cb6d3ed18&quot;</span><span class="p">,</span>
+ <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
+ <span class="nt">&quot;slug&quot;</span><span class="p">:</span> <span class="s2">&quot;item-id-024a5797-e064-4ee0-abe3-415cb6d3ed18&quot;</span><span class="p">,</span>
+ <span class="nt">&quot;timestamp&quot;</span><span class="p">:</span> <span class="mi">1493926453826</span><span class="p">,</span>
+ <span class="nt">&quot;updated&quot;</span><span class="p">:</span> <span class="mi">1493926453826</span><span class="p">,</span>
+ <span class="nt">&quot;name&quot;</span><span class="p">:</span> <span class="s2">&quot;Shel Silverstein&quot;</span><span class="p">,</span>
+ <span class="nt">&quot;photo&quot;</span><span class="p">:</span> <span class="s2">&quot;/api/uploads/2017/05/shel-silverstein.jpg&quot;</span><span class="p">,</span>
+ <span class="nt">&quot;bio&quot;</span><span class="p">:</span> <span class="s2">&quot;Sheldon Allan Silverstein was an American poet...&quot;</span>
+ <span class="p">}</span>
+ <span class="p">]</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p><kbd>GET</kbd> <code>/api/content?type=Book&amp;id=1</code> (<code>Book</code>)</p>
+<div class="codehilite"><pre><span></span><span class="p">{</span>
+ <span class="nt">&quot;data&quot;</span><span class="p">:</span> <span class="p">[</span>
+ <span class="p">{</span>
+ <span class="nt">&quot;uuid&quot;</span><span class="p">:</span> <span class="s2">&quot;024a5797-e064-4ee0-abe3-415cb6d3ed18&quot;</span><span class="p">,</span>
+ <span class="nt">&quot;id&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
+ <span class="nt">&quot;slug&quot;</span><span class="p">:</span> <span class="s2">&quot;item-id-024a5797-e064-4ee0-abe3-415cb6d3ed18&quot;</span><span class="p">,</span>
+ <span class="nt">&quot;timestamp&quot;</span><span class="p">:</span> <span class="mi">1493926453826</span><span class="p">,</span>
+ <span class="nt">&quot;updated&quot;</span><span class="p">:</span> <span class="mi">1493926453826</span><span class="p">,</span>
+ <span class="nt">&quot;title&quot;</span><span class="p">:</span> <span class="s2">&quot;The Giving Tree&quot;</span><span class="p">,</span>
+ <span class="nt">&quot;author&quot;</span><span class="p">:</span> <span class="s2">&quot;/api/content?type=Author&amp;id=1&quot;</span><span class="p">,</span>
+ <span class="nt">&quot;pages&quot;</span><span class="p">:</span> <span class="mi">57</span><span class="p">,</span>
+ <span class="nt">&quot;year&quot;</span><span class="p">:</span> <span class="mi">1964</span>
+ <span class="p">}</span>
+ <span class="p">]</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>As you can see, the <code>Author</code> is a reference as the <code>author</code> field in the JSON
+response for a <code>Book</code>. When you're building your client, you need to make a second
+request for the <code>Author</code>, to the URL path found in the <code>author</code> field of the <code>Book</code>
+response. </p>
+<p>For example, in pseudo-code: </p>
+<div class="codehilite"><pre><span></span><span class="c1"># Request 1: </span>
+<span class="nv">$book</span> <span class="o">=</span> GET /api/content?type<span class="o">=</span>Book<span class="p">&amp;</span><span class="nv">id</span><span class="o">=</span><span class="m">1</span>
+
+<span class="c1"># Request 2: </span>
+<span class="nv">$author</span> <span class="o">=</span> GET <span class="nv">$book</span>.author <span class="c1"># where author = /api/content?type=Author&amp;id=1</span>
+</pre></div>
+
+
+<p>Until recently, this would be considered bad practice and would be costly to do
+over HTTP. However, with the wide availability of HTTP/2 clients, including all
+modern web browsers, mobile devices, and HTTP/2 libraries in practically every
+programming language, this pattern is fast and scalable. </p>
+<hr />
+<h3 id="designed-for-http2">Designed For HTTP/2<a class="headerlink" href="#designed-for-http2" title="Permanent link">&para;</a></h3>
+<p>At this point, you've likely noticed that you're still making two independent
+HTTP requests to your Ponzu server. Further, if there are multiple references or more
+than one item, you'll be making many requests -- <em>how can that be efficient?</em> </p>
+<p>There are two main concepts at play: Request/Response Multiplexing and Server Push.</p>
+<h4 id="requestresponse-multiplexing">Request/Response Multiplexing<a class="headerlink" href="#requestresponse-multiplexing" title="Permanent link">&para;</a></h4>
+<p>With HTTP/2, a client and server (peers) transfer data over a single TCP connection,
+and can send data back and forth at the same time. No longer does a request need
+to wait to be sent until after an expected response is read. This means that HTTP
+requests can be sent much faster and at the <em>same time</em> on a single connection.
+Where previously, a client would open up several TCP connections, the re-use of a
+single connection reduces CPU overhead and makes the server more efficient.</p>
+<p>This feature is automatically provided to you when using HTTP/2 - the only
+requirement is that you connect via HTTPS and have active TLS certificates, which
+you can get for free by running Ponzu with the <code>--https</code> flag and configuring it
+with a properly set, active domain name of your own. </p>
+<h4 id="server-push">Server Push<a class="headerlink" href="#server-push" title="Permanent link">&para;</a></h4>
+<p>Another impactful feature of HTTP/2 is "Server Push": the ability to preemptively
+send a response from the server to a client without waiting for a request. This
+is where Ponzu's reference design really shows it's power. Let's revisit the
+example from above:</p>
+<div class="codehilite"><pre><span></span><span class="c1"># Request 1: </span>
+<span class="nv">$book</span> <span class="o">=</span> GET /api/content?type<span class="o">=</span>Book<span class="p">&amp;</span><span class="nv">id</span><span class="o">=</span><span class="m">1</span>
+
+<span class="c1"># Request 2: </span>
+<span class="nv">$author</span> <span class="o">=</span> GET <span class="nv">$book</span>.author <span class="c1"># where author = /api/content?type=Author&amp;id=1</span>
+</pre></div>
+
+
+<p>Instead of waiting for the server to respond with the data for <code>$book.author</code>,
+the response data is already in the client's cache before we even make the request!
+Now there is no round-trip made to the server and back, and the client reads the
+pushed response from cache in fractions of a millisecond. </p>
+<p>But, how does the server know which response to push and when? You'll need to
+specify which fields of the type you've requested should be pushed. This is done
+by implementing the <a href="../../Interfaces/Item#itempushable"><code>item.Pushable</code> interface</a>.
+See the example below which demonstrates a complete implementation on the <code>Book</code>
+struct, which has a reference to an <code>Author</code>.</p>
+<h5 id="example">Example<a class="headerlink" href="#example" title="Permanent link">&para;</a></h5>
+<p><code>content/book.go</code></p>
+<div class="codehilite"><pre><span></span><span class="o">...</span>
+<span class="kd">type</span> <span class="nx">Book</span> <span class="kd">struct</span> <span class="p">{</span>
+ <span class="nx">item</span><span class="p">.</span><span class="nx">Item</span>
+
+ <span class="nx">Title</span> <span class="kt">string</span> <span class="s">`json:&quot;title&quot;`</span>
+ <span class="nx">Author</span> <span class="kt">string</span> <span class="s">`json:&quot;author&quot;`</span>
+ <span class="nx">Pages</span> <span class="kt">int</span> <span class="s">`json:&quot;pages&quot;`</span>
+ <span class="nx">Year</span> <span class="kt">int</span> <span class="s">`json:&quot;year&quot;`</span>
+<span class="p">}</span>
+
+
+<span class="kd">func</span> <span class="p">(</span><span class="nx">b</span> <span class="o">*</span><span class="nx">Book</span><span class="p">)</span> <span class="nx">Push</span><span class="p">()</span> <span class="p">[]</span><span class="kt">string</span> <span class="p">{</span>
+ <span class="k">return</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span>
+ <span class="c1">// the json struct tag is used to tell the server which</span>
+ <span class="c1">// field(s) it should push - only URL paths originating</span>
+ <span class="c1">// from your server can be pushed!</span>
+ <span class="s">&quot;author&quot;</span><span class="p">,</span>
+ <span class="p">}</span>
+<span class="p">}</span>
+<span class="o">...</span>
+</pre></div>
+
+
+<p>Now, whenever a single <code>Book</code> is requested, the server will preemptively push the
+<code>Author</code> referenced by the book. The response for the <code>Author</code> will <em>already be
+on the client</em> and will remain there until a request for the referenced <code>Author</code>
+has been made.</p>
+<div class="admonition note">
+<p class="admonition-title">What else can I Push?</p>
+<p>Only fields that are URL paths originating from your server can be pushed.
+This means that you could also implement <code>item.Pushable</code> on the <code>Author</code>
+type, and return <code>[]string{"photo"}</code> to push the Author's image!</p>
+</div>
+<hr />
+<h3 id="other-considerations">Other Considerations<a class="headerlink" href="#other-considerations" title="Permanent link">&para;</a></h3>
+<p>HTTP/2 Server Push is a powerful feature, but it can be abused just like anything
+else. To try and help mitigate potential issues, Ponzu has put some "stop-gaps"
+in place. Server Push is only activated on <strong>single item</strong> API responses, so you
+shouldn't expect to see references or files pushed from the <code>/api/contents</code> endpoint.
+An exception to this is the <code>/api/search</code> endpoint, which only the <strong>first</strong>
+result is pushed (if applicable) no matter how many items are in the response. </p>
+<p>You should take advantage of HTTP/2 in Ponzu and get the most out of the system.
+With the automatic HTTPS feature, there is no reason not to and you gain the
+additional benefit of encrypting your traffic - which your users will appreciate!</p>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ Overview
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ Backups
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/Running-Backups/Backups/index.html b/docs/build/Running-Backups/Backups/index.html
new file mode 100644
index 0000000..aabe029
--- /dev/null
+++ b/docs/build/Running-Backups/Backups/index.html
@@ -0,0 +1,912 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>Running Backups on Ponzu systems</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ Running Backups
+ </span>
+
+
+ Backups
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10" checked>
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ Backups
+ </label>
+
+ <a href="./" title="Backups" class="md-nav__link md-nav__link--active">
+ Backups
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#system-analytics" title="System &amp; Analytics" class="md-nav__link">
+ System &amp; Analytics
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#uploads" title="Uploads" class="md-nav__link">
+ Uploads
+ </a>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#system-analytics" title="System &amp; Analytics" class="md-nav__link">
+ System &amp; Analytics
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#uploads" title="Uploads" class="md-nav__link">
+ Uploads
+ </a>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>Backups</h1>
+
+ <p>Both the databases <code>system.db</code> &amp; <code>analytics.db</code>, and the <code>/uploads</code> directory can be backed up over HTTP using <code>wget</code>, <code>curl</code>, etc. All of which are located at the <code>/admin/backup</code> route and require HTTP Basic Auth. In order to enable backups, you must add a user/password pair inside the CMS Configuration at <code>/admin/configure</code> near the bottom of the page.</p>
+<p>All backups are made using a <code>GET</code> request to the <code>/admin/backup</code> path with a query parameter of <code>?source={system,analytics,uploads}</code> (only one source can be included in the URL).</p>
+<p>Here are some full backup scripts to use or modify to fit your needs:
+<a href="https://github.com/ponzu-cms/backup-scripts">https://github.com/ponzu-cms/backup-scripts</a></p>
+<h2 id="system-analytics">System &amp; Analytics<a class="headerlink" href="#system-analytics" title="Permanent link">&para;</a></h2>
+<p>The <code>system.db</code> &amp; <code>analytics.db</code> data files are sent uncompressed in their original form as they exist on your server. No temporary copy is stored on the origin server, and it is possible that the backup could fail so checking for successful backups is recommended. See https://github.com/boltdb/bolt#database-backups for more information about how BoltDB handles HTTP backups.</p>
+<p>An example backup request for the <code>system.db</code> data file would look like:</p>
+<div class="codehilite"><pre><span></span>$ curl --user user:pass <span class="s2">&quot;https://example.com/admin/backup?source=system&quot;</span> &gt; system.db.bak
+</pre></div>
+
+
+<h2 id="uploads">Uploads<a class="headerlink" href="#uploads" title="Permanent link">&para;</a></h2>
+<p>The <code>/uploads</code> directory is gzip compressed and archived as a tar file, stored in the temporary directory (typically <code>/tmp</code> on Linux) on your origin server with a timestamp in the file name. </p>
+<p>An example backup request for the <code>/uploads</code> directory would look like:</p>
+<div class="codehilite"><pre><span></span>$ curl --user user:pass <span class="s2">&quot;https://example.com/admin/backup?source=uploads&quot;</span> &gt; uploads.tar.gz
+<span class="c1"># unarchive the tarball with gzip </span>
+$ tar xzf uploads.tar.gz
+</pre></div>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../../References/Overview/" title="Overview" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ Overview
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ Settings
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/System-Configuration/Settings/index.html b/docs/build/System-Configuration/Settings/index.html
new file mode 100644
index 0000000..cafc145
--- /dev/null
+++ b/docs/build/System-Configuration/Settings/index.html
@@ -0,0 +1,1131 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>Configuring Your Ponzu System Settings</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ System Configuration
+ </span>
+
+
+ Settings
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11" checked>
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ Settings
+ </label>
+
+ <a href="./" title="Settings" class="md-nav__link md-nav__link--active">
+ Settings
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#site-name" title="Site Name" class="md-nav__link">
+ Site Name
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#domain-name" title="Domain Name" class="md-nav__link">
+ Domain Name
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#development-environment" title="Development Environment" class="md-nav__link">
+ Development Environment
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#administrator-email" title="Administrator Email" class="md-nav__link">
+ Administrator Email
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#client-secret" title="Client Secret" class="md-nav__link">
+ Client Secret
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#etag-header" title="Etag Header" class="md-nav__link">
+ Etag Header
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#cors" title="CORS" class="md-nav__link">
+ CORS
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#gzip" title="GZIP" class="md-nav__link">
+ GZIP
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#http-cache" title="HTTP Cache" class="md-nav__link">
+ HTTP Cache
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#invalidate-cache" title="Invalidate Cache" class="md-nav__link">
+ Invalidate Cache
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#database-backup-credentials" title="Database Backup Credentials" class="md-nav__link">
+ Database Backup Credentials
+ </a>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#site-name" title="Site Name" class="md-nav__link">
+ Site Name
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#domain-name" title="Domain Name" class="md-nav__link">
+ Domain Name
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#development-environment" title="Development Environment" class="md-nav__link">
+ Development Environment
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#administrator-email" title="Administrator Email" class="md-nav__link">
+ Administrator Email
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#client-secret" title="Client Secret" class="md-nav__link">
+ Client Secret
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#etag-header" title="Etag Header" class="md-nav__link">
+ Etag Header
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#cors" title="CORS" class="md-nav__link">
+ CORS
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#gzip" title="GZIP" class="md-nav__link">
+ GZIP
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#http-cache" title="HTTP Cache" class="md-nav__link">
+ HTTP Cache
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#invalidate-cache" title="Invalidate Cache" class="md-nav__link">
+ Invalidate Cache
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#database-backup-credentials" title="Database Backup Credentials" class="md-nav__link">
+ Database Backup Credentials
+ </a>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>Settings</h1>
+
+ <p>Ponzu has several options which can be configured at run-time. To view these
+configuration settings, visit the <code>/admin/configure</code> page of your Ponzu CMS.</p>
+<hr />
+<h4 id="site-name">Site Name<a class="headerlink" href="#site-name" title="Permanent link">&para;</a></h4>
+<p>The Site Name setting changes the displayed name on your admin dashboard. This is
+visible publicly on the <code>/admin/login</code> page.</p>
+<hr />
+<h4 id="domain-name">Domain Name<a class="headerlink" href="#domain-name" title="Permanent link">&para;</a></h4>
+<p>Internally, Ponzu needs to know where its canonical HTTP access origin is, and
+requires you to add the qualified domain name you are using. In development, use
+<code>localhost</code> or some other name mapped to the loopback address (<code>127.0.0.1</code>).</p>
+<p>Once you have deployed your Ponzu server to a remote host and pointed a public
+domain at it, you need to change the Domain Name setting to match. This is
+especially important when fetching TLS (SSL) certificates from <a href="https://letsencrypt.org">Let's Encrypt</a>
+- since the process requires an active, verifiable domain. To set up your server
+with TLS over HTTPS connections, follow these steps:</p>
+<ol>
+<li>Set your Domain Name in the system configuration</li>
+<li>Set the Administrator Email to register with Let's Encrypt</li>
+<li>Stop your Ponzu server</li>
+<li>Run your Ponzu server with the <code>--https</code> flag e.g. <code>$ ponzu run --https</code></li>
+<li>Visit your CMS admin with <code>https://</code> prepended to your URL</li>
+</ol>
+<div class="admonition success">
+<p class="admonition-title">Verifying HTTPS / TLS Connections</p>
+<p>If successful, your APIs and CMS will be accessible via HTTPS, and you will
+see a green indicator near the URL bar of most browsers. This also enables
+your server to use the HTTP/2 protocol.</p>
+</div>
+<h5 id="development-environment">Development Environment<a class="headerlink" href="#development-environment" title="Permanent link">&para;</a></h5>
+<p>You can test HTTPS &amp; HTTP/2 connections in your development environment on <code>localhost</code>,
+by running Ponzu with the <code>--devhttps</code> flag e.g. <code>$ ponzu --devhttps run</code> </p>
+<p>If you're greeted with a warning from the browser saying the connection is not
+secure, follow the steps outlined in the CLI message, or here:</p>
+<div class="codehilite"><pre><span></span>If your browser rejects HTTPS requests, try allowing insecure connections on localhost.
+on Chrome, visit chrome://flags/#allow-insecure-localhost
+</pre></div>
+
+
+<hr />
+<h4 id="administrator-email">Administrator Email<a class="headerlink" href="#administrator-email" title="Permanent link">&para;</a></h4>
+<p>The Administrator Email is the contact email for the person who is the main admin
+of your Ponzu CMS. This can be changed at any point, but once a Let's Encrypt
+certificate has been fetched using an Administrator Email, it will remain the
+contact until a new certificate is requested. </p>
+<hr />
+<h4 id="client-secret">Client Secret<a class="headerlink" href="#client-secret" title="Permanent link">&para;</a></h4>
+<p>The Client Secret is a secure value used by the server to sign tokens and authenticate requests.
+<strong>Do not share this</strong> value with any untrusted party.</p>
+<div class="admonition danger">
+<p class="admonition-title">Security and the Client Secret</p>
+<p>HTTP requests with a valid token, signed with the Client Secret, can take any
+action an Admin can within the CMS. Be cautious of this when sharing account
+logins or details with anyone.</p>
+</div>
+<hr />
+<h4 id="etag-header">Etag Header<a class="headerlink" href="#etag-header" title="Permanent link">&para;</a></h4>
+<p>The Etag Header value is automatically created when content is changed and serves
+as a caching validation mechanism.</p>
+<hr />
+<h4 id="cors">CORS<a class="headerlink" href="#cors" title="Permanent link">&para;</a></h4>
+<p>CORS, or "Cross-Origin Resource Sharing" is a security setting which defines how
+resources (or URLs) can be accessed from outside clients / domains. By default,
+Ponzu HTTP APIs can be accessed from any origin, meaning a script from an unknown
+website could fetch data. </p>
+<p>By disabling CORS, you limit API requests to only the Domain Name you set.</p>
+<hr />
+<h4 id="gzip">GZIP<a class="headerlink" href="#gzip" title="Permanent link">&para;</a></h4>
+<p>GZIP is a popular codec which when applied to most HTTP responses, decreases data
+transmission size and response times. The GZIP setting on Ponzu has a minor
+side-effect of using more CPU, so you can disable it if you notice your system
+is CPU-constrained. However, traffic levels would need to be extremely demanding
+for this to be noticeable.</p>
+<hr />
+<h4 id="http-cache">HTTP Cache<a class="headerlink" href="#http-cache" title="Permanent link">&para;</a></h4>
+<p>The HTTP Cache configuration allows a system to disable the default HTTP cache,
+which saves the server from repeating API queries and sending responses -- it's
+generally advised to keep this enabled unless you have <em>frequently</em> changing data.</p>
+<p>The <code>Max-Age</code> value setting overrides the default 2592000-second (30 day) cache
+<code>max-age</code> duration set in API response headers. The <code>0</code> value is an alias to
+<code>2592000</code>, so check the <code>Disable HTTP Cache</code> box if you don't want any caching.</p>
+<hr />
+<h4 id="invalidate-cache">Invalidate Cache<a class="headerlink" href="#invalidate-cache" title="Permanent link">&para;</a></h4>
+<p>If this box is checked and then the configuration is saved, the server will
+re-generate an Etag to send in responses. By doing so, the cache becomes invalidated
+and reset so new content or assets will be included in previously cached responses.</p>
+<p>The cache is invalidated when content changes, so this is typically not a widely
+used setting.</p>
+<hr />
+<h4 id="database-backup-credentials">Database Backup Credentials<a class="headerlink" href="#database-backup-credentials" title="Permanent link">&para;</a></h4>
+<p>In order to enable HTTP backups of the components that make up your system, you
+will need to add an HTTP Basic Auth user and password pair. When used to
+<a href="../../Running-Backups/Backups">run backups</a>, the <code>user:password</code> pair tells your server
+that the backup request is made from a trusted party. </p>
+<div class="admonition danger">
+<p class="admonition-title">Backup Access with Credentials</p>
+<p>This <code>user:password</code> pair should not be shared outside of your organization as
+it allows full database downloads and archives of your system's uploads.</p>
+</div>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ Backups
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../../System-Deployment/Docker/" title="Docker" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ Docker
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/System-Deployment/Docker/index.html b/docs/build/System-Deployment/Docker/index.html
new file mode 100644
index 0000000..557b538
--- /dev/null
+++ b/docs/build/System-Deployment/Docker/index.html
@@ -0,0 +1,977 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>Docker - Ponzu</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ System Deployment
+ </span>
+
+
+ Docker
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12" checked>
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ Docker
+ </label>
+
+ <a href="./" title="Docker" class="md-nav__link md-nav__link--active">
+ Docker
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#ponzu-docker-build" title="Ponzu Docker build" class="md-nav__link">
+ Ponzu Docker build
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#the-following-are-convenient-commands-during-development-of-ponzu-core" title="The following are convenient commands during development of Ponzu core:" class="md-nav__link">
+ The following are convenient commands during development of Ponzu core:
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#build-the-docker-image-run-from-the-root-of-the-project" title="Build the docker image. Run from the root of the project." class="md-nav__link">
+ Build the docker image. Run from the root of the project.
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#start-the-image-share-the-local-directory-and-pseudo-terminal-tty-into-for-debugging" title="Start the image, share the local directory and pseudo terminal (tty) into for debugging:" class="md-nav__link">
+ Start the image, share the local directory and pseudo terminal (tty) into for debugging:
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#ponzu-docker-build" title="Ponzu Docker build" class="md-nav__link">
+ Ponzu Docker build
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#the-following-are-convenient-commands-during-development-of-ponzu-core" title="The following are convenient commands during development of Ponzu core:" class="md-nav__link">
+ The following are convenient commands during development of Ponzu core:
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#build-the-docker-image-run-from-the-root-of-the-project" title="Build the docker image. Run from the root of the project." class="md-nav__link">
+ Build the docker image. Run from the root of the project.
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#start-the-image-share-the-local-directory-and-pseudo-terminal-tty-into-for-debugging" title="Start the image, share the local directory and pseudo terminal (tty) into for debugging:" class="md-nav__link">
+ Start the image, share the local directory and pseudo terminal (tty) into for debugging:
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>Docker</h1>
+
+ <h2 id="ponzu-docker-build">Ponzu Docker build<a class="headerlink" href="#ponzu-docker-build" title="Permanent link">&para;</a></h2>
+<p>Ponzu is distributed as a <a href="https://hub.docker.com/r/ponzu/ponzu/">docker image</a>,
+which aids in ponzu deployment. The Dockerfile in this directory is used by Ponzu
+to generate the docker image which contains the ponzu executable.</p>
+<p>If you are deploying your own Ponzu project, you can write a new Dockerfile that
+is based from the <code>ponzu/ponzu</code> image of your choice. For example:</p>
+<div class="codehilite"><pre><span></span><span class="k">FROM</span><span class="s"> ponzu/ponzu:latest</span>
+
+<span class="c"># your project set up ...</span>
+<span class="c"># ...</span>
+<span class="c"># ...</span>
+</pre></div>
+
+
+<h3 id="the-following-are-convenient-commands-during-development-of-ponzu-core">The following are convenient commands during development of Ponzu core:<a class="headerlink" href="#the-following-are-convenient-commands-during-development-of-ponzu-core" title="Permanent link">&para;</a></h3>
+<h4 id="build-the-docker-image-run-from-the-root-of-the-project">Build the docker image. Run from the root of the project.<a class="headerlink" href="#build-the-docker-image-run-from-the-root-of-the-project" title="Permanent link">&para;</a></h4>
+<div class="codehilite"><pre><span></span><span class="c1"># from the root of ponzu:</span>
+docker build -t ponzu-dev
+</pre></div>
+
+
+<h4 id="start-the-image-share-the-local-directory-and-pseudo-terminal-tty-into-for-debugging">Start the image, share the local directory and pseudo terminal (tty) into for debugging:<a class="headerlink" href="#start-the-image-share-the-local-directory-and-pseudo-terminal-tty-into-for-debugging" title="Permanent link">&para;</a></h4>
+<div class="codehilite"><pre><span></span>docker run -v <span class="k">$(</span><span class="nb">pwd</span><span class="k">)</span>:/go/src/github.com/ponzu-cms/ponzu -it ponzu-dev
+<span class="nb">pwd</span> <span class="c1"># will output the go src directory for ponzu</span>
+ponzu version <span class="c1"># will output the ponzu version</span>
+<span class="c1"># make an edit on your local and rebuild</span>
+go install ./...
+</pre></div>
+
+
+<p>Special thanks to <a href="https://github.com/krismeister"><strong>@krismeister</strong></a> for contributing this!</p>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ Settings
+ </span>
+ </div>
+ </a>
+
+
+ <a href="../SysV-Style/" title="SysV Style" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ SysV Style
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/System-Deployment/SysV-Style/index.html b/docs/build/System-Deployment/SysV-Style/index.html
new file mode 100644
index 0000000..25df784
--- /dev/null
+++ b/docs/build/System-Deployment/SysV-Style/index.html
@@ -0,0 +1,899 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="../../assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>Deploying Ponzu on Linux with System-V style init</title>
+
+
+
+ <script src="../../assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="../../assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="../.." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="../../images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+ <span class="md-header-nav__parent">
+ System Deployment
+ </span>
+
+
+ SysV Style
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="../../images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../.." title="Home" class="md-nav__link">
+ Home
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Interfaces/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../../System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12" checked>
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="../Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+ <a href="./" title="SysV Style" class="md-nav__link md-nav__link--active">
+ SysV Style
+ </a>
+
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1>SysV Style</h1>
+
+ <p>For reference, here is an example init script to run Ponzu servers. You must
+define the <code>PROJECT_DIR</code> &amp; <code>RUNAS</code> variables by replacing <code>&lt;PROJECT DIRECTORY&gt;</code>
+&amp; <code>&lt;USER&gt;</code> in the script below:</p>
+<div class="codehilite"><pre><span></span><span class="ch">#!/bin/sh</span>
+<span class="c1">### BEGIN INIT INFO</span>
+<span class="c1"># Provides: ponzu-server</span>
+<span class="c1"># Required-Start: $local_fs $network $named $time $syslog</span>
+<span class="c1"># Required-Stop: $local_fs $network $named $time $syslog</span>
+<span class="c1"># Default-Start: 2 3 4 5</span>
+<span class="c1"># Default-Stop: 0 1 6</span>
+<span class="c1"># Description: Ponzu API &amp; Admin server</span>
+<span class="c1">### END INIT INFO</span>
+
+<span class="nv">PROJECT_DIR</span><span class="o">=</span>&lt;PROJECT DIRECTORY&gt;
+<span class="nv">SCRIPT</span><span class="o">=</span><span class="s1">&#39;cd $PROJECT_DIR &amp;&amp; ponzu run --port=80&#39;</span> <span class="c1"># add --https here to get TLS/HTTPS</span>
+<span class="nv">RUNAS</span><span class="o">=</span>&lt;USER&gt;
+
+<span class="nv">PIDFILE</span><span class="o">=</span>/var/run/ponzu-server.pid
+<span class="nv">LOGFILE</span><span class="o">=</span>/var/log/ponzu-server.log
+
+start<span class="o">()</span> <span class="o">{</span>
+ <span class="k">if</span> <span class="o">[</span> -f /var/run/<span class="nv">$PIDNAME</span> <span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="nb">kill</span> -0 <span class="k">$(</span>cat /var/run/<span class="nv">$PIDNAME</span><span class="k">)</span><span class="p">;</span> <span class="k">then</span>
+ <span class="nb">echo</span> <span class="s1">&#39;Service already running&#39;</span> &gt;<span class="p">&amp;</span><span class="m">2</span>
+ <span class="k">return</span> <span class="m">1</span>
+ <span class="k">fi</span>
+ <span class="nb">echo</span> <span class="s1">&#39;Starting service…&#39;</span> &gt;<span class="p">&amp;</span><span class="m">2</span>
+ <span class="nb">local</span> <span class="nv">CMD</span><span class="o">=</span><span class="s2">&quot;</span><span class="nv">$SCRIPT</span><span class="s2"> &amp;&gt; \&quot;</span><span class="nv">$LOGFILE</span><span class="s2">\&quot; &amp; echo \$!&quot;</span>
+ su -c <span class="s2">&quot;</span><span class="nv">$CMD</span><span class="s2">&quot;</span> <span class="nv">$RUNAS</span> &gt; <span class="s2">&quot;</span><span class="nv">$PIDFILE</span><span class="s2">&quot;</span>
+ <span class="nb">echo</span> <span class="s1">&#39;Service started&#39;</span> &gt;<span class="p">&amp;</span><span class="m">2</span>
+<span class="o">}</span>
+
+stop<span class="o">()</span> <span class="o">{</span>
+ <span class="k">if</span> <span class="o">[</span> ! -f <span class="s2">&quot;</span><span class="nv">$PIDFILE</span><span class="s2">&quot;</span> <span class="o">]</span> <span class="o">||</span> ! <span class="nb">kill</span> -0 <span class="k">$(</span>cat <span class="s2">&quot;</span><span class="nv">$PIDFILE</span><span class="s2">&quot;</span><span class="k">)</span><span class="p">;</span> <span class="k">then</span>
+ <span class="nb">echo</span> <span class="s1">&#39;Service not running&#39;</span> &gt;<span class="p">&amp;</span><span class="m">2</span>
+ <span class="k">return</span> <span class="m">1</span>
+ <span class="k">fi</span>
+ <span class="nb">echo</span> <span class="s1">&#39;Stopping service…&#39;</span> &gt;<span class="p">&amp;</span><span class="m">2</span>
+ <span class="nb">kill</span> -15 <span class="k">$(</span>cat <span class="s2">&quot;</span><span class="nv">$PIDFILE</span><span class="s2">&quot;</span><span class="k">)</span> <span class="o">&amp;&amp;</span> rm -f <span class="s2">&quot;</span><span class="nv">$PIDFILE</span><span class="s2">&quot;</span>
+ <span class="nb">echo</span> <span class="s1">&#39;Service stopped&#39;</span> &gt;<span class="p">&amp;</span><span class="m">2</span>
+<span class="o">}</span>
+
+uninstall<span class="o">()</span> <span class="o">{</span>
+ <span class="nb">echo</span> -n <span class="s2">&quot;Are you really sure you want to uninstall this service? That cannot be undone. [yes|No] &quot;</span>
+ <span class="nb">local</span> SURE
+ <span class="nb">read</span> SURE
+ <span class="k">if</span> <span class="o">[</span> <span class="s2">&quot;</span><span class="nv">$SURE</span><span class="s2">&quot;</span> <span class="o">=</span> <span class="s2">&quot;yes&quot;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
+ stop
+ rm -f <span class="s2">&quot;</span><span class="nv">$PIDFILE</span><span class="s2">&quot;</span>
+ <span class="nb">echo</span> <span class="s2">&quot;Notice: log file is not be removed: &#39;</span><span class="nv">$LOGFILE</span><span class="s2">&#39;&quot;</span> &gt;<span class="p">&amp;</span><span class="m">2</span>
+ update-rc.d -f &lt;NAME&gt; remove
+ rm -fv <span class="s2">&quot;</span><span class="nv">$0</span><span class="s2">&quot;</span>
+ <span class="k">fi</span>
+<span class="o">}</span>
+
+<span class="k">case</span> <span class="s2">&quot;</span><span class="nv">$1</span><span class="s2">&quot;</span> in
+ start<span class="o">)</span>
+ start
+ <span class="p">;;</span>
+ stop<span class="o">)</span>
+ stop
+ <span class="p">;;</span>
+ uninstall<span class="o">)</span>
+ uninstall
+ <span class="p">;;</span>
+ restart<span class="o">)</span>
+ stop
+ start
+ <span class="p">;;</span>
+ *<span class="o">)</span>
+ <span class="nb">echo</span> <span class="s2">&quot;Usage: </span><span class="nv">$0</span><span class="s2"> {start|stop|restart|uninstall}&quot;</span>
+<span class="k">esac</span>
+</pre></div>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+ <a href="../Docker/" title="Docker" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Previous
+ </span>
+ Docker
+ </span>
+ </div>
+ </a>
+
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="../../assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"../.."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/assets/images/favicon.ico b/docs/build/assets/images/favicon.ico
new file mode 100644
index 0000000..e85006a
--- /dev/null
+++ b/docs/build/assets/images/favicon.ico
Binary files differ
diff --git a/docs/build/assets/images/icons/bitbucket-670608a71a.svg b/docs/build/assets/images/icons/bitbucket-670608a71a.svg
new file mode 100644
index 0000000..7d95cb2
--- /dev/null
+++ b/docs/build/assets/images/icons/bitbucket-670608a71a.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="352" height="448" viewBox="0 0 352 448" id="bitbucket"><path fill="currentColor" d="M203.75 214.75q2 15.75-12.625 25.25t-27.875 1.5q-9.75-4.25-13.375-14.5t-.125-20.5 13-14.5q9-4.5 18.125-3t16 8.875 6.875 16.875zm27.75-5.25q-3.5-26.75-28.25-41T154 165.25q-15.75 7-25.125 22.125t-8.625 32.375q1 22.75 19.375 38.75t41.375 14q22.75-2 38-21t12.5-42zM291.25 74q-5-6.75-14-11.125t-14.5-5.5T245 54.25q-72.75-11.75-141.5.5-10.75 1.75-16.5 3t-13.75 5.5T60.75 74q7.5 7 19 11.375t18.375 5.5T120 93.75Q177 101 232 94q15.75-2 22.375-3t18.125-5.375T291.25 74zm14.25 258.75q-2 6.5-3.875 19.125t-3.5 21-7.125 17.5-14.5 14.125q-21.5 12-47.375 17.875t-50.5 5.5-50.375-4.625q-11.5-2-20.375-4.5T88.75 412 70.5 401.125t-13-15.375q-6.25-24-14.25-73l1.5-4 4.5-2.25q55.75 37 126.625 37t126.875-37q5.25 1.5 6 5.75t-1.25 11.25-2 9.25zM350.75 92.5q-6.5 41.75-27.75 163.75-1.25 7.5-6.75 14t-10.875 10T291.75 288q-63 31.5-152.5 22-62-6.75-98.5-34.75-3.75-3-6.375-6.625t-4.25-8.75-2.25-8.5-1.5-9.875T25 232.75q-2.25-12.5-6.625-37.5t-7-40.375T5.5 118 0 78.5Q.75 72 4.375 66.375T12.25 57t11.25-7.5T35 43.875t12-4.625q31.25-11.5 78.25-16 94.75-9.25 169 12.5Q333 47.25 348 66.25q4 5 4.125 12.75t-1.375 13.5z"/></svg> \ No newline at end of file
diff --git a/docs/build/assets/images/icons/github-1da075986e.svg b/docs/build/assets/images/icons/github-1da075986e.svg
new file mode 100644
index 0000000..3cacb2e
--- /dev/null
+++ b/docs/build/assets/images/icons/github-1da075986e.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg> \ No newline at end of file
diff --git a/docs/build/assets/images/icons/gitlab-5ad3f9f9e5.svg b/docs/build/assets/images/icons/gitlab-5ad3f9f9e5.svg
new file mode 100644
index 0000000..b036a9b
--- /dev/null
+++ b/docs/build/assets/images/icons/gitlab-5ad3f9f9e5.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500" viewBox="0 0 500 500" id="gitlab"><path fill="currentColor" d="M93.667 473.347l90.684-279.097H2.983l90.684 279.097z" transform="translate(156.198 1.16)"/><path fill="currentColor" d="M221.333 473.345L130.649 194.25H3.557l217.776 279.095z" transform="translate(28.531 1.16)" opacity=".7"/><path fill="currentColor" d="M32 195.155L4.441 279.97a18.773 18.773 0 0 0 6.821 20.99l238.514 173.29L32 195.155z" transform="translate(.089 .256)" opacity=".5"/><path fill="currentColor" d="M2.667-84.844h127.092L75.14-252.942c-2.811-8.649-15.047-8.649-17.856 0L2.667-84.844z" transform="translate(29.422 280.256)"/><path fill="currentColor" d="M2.667 473.345L93.351 194.25h127.092L2.667 473.345z" transform="translate(247.198 1.16)" opacity=".7"/><path fill="currentColor" d="M221.334 195.155l27.559 84.815a18.772 18.772 0 0 1-6.821 20.99L3.557 474.25l217.777-279.095z" transform="translate(246.307 .256)" opacity=".5"/><path fill="currentColor" d="M130.667-84.844H3.575l54.618-168.098c2.811-8.649 15.047-8.649 17.856 0l54.618 168.098z" transform="translate(336.974 280.256)"/></svg> \ No newline at end of file
diff --git a/docs/build/assets/javascripts/application-6b599127bc.js b/docs/build/assets/javascripts/application-6b599127bc.js
new file mode 100644
index 0000000..8228c7e
--- /dev/null
+++ b/docs/build/assets/javascripts/application-6b599127bc.js
@@ -0,0 +1,3 @@
+window.app=function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=95)}([function(e,t,n){"use strict";var r=n(30)("wks"),i=n(22),o=n(1).Symbol,s="function"==typeof o,a=e.exports=function(e){return r[e]||(r[e]=s&&o[e]||(s?o:i)("Symbol."+e))};a.store=r},function(e,t,n){"use strict";var r=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},function(e,t,n){"use strict";var r=n(11);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},function(e,t,n){"use strict";var r=n(12),i=n(29);e.exports=n(5)?function(e,t,n){return r.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){"use strict";var r=e.exports={version:"2.4.0"};"number"==typeof __e&&(__e=r)},function(e,t,n){"use strict";e.exports=!n(25)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,n){"use strict";var r={}.hasOwnProperty;e.exports=function(e,t){return r.call(e,t)}},function(e,t,n){"use strict";e.exports={}},function(e,t,n){"use strict";var r=n(1),i=n(3),o=n(6),s=n(22)("src"),a="toString",c=Function[a],u=(""+c).split(a);n(4).inspectSource=function(e){return c.call(e)},(e.exports=function(e,t,n,a){var c="function"==typeof n;c&&(o(n,"name")||i(n,"name",t)),e[t]!==n&&(c&&(o(n,s)||i(n,s,e[t]?""+e[t]:u.join(String(t)))),e===r?e[t]=n:a?e[t]?e[t]=n:i(e,t,n):(delete e[t],i(e,t,n)))})(Function.prototype,a,function(){return"function"==typeof this&&this[s]||c.call(this)})},function(e,t,n){"use strict";var r={}.toString;e.exports=function(e){return r.call(e).slice(8,-1)}},function(e,t,n){"use strict";var r=n(14);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};e.exports=function(e){return"object"===("undefined"==typeof e?"undefined":r(e))?null!==e:"function"==typeof e}},function(e,t,n){"use strict";var r=n(2),i=n(43),o=n(63),s=Object.defineProperty;t.f=n(5)?Object.defineProperty:function(e,t,n){if(r(e),t=o(t,!0),r(n),i)try{return s(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={createElement:function(e,t){var n=document.createElement(e);t&&Array.prototype.forEach.call(Object.keys(t),function(e){n.setAttribute(e,t[e])});for(var r=function e(t){Array.prototype.forEach.call(t,function(t){"string"==typeof t||"number"==typeof t?n.textContent+=t:Array.isArray(t)?e(t):"undefined"!=typeof t.__html?n.innerHTML+=t.__html:t instanceof Node&&n.appendChild(t)})},i=arguments.length,o=Array(i>2?i-2:0),s=2;s<i;s++)o[s-2]=arguments[s];return r(o),n}},e.exports=t.default},function(e,t,n){"use strict";e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,n){"use strict";var r=n(9),i=n(0)("toStringTag"),o="Arguments"==r(function(){return arguments}()),s=function(e,t){try{return e[t]}catch(e){}};e.exports=function(e){var t,n,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=s(t=Object(e),i))?n:o?r(t):"Object"==(a=r(t))&&"function"==typeof t.callee?"Arguments":a}},function(e,t,n){"use strict";e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){"use strict";var r=n(11),i=n(1).document,o=r(i)&&r(i.createElement);e.exports=function(e){return o?i.createElement(e):{}}},function(e,t,n){"use strict";var r=n(12).f,i=n(6),o=n(0)("toStringTag");e.exports=function(e,t,n){e&&!i(e=n?e:e.prototype,o)&&r(e,o,{configurable:!0,value:t})}},function(e,t,n){"use strict";var r=n(30)("keys"),i=n(22);e.exports=function(e){return r[e]||(r[e]=i(e))}},function(e,t,n){"use strict";var r=Math.ceil,i=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?i:r)(e)}},function(e,t,n){"use strict";var r=n(45),i=n(16);e.exports=function(e){return r(i(e))}},function(e,t,n){"use strict";var r=0,i=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++r+i).toString(36))}},function(e,t,n){"use strict";e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,n){"use strict";var r=n(1),i=n(4),o=n(3),s=n(8),a=n(10),c="prototype",u=function e(t,n,u){var l,f,h,d,p=t&e.F,m=t&e.G,v=t&e.S,y=t&e.P,g=t&e.B,w=m?r:v?r[n]||(r[n]={}):(r[n]||{})[c],b=m?i:i[n]||(i[n]={}),_=b[c]||(b[c]={});m&&(u=n);for(l in u)f=!p&&w&&void 0!==w[l],h=(f?w:u)[l],d=g&&f?a(h,r):y&&"function"==typeof h?a(Function.call,h):h,w&&s(w,l,h,t&e.U),b[l]!=h&&o(b,l,d),y&&_[l]!=h&&(_[l]=h)};r.core=i,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,e.exports=u},function(e,t,n){"use strict";e.exports=function(e){try{return!!e()}catch(e){return!0}}},function(e,t,n){"use strict";e.exports=n(1).document&&document.documentElement},function(e,t,n){"use strict";var r=n(28),i=n(24),o=n(8),s=n(3),a=n(6),c=n(7),u=n(48),l=n(18),f=n(54),h=n(0)("iterator"),d=!([].keys&&"next"in[].keys()),p="@@iterator",m="keys",v="values",y=function(){return this};e.exports=function(e,t,n,g,w,b,_){u(n,t,g);var x,E,k,S=function(e){if(!d&&e in O)return O[e];switch(e){case m:return function(){return new n(this,e)};case v:return function(){return new n(this,e)}}return function(){return new n(this,e)}},T=t+" Iterator",L=w==v,C=!1,O=e.prototype,P=O[h]||O[p]||w&&O[w],A=P||S(w),M=w?L?S("entries"):A:void 0,R="Array"==t?O.entries||P:P;if(R&&(k=f(R.call(new e)),k!==Object.prototype&&(l(k,T,!0),r||a(k,h)||s(k,h,y))),L&&P&&P.name!==v&&(C=!0,A=function(){return P.call(this)}),r&&!_||!d&&!C&&O[h]||s(O,h,A),c[t]=A,c[T]=y,w)if(x={values:L?A:S(v),keys:b?A:S(m),entries:M},_)for(E in x)E in O||o(O,E,x[E]);else i(i.P+i.F*(d||C),t,x);return x}},function(e,t,n){"use strict";e.exports=!1},function(e,t,n){"use strict";e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t,n){"use strict";var r=n(1),i="__core-js_shared__",o=r[i]||(r[i]={});e.exports=function(e){return o[e]||(o[e]={})}},function(e,t,n){"use strict";var r,i,o,s=n(10),a=n(44),c=n(26),u=n(17),l=n(1),f=l.process,h=l.setImmediate,d=l.clearImmediate,p=l.MessageChannel,m=0,v={},y="onreadystatechange",g=function(){var e=+this;if(v.hasOwnProperty(e)){var t=v[e];delete v[e],t()}},w=function(e){g.call(e.data)};h&&d||(h=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return v[++m]=function(){a("function"==typeof e?e:Function(e),t)},r(m),m},d=function(e){delete v[e]},"process"==n(9)(f)?r=function(e){f.nextTick(s(g,e,1))}:p?(i=new p,o=i.port2,i.port1.onmessage=w,r=s(o.postMessage,o,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(r=function(e){l.postMessage(e+"","*")},l.addEventListener("message",w,!1)):r=y in u("script")?function(e){c.appendChild(u("script"))[y]=function(){c.removeChild(this),g.call(e)}}:function(e){setTimeout(s(g,e,1),0)}),e.exports={set:h,clear:d}},function(e,t,n){"use strict";var r=n(20),i=Math.min;e.exports=function(e){return e>0?i(r(e),9007199254740991):0}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function(){function e(t,n,i){var o=this;r(this,e),this.els_=Array.prototype.slice.call("string"==typeof t?document.querySelectorAll(t):[].concat(t)),this.handler_="function"==typeof i?{update:i}:i,this.events_=[].concat(n),this.update_=function(e){return o.handler_.update(e)}}return i(e,[{key:"listen",value:function(){var e=this;this.els_.forEach(function(t){e.events_.forEach(function(n){t.addEventListener(n,e.update_,!1)})}),"function"==typeof this.handler_.setup&&this.handler_.setup()}},{key:"unlisten",value:function(){var e=this;this.els_.forEach(function(t){e.events_.forEach(function(n){t.removeEventListener(n,e.update_)})}),"function"==typeof this.handler_.reset&&this.handler_.reset()}}]),e}();t.a=o},function(e,t){(function(t){e.exports=t}).call(t,{})},function(e,t,n){"use strict";n(66),n(68),n(69),n(67),e.exports=n(4).Promise},function(e,t,n){"use strict";try{var r=new window.CustomEvent("test");if(r.preventDefault(),r.defaultPrevented!==!0)throw new Error("Could not prevent default")}catch(e){var i=function(e,t){var n,r;return t=t||{bubbles:!1,cancelable:!1,detail:void 0},n=document.createEvent("CustomEvent"),n.initCustomEvent(e,t.bubbles,t.cancelable,t.detail),r=n.preventDefault,n.preventDefault=function(){r.call(this);try{Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})}catch(e){this.defaultPrevented=!0}},n};i.prototype=window.Event.prototype,window.CustomEvent=i}},function(e,t,n){"use strict";!function(e){function t(e){if("string"!=typeof e&&(e=String(e)),/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(e))throw new TypeError("Invalid character in header field name");return e.toLowerCase()}function n(e){return"string"!=typeof e&&(e=String(e)),e}function r(e){var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return y.iterable&&(t[Symbol.iterator]=function(){return t}),t}function i(e){this.map={},e instanceof i?e.forEach(function(e,t){this.append(t,e)},this):e&&Object.getOwnPropertyNames(e).forEach(function(t){this.append(t,e[t])},this)}function o(e){return e.bodyUsed?Promise.reject(new TypeError("Already read")):void(e.bodyUsed=!0)}function s(e){return new Promise(function(t,n){e.onload=function(){t(e.result)},e.onerror=function(){n(e.error)}})}function a(e){var t=new FileReader,n=s(t);return t.readAsArrayBuffer(e),n}function c(e){var t=new FileReader,n=s(t);return t.readAsText(e),n}function u(e){for(var t=new Uint8Array(e),n=new Array(t.length),r=0;r<t.length;r++)n[r]=String.fromCharCode(t[r]);return n.join("")}function l(e){if(e.slice)return e.slice(0);var t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e)),t.buffer}function f(){return this.bodyUsed=!1,this._initBody=function(e){if(this._bodyInit=e,e)if("string"==typeof e)this._bodyText=e;else if(y.blob&&Blob.prototype.isPrototypeOf(e))this._bodyBlob=e;else if(y.formData&&FormData.prototype.isPrototypeOf(e))this._bodyFormData=e;else if(y.searchParams&&URLSearchParams.prototype.isPrototypeOf(e))this._bodyText=e.toString();else if(y.arrayBuffer&&y.blob&&w(e))this._bodyArrayBuffer=l(e.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer]);else{if(!y.arrayBuffer||!ArrayBuffer.prototype.isPrototypeOf(e)&&!b(e))throw new Error("unsupported BodyInit type");this._bodyArrayBuffer=l(e)}else this._bodyText="";this.headers.get("content-type")||("string"==typeof e?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):y.searchParams&&URLSearchParams.prototype.isPrototypeOf(e)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},y.blob&&(this.blob=function(){var e=o(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?o(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(a)}),this.text=function(){var e=o(this);if(e)return e;if(this._bodyBlob)return c(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(u(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},y.formData&&(this.formData=function(){return this.text().then(p)}),this.json=function(){return this.text().then(JSON.parse)},this}function h(e){var t=e.toUpperCase();return _.indexOf(t)>-1?t:e}function d(e,t){t=t||{};var n=t.body;if(e instanceof d){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new i(e.headers)),this.method=e.method,this.mode=e.mode,n||null==e._bodyInit||(n=e._bodyInit,e.bodyUsed=!0)}else this.url=String(e);if(this.credentials=t.credentials||this.credentials||"omit",!t.headers&&this.headers||(this.headers=new i(t.headers)),this.method=h(t.method||this.method||"GET"),this.mode=t.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&n)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(n)}function p(e){var t=new FormData;return e.trim().split("&").forEach(function(e){if(e){var n=e.split("="),r=n.shift().replace(/\+/g," "),i=n.join("=").replace(/\+/g," ");t.append(decodeURIComponent(r),decodeURIComponent(i))}}),t}function m(e){var t=new i;return e.split(/\r?\n/).forEach(function(e){var n=e.split(":"),r=n.shift().trim();if(r){var i=n.join(":").trim();t.append(r,i)}}),t}function v(e,t){t||(t={}),this.type="default",this.status="status"in t?t.status:200,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in t?t.statusText:"OK",this.headers=new i(t.headers),this.url=t.url||"",this._initBody(e)}if(!e.fetch){var y={searchParams:"URLSearchParams"in e,iterable:"Symbol"in e&&"iterator"in Symbol,blob:"FileReader"in e&&"Blob"in e&&function(){try{return new Blob,!0}catch(e){return!1}}(),formData:"FormData"in e,arrayBuffer:"ArrayBuffer"in e};if(y.arrayBuffer)var g=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],w=function(e){return e&&DataView.prototype.isPrototypeOf(e)},b=ArrayBuffer.isView||function(e){return e&&g.indexOf(Object.prototype.toString.call(e))>-1};i.prototype.append=function(e,r){e=t(e),r=n(r);var i=this.map[e];this.map[e]=i?i+","+r:r},i.prototype.delete=function(e){delete this.map[t(e)]},i.prototype.get=function(e){return e=t(e),this.has(e)?this.map[e]:null},i.prototype.has=function(e){return this.map.hasOwnProperty(t(e))},i.prototype.set=function(e,r){this.map[t(e)]=n(r)},i.prototype.forEach=function(e,t){for(var n in this.map)this.map.hasOwnProperty(n)&&e.call(t,this.map[n],n,this)},i.prototype.keys=function(){var e=[];return this.forEach(function(t,n){e.push(n)}),r(e)},i.prototype.values=function(){var e=[];return this.forEach(function(t){e.push(t)}),r(e)},i.prototype.entries=function(){var e=[];return this.forEach(function(t,n){e.push([n,t])}),r(e)},y.iterable&&(i.prototype[Symbol.iterator]=i.prototype.entries);var _=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];d.prototype.clone=function(){return new d(this,{body:this._bodyInit})},f.call(d.prototype),f.call(v.prototype),v.prototype.clone=function(){return new v(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new i(this.headers),url:this.url})},v.error=function(){var e=new v(null,{status:0,statusText:""});return e.type="error",e};var x=[301,302,303,307,308];v.redirect=function(e,t){if(x.indexOf(t)===-1)throw new RangeError("Invalid status code");return new v(null,{status:t,headers:{location:e}})},e.Headers=i,e.Request=d,e.Response=v,e.fetch=function(e,t){return new Promise(function(n,r){var i=new d(e,t),o=new XMLHttpRequest;o.onload=function(){var e={status:o.status,statusText:o.statusText,headers:m(o.getAllResponseHeaders()||"")};e.url="responseURL"in o?o.responseURL:e.headers.get("X-Request-URL");var t="response"in o?o.response:o.responseText;n(new v(t,e))},o.onerror=function(){r(new TypeError("Network request failed"))},o.ontimeout=function(){r(new TypeError("Network request failed"))},o.open(i.method,i.url,!0),"include"===i.credentials&&(o.withCredentials=!0),"responseType"in o&&y.blob&&(o.responseType="blob"),i.headers.forEach(function(e,t){o.setRequestHeader(t,e)}),o.send("undefined"==typeof i._bodyInit?null:i._bodyInit)})},e.fetch.polyfill=!0}}("undefined"!=typeof self?self:void 0)},function(e,t,n){"use strict";(function(e){function r(t){new s.a.Event.Listener(document,"DOMContentLoaded",function(){if(!(document.body instanceof HTMLElement))throw new ReferenceError;o.a.attach(document.body),Modernizr.addTest("ios",function(){return!!navigator.userAgent.match(/(iPad|iPhone|iPod)/g)});var t=document.querySelectorAll("table:not([class])");if(Array.prototype.forEach.call(t,function(t){var n=e.createElement("div",{class:"md-typeset__scrollwrap"},e.createElement("div",{class:"md-typeset__table"}));t.nextSibling?t.parentNode.insertBefore(n,t.nextSibling):t.parentNode.appendChild(n),n.children[0].appendChild(t)}),Modernizr.ios){var n=document.querySelectorAll("[data-md-scrollfix]");Array.prototype.forEach.call(n,function(e){e.addEventListener("touchstart",function(){var t=e.scrollTop;0===t?e.scrollTop=1:t+e.offsetHeight===e.scrollHeight&&(e.scrollTop=t-1)})})}}).listen(),new s.a.Event.MatchMedia("(min-width: 1220px)",new s.a.Event.Listener(window,["scroll","resize","orientationchange"],new s.a.Header.Shadow("[data-md-component=container]","[data-md-component=header]"))),document.querySelector("[data-md-component=tabs]")&&new s.a.Event.Listener(window,["scroll","resize","orientationchange"],new s.a.Tabs.Toggle("[data-md-component=tabs]")).listen(),new s.a.Event.MatchMedia("(min-width: 1220px)",new s.a.Event.Listener(window,["scroll","resize","orientationchange"],new s.a.Sidebar.Position("[data-md-component=navigation]","[data-md-component=header]"))),document.querySelector("[data-md-component=toc]")&&new s.a.Event.MatchMedia("(min-width: 960px)",new s.a.Event.Listener(window,["scroll","resize","orientationchange"],new s.a.Sidebar.Position("[data-md-component=toc]","[data-md-component=header]"))),new s.a.Event.MatchMedia("(min-width: 960px)",new s.a.Event.Listener(window,"scroll",new s.a.Nav.Blur("[data-md-component=toc] [href]")));var n=document.querySelectorAll("[data-md-component=collapsible]");Array.prototype.forEach.call(n,function(e){new s.a.Event.MatchMedia("(min-width: 1220px)",new s.a.Event.Listener(e.previousElementSibling,"click",new s.a.Nav.Collapse(e)))}),new s.a.Event.MatchMedia("(max-width: 1219px)",new s.a.Event.Listener("[data-md-component=navigation] [data-md-toggle]","change",new s.a.Nav.Scrolling("[data-md-component=navigation] nav"))),new s.a.Event.MatchMedia("(max-width: 959px)",new s.a.Event.Listener("[data-md-toggle=search]","change",new s.a.Search.Lock("[data-md-toggle=search]"))),new s.a.Event.Listener("[data-md-component=query]",["focus","keyup","change"],new s.a.Search.Result("[data-md-component=result]",function(){return fetch(t.url.base+"/mkdocs/search_index.json",{credentials:"same-origin"}).then(function(e){return e.json()}).then(function(e){return e.docs.map(function(e){return e.location=t.url.base+e.location,e})})})).listen(),new s.a.Event.MatchMedia("(max-width: 959px)",new s.a.Event.Listener("[data-md-component=navigation] [href^='#']","click",function(){var e=document.querySelector("[data-md-toggle=drawer]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.checked&&(e.checked=!1,e.dispatchEvent(new CustomEvent("change")))})),new s.a.Event.Listener("[data-md-component=reset]","click",function(){setTimeout(function(){var e=document.querySelector("[data-md-component=query]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.focus()},10)}).listen(),new s.a.Event.Listener("[data-md-toggle=search]","change",function(e){setTimeout(function(e){if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=document.querySelector("[data-md-component=query]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;t.focus()}},400,e.target)}).listen(),new s.a.Event.MatchMedia("(min-width: 960px)",new s.a.Event.Listener("[data-md-component=query]","focus",function(){var e=document.querySelector("[data-md-toggle=search]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;e.checked||(e.checked=!0,e.dispatchEvent(new CustomEvent("change")))})),new s.a.Event.Listener(window,"keydown",function(e){var t=document.querySelector("[data-md-toggle=search]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;var n=document.querySelector("[data-md-component=query]");if(!(n instanceof HTMLInputElement))throw new ReferenceError;if(!e.metaKey&&!e.ctrlKey)if(t.checked){if(13===e.keyCode){if(n===document.activeElement){e.preventDefault();var r=document.querySelector("[data-md-component=search] [href][data-md-state=active]");r instanceof HTMLLinkElement&&(window.location=r.getAttribute("href")),t.checked=!1,t.dispatchEvent(new CustomEvent("change")),n.blur()}}else if(27===e.keyCode)t.checked=!1,t.dispatchEvent(new CustomEvent("change")),n.blur();else if([8,37,39].indexOf(e.keyCode)!==-1)n!==document.activeElement&&n.focus();else if([9,38,40].indexOf(e.keyCode)!==-1){var i=e.shiftKey?38:40,o=9===e.keyCode?i:e.keyCode,s=Array.prototype.slice.call(document.querySelectorAll("[data-md-component=search] [href]"));if(!s.length)return;var a=s.find(function(e){if(!(e instanceof HTMLElement))throw new ReferenceError;return"active"===e.dataset.mdState});a&&(a.dataset.mdState="");var c=Math.max(0,(s.indexOf(a)+s.length+(38===o?-1:1))%s.length);if(!(s[c]instanceof HTMLElement))throw new ReferenceError;return s[c].dataset.mdState="active",s[c].focus(),e.preventDefault(),e.stopPropagation(),!1}}else 70!==e.keyCode&&83!==e.keyCode||(n.focus(),e.preventDefault())}).listen(),new s.a.Event.Listener(window,"keypress",function(){var e=document.querySelector("[data-md-toggle=search]");if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=document.querySelector("[data-md-component=query]");if(!(t instanceof HTMLInputElement))throw new ReferenceError;t!==document.activeElement&&t.focus()}}).listen(),function(){var e=document.querySelector("[data-md-source]");if(!e)return Promise.resolve([]);if(!(e instanceof HTMLAnchorElement))throw new ReferenceError;switch(e.dataset.mdSource){case"github":return new s.a.Source.Adapter.GitHub(e).fetch();default:return Promise.resolve([])}}().then(function(e){var t=document.querySelectorAll("[data-md-source]");Array.prototype.forEach.call(t,function(t){new s.a.Source.Repository(t).initialize(e)})})}Object.defineProperty(t,"__esModule",{value:!0});var i=n(71),o=n.n(i),s=n(74);n.d(t,"initialize",function(){return r})}).call(t,n(13))},function(e,t,n){"use strict";var r=n(0)("unscopables"),i=Array.prototype;void 0==i[r]&&n(3)(i,r,{}),e.exports=function(e){i[r][e]=!0}},function(e,t,n){"use strict";e.exports=function(e,t,n,r){if(!(e instanceof t)||void 0!==r&&r in e)throw TypeError(n+": incorrect invocation!");return e}},function(e,t,n){"use strict";var r=n(21),i=n(32),o=n(61);e.exports=function(e){return function(t,n,s){var a,c=r(t),u=i(c.length),l=o(s,u);if(e&&n!=n){for(;u>l;)if(a=c[l++],a!=a)return!0}else for(;u>l;l++)if((e||l in c)&&c[l]===n)return e||l||0;return!e&&-1}}},function(e,t,n){"use strict";var r=n(10),i=n(47),o=n(46),s=n(2),a=n(32),c=n(64),u={},l={},f=e.exports=function(e,t,n,f,h){var d,p,m,v,y=h?function(){return e}:c(e),g=r(n,f,t?2:1),w=0;if("function"!=typeof y)throw TypeError(e+" is not iterable!");if(o(y)){for(d=a(e.length);d>w;w++)if(v=t?g(s(p=e[w])[0],p[1]):g(e[w]),v===u||v===l)return v}else for(m=y.call(e);!(p=m.next()).done;)if(v=i(m,g,p.value,t),v===u||v===l)return v};f.BREAK=u,f.RETURN=l},function(e,t,n){"use strict";e.exports=!n(5)&&!n(25)(function(){return 7!=Object.defineProperty(n(17)("div"),"a",{get:function(){return 7}}).a})},function(e,t,n){"use strict";e.exports=function(e,t,n){var r=void 0===n;switch(t.length){case 0:return r?e():e.call(n);case 1:return r?e(t[0]):e.call(n,t[0]);case 2:return r?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return r?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return r?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}return e.apply(n,t)}},function(e,t,n){"use strict";var r=n(9);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)}},function(e,t,n){"use strict";var r=n(7),i=n(0)("iterator"),o=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||o[i]===e)}},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t,n,i){try{return i?t(r(n)[0],n[1]):t(n)}catch(t){var o=e.return;throw void 0!==o&&r(o.call(e)),t}}},function(e,t,n){"use strict";var r=n(52),i=n(29),o=n(18),s={};n(3)(s,n(0)("iterator"),function(){return this}),e.exports=function(e,t,n){e.prototype=r(s,{next:i(1,n)}),o(e,t+" Iterator")}},function(e,t,n){"use strict";var r=n(0)("iterator"),i=!1;try{var o=[7][r]();o.return=function(){i=!0},Array.from(o,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!i)return!1;var n=!1;try{var o=[7],s=o[r]();s.next=function(){return{done:n=!0}},o[r]=function(){return s},e(o)}catch(e){}return n}},function(e,t,n){"use strict";e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,n){"use strict";var r=n(1),i=n(31).set,o=r.MutationObserver||r.WebKitMutationObserver,s=r.process,a=r.Promise,c="process"==n(9)(s);e.exports=function(){var e,t,n,u=function(){var r,i;for(c&&(r=s.domain)&&r.exit();e;){i=e.fn,e=e.next;try{i()}catch(r){throw e?n():t=void 0,r}}t=void 0,r&&r.enter()};if(c)n=function(){s.nextTick(u)};else if(o){var l=!0,f=document.createTextNode("");new o(u).observe(f,{characterData:!0}),n=function(){f.data=l=!l}}else if(a&&a.resolve){var h=a.resolve();n=function(){h.then(u)}}else n=function(){i.call(r,u)};return function(r){var i={fn:r,next:void 0};t&&(t.next=i),e||(e=i,n()),t=i}}},function(e,t,n){"use strict";var r=n(2),i=n(53),o=n(23),s=n(19)("IE_PROTO"),a=function(){},c="prototype",u=function(){var e,t=n(17)("iframe"),r=o.length,i="<",s=">";for(t.style.display="none",n(26).appendChild(t),t.src="javascript:",e=t.contentWindow.document,e.open(),e.write(i+"script"+s+"document.F=Object"+i+"/script"+s),e.close(),u=e.F;r--;)delete u[c][o[r]];return u()};e.exports=Object.create||function(e,t){var n;return null!==e?(a[c]=r(e),n=new a,a[c]=null,n[s]=e):n=u(),void 0===t?n:i(n,t)}},function(e,t,n){"use strict";var r=n(12),i=n(2),o=n(56);e.exports=n(5)?Object.defineProperties:function(e,t){i(e);for(var n,s=o(t),a=s.length,c=0;a>c;)r.f(e,n=s[c++],t[n]);return e}},function(e,t,n){"use strict";var r=n(6),i=n(62),o=n(19)("IE_PROTO"),s=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=i(e),r(e,o)?e[o]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?s:null}},function(e,t,n){"use strict";var r=n(6),i=n(21),o=n(41)(!1),s=n(19)("IE_PROTO");e.exports=function(e,t){var n,a=i(e),c=0,u=[];for(n in a)n!=s&&r(a,n)&&u.push(n);for(;t.length>c;)r(a,n=t[c++])&&(~o(u,n)||u.push(n));return u}},function(e,t,n){"use strict";var r=n(55),i=n(23);e.exports=Object.keys||function(e){return r(e,i)}},function(e,t,n){"use strict";var r=n(8);e.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},function(e,t,n){"use strict";var r=n(1),i=n(12),o=n(5),s=n(0)("species");e.exports=function(e){var t=r[e];o&&t&&!t[s]&&i.f(t,s,{configurable:!0,get:function(){return this}})}},function(e,t,n){"use strict";var r=n(2),i=n(14),o=n(0)("species");e.exports=function(e,t){var n,s=r(e).constructor;return void 0===s||void 0==(n=r(s)[o])?t:i(n)}},function(e,t,n){"use strict";var r=n(20),i=n(16);e.exports=function(e){return function(t,n){var o,s,a=String(i(t)),c=r(n),u=a.length;return c<0||c>=u?e?"":void 0:(o=a.charCodeAt(c),o<55296||o>56319||c+1===u||(s=a.charCodeAt(c+1))<56320||s>57343?e?a.charAt(c):o:e?a.slice(c,c+2):(o-55296<<10)+(s-56320)+65536)}}},function(e,t,n){"use strict";var r=n(20),i=Math.max,o=Math.min;e.exports=function(e,t){return e=r(e),e<0?i(e+t,0):o(e,t)}},function(e,t,n){"use strict";var r=n(16);e.exports=function(e){return Object(r(e))}},function(e,t,n){"use strict";var r=n(11);e.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},function(e,t,n){"use strict";var r=n(15),i=n(0)("iterator"),o=n(7);e.exports=n(4).getIteratorMethod=function(e){if(void 0!=e)return e[i]||e["@@iterator"]||o[r(e)]}},function(e,t,n){"use strict";var r=n(39),i=n(50),o=n(7),s=n(21);e.exports=n(27)(Array,"Array",function(e,t){this._t=s(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,i(1)):"keys"==t?i(0,n):"values"==t?i(0,e[n]):i(0,[n,e[n]])},"values"),o.Arguments=o.Array,r("keys"),r("values"),r("entries")},function(e,t,n){"use strict";var r=n(15),i={};i[n(0)("toStringTag")]="z",i+""!="[object z]"&&n(8)(Object.prototype,"toString",function(){return"[object "+r(this)+"]"},!0)},function(e,t,n){"use strict";var r,i,o,s=n(28),a=n(1),c=n(10),u=n(15),l=n(24),f=n(11),h=n(14),d=n(40),p=n(42),m=n(59),v=n(31).set,y=n(51)(),g="Promise",w=a.TypeError,b=a.process,_=a[g],b=a.process,x="process"==u(b),E=function(){},k=!!function(){try{var e=_.resolve(1),t=(e.constructor={})[n(0)("species")]=function(e){e(E,E)};return(x||"function"==typeof PromiseRejectionEvent)&&e.then(E)instanceof t}catch(e){}}(),S=function(e,t){return e===t||e===_&&t===o},T=function(e){var t;return!(!f(e)||"function"!=typeof(t=e.then))&&t},L=function(e){return S(_,e)?new C(e):new i(e)},C=i=function(e){var t,n;this.promise=new e(function(e,r){if(void 0!==t||void 0!==n)throw w("Bad Promise constructor");t=e,n=r}),this.resolve=h(t),this.reject=h(n)},O=function(e){try{e()}catch(e){return{error:e}}},P=function(e,t){if(!e._n){e._n=!0;var n=e._c;y(function(){for(var r=e._v,i=1==e._s,o=0,s=function(t){var n,o,s=i?t.ok:t.fail,a=t.resolve,c=t.reject,u=t.domain;try{s?(i||(2==e._h&&R(e),e._h=1),s===!0?n=r:(u&&u.enter(),n=s(r),u&&u.exit()),n===t.promise?c(w("Promise-chain cycle")):(o=T(n))?o.call(n,a,c):a(n)):c(r)}catch(e){c(e)}};n.length>o;)s(n[o++]);e._c=[],e._n=!1,t&&!e._h&&A(e)})}},A=function(e){v.call(a,function(){var t,n,r,i=e._v;if(M(e)&&(t=O(function(){x?b.emit("unhandledRejection",i,e):(n=a.onunhandledrejection)?n({promise:e,reason:i}):(r=a.console)&&r.error&&r.error("Unhandled promise rejection",i)}),e._h=x||M(e)?2:1),e._a=void 0,t)throw t.error})},M=function e(t){if(1==t._h)return!1;for(var n,r=t._a||t._c,i=0;r.length>i;)if(n=r[i++],n.fail||!e(n.promise))return!1;return!0},R=function(e){v.call(a,function(){var t;x?b.emit("rejectionHandled",e):(t=a.onrejectionhandled)&&t({promise:e,reason:e._v})})},I=function(e){var t=this;t._d||(t._d=!0,t=t._w||t,t._v=e,t._s=2,t._a||(t._a=t._c.slice()),P(t,!0))},j=function e(t){var n,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===t)throw w("Promise can't be resolved itself");(n=T(t))?y(function(){var i={_w:r,_d:!1};try{n.call(t,c(e,i,1),c(I,i,1))}catch(e){I.call(i,e)}}):(r._v=t,r._s=1,P(r,!1))}catch(e){I.call({_w:r,_d:!1},e)}}};k||(_=function(e){d(this,_,g,"_h"),h(e),r.call(this);try{e(c(j,this,1),c(I,this,1))}catch(e){I.call(this,e)}},r=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,
+this._h=0,this._n=!1},r.prototype=n(57)(_.prototype,{then:function(e,t){var n=L(m(this,_));return n.ok="function"!=typeof e||e,n.fail="function"==typeof t&&t,n.domain=x?b.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&P(this,!1),n.promise},catch:function(e){return this.then(void 0,e)}}),C=function(){var e=new r;this.promise=e,this.resolve=c(j,e,1),this.reject=c(I,e,1)}),l(l.G+l.W+l.F*!k,{Promise:_}),n(18)(_,g),n(58)(g),o=n(4)[g],l(l.S+l.F*!k,g,{reject:function(e){var t=L(this),n=t.reject;return n(e),t.promise}}),l(l.S+l.F*(s||!k),g,{resolve:function(e){if(e instanceof _&&S(e.constructor,this))return e;var t=L(this),n=t.resolve;return n(e),t.promise}}),l(l.S+l.F*!(k&&n(49)(function(e){_.all(e).catch(E)})),g,{all:function(e){var t=this,n=L(t),r=n.resolve,i=n.reject,o=O(function(){var n=[],o=0,s=1;p(e,!1,function(e){var a=o++,c=!1;n.push(void 0),s++,t.resolve(e).then(function(e){c||(c=!0,n[a]=e,--s||r(n))},i)}),--s||r(n)});return o&&i(o.error),n.promise},race:function(e){var t=this,n=L(t),r=n.reject,i=O(function(){p(e,!1,function(e){t.resolve(e).then(n.resolve,r)})});return i&&r(i.error),n.promise}})},function(e,t,n){"use strict";var r=n(60)(!0);n(27)(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){"use strict";for(var r=n(65),i=n(8),o=n(1),s=n(3),a=n(7),c=n(0),u=c("iterator"),l=c("toStringTag"),f=a.Array,h=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],d=0;d<5;d++){var p,m=h[d],v=o[m],y=v&&v.prototype;if(y){y[u]||s(y,u,f),y[l]||s(y,l,m),a[m]=f;for(p in r)y[p]||i(y,p,r[p],!0)}}},function(e,t,n){"use strict";var r=/[|\\{}()[\]^$+*?.]/g;e.exports=function(e){if("string"!=typeof e)throw new TypeError("Expected a string");return e.replace(r,"\\$&")}},function(e,t,n){"use strict";var r,i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};!function(){function o(e,t){function n(e,t){return function(){return e.apply(t,arguments)}}var r;if(t=t||{},this.trackingClick=!1,this.trackingClickStart=0,this.targetElement=null,this.touchStartX=0,this.touchStartY=0,this.lastTouchIdentifier=0,this.touchBoundary=t.touchBoundary||10,this.layer=e,this.tapDelay=t.tapDelay||200,this.tapTimeout=t.tapTimeout||700,!o.notNeeded(e)){for(var i=["onMouse","onClick","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel"],s=this,c=0,u=i.length;c<u;c++)s[i[c]]=n(s[i[c]],s);a&&(e.addEventListener("mouseover",this.onMouse,!0),e.addEventListener("mousedown",this.onMouse,!0),e.addEventListener("mouseup",this.onMouse,!0)),e.addEventListener("click",this.onClick,!0),e.addEventListener("touchstart",this.onTouchStart,!1),e.addEventListener("touchmove",this.onTouchMove,!1),e.addEventListener("touchend",this.onTouchEnd,!1),e.addEventListener("touchcancel",this.onTouchCancel,!1),Event.prototype.stopImmediatePropagation||(e.removeEventListener=function(t,n,r){var i=Node.prototype.removeEventListener;"click"===t?i.call(e,t,n.hijacked||n,r):i.call(e,t,n,r)},e.addEventListener=function(t,n,r){var i=Node.prototype.addEventListener;"click"===t?i.call(e,t,n.hijacked||(n.hijacked=function(e){e.propagationStopped||n(e)}),r):i.call(e,t,n,r)}),"function"==typeof e.onclick&&(r=e.onclick,e.addEventListener("click",function(e){r(e)},!1),e.onclick=null)}}var s=navigator.userAgent.indexOf("Windows Phone")>=0,a=navigator.userAgent.indexOf("Android")>0&&!s,c=/iP(ad|hone|od)/.test(navigator.userAgent)&&!s,u=c&&/OS 4_\d(_\d)?/.test(navigator.userAgent),l=c&&/OS [6-7]_\d/.test(navigator.userAgent),f=navigator.userAgent.indexOf("BB10")>0;o.prototype.needsClick=function(e){switch(e.nodeName.toLowerCase()){case"button":case"select":case"textarea":if(e.disabled)return!0;break;case"input":if(c&&"file"===e.type||e.disabled)return!0;break;case"label":case"iframe":case"video":return!0}return/\bneedsclick\b/.test(e.className)},o.prototype.needsFocus=function(e){switch(e.nodeName.toLowerCase()){case"textarea":return!0;case"select":return!a;case"input":switch(e.type){case"button":case"checkbox":case"file":case"image":case"radio":case"submit":return!1}return!e.disabled&&!e.readOnly;default:return/\bneedsfocus\b/.test(e.className)}},o.prototype.sendClick=function(e,t){var n,r;document.activeElement&&document.activeElement!==e&&document.activeElement.blur(),r=t.changedTouches[0],n=document.createEvent("MouseEvents"),n.initMouseEvent(this.determineEventType(e),!0,!0,window,1,r.screenX,r.screenY,r.clientX,r.clientY,!1,!1,!1,!1,0,null),n.forwardedTouchEvent=!0,e.dispatchEvent(n)},o.prototype.determineEventType=function(e){return a&&"select"===e.tagName.toLowerCase()?"mousedown":"click"},o.prototype.focus=function(e){var t;c&&e.setSelectionRange&&0!==e.type.indexOf("date")&&"time"!==e.type&&"month"!==e.type?(t=e.value.length,e.setSelectionRange(t,t)):e.focus()},o.prototype.updateScrollParent=function(e){var t,n;if(t=e.fastClickScrollParent,!t||!t.contains(e)){n=e;do{if(n.scrollHeight>n.offsetHeight){t=n,e.fastClickScrollParent=n;break}n=n.parentElement}while(n)}t&&(t.fastClickLastScrollTop=t.scrollTop)},o.prototype.getTargetElementFromEventTarget=function(e){return e.nodeType===Node.TEXT_NODE?e.parentNode:e},o.prototype.onTouchStart=function(e){var t,n,r;if(e.targetTouches.length>1)return!0;if(t=this.getTargetElementFromEventTarget(e.target),n=e.targetTouches[0],c){if(r=window.getSelection(),r.rangeCount&&!r.isCollapsed)return!0;if(!u){if(n.identifier&&n.identifier===this.lastTouchIdentifier)return e.preventDefault(),!1;this.lastTouchIdentifier=n.identifier,this.updateScrollParent(t)}}return this.trackingClick=!0,this.trackingClickStart=e.timeStamp,this.targetElement=t,this.touchStartX=n.pageX,this.touchStartY=n.pageY,e.timeStamp-this.lastClickTime<this.tapDelay&&e.preventDefault(),!0},o.prototype.touchHasMoved=function(e){var t=e.changedTouches[0],n=this.touchBoundary;return Math.abs(t.pageX-this.touchStartX)>n||Math.abs(t.pageY-this.touchStartY)>n},o.prototype.onTouchMove=function(e){return!this.trackingClick||((this.targetElement!==this.getTargetElementFromEventTarget(e.target)||this.touchHasMoved(e))&&(this.trackingClick=!1,this.targetElement=null),!0)},o.prototype.findControl=function(e){return void 0!==e.control?e.control:e.htmlFor?document.getElementById(e.htmlFor):e.querySelector("button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea")},o.prototype.onTouchEnd=function(e){var t,n,r,i,o,s=this.targetElement;if(!this.trackingClick)return!0;if(e.timeStamp-this.lastClickTime<this.tapDelay)return this.cancelNextClick=!0,!0;if(e.timeStamp-this.trackingClickStart>this.tapTimeout)return!0;if(this.cancelNextClick=!1,this.lastClickTime=e.timeStamp,n=this.trackingClickStart,this.trackingClick=!1,this.trackingClickStart=0,l&&(o=e.changedTouches[0],s=document.elementFromPoint(o.pageX-window.pageXOffset,o.pageY-window.pageYOffset)||s,s.fastClickScrollParent=this.targetElement.fastClickScrollParent),r=s.tagName.toLowerCase(),"label"===r){if(t=this.findControl(s)){if(this.focus(s),a)return!1;s=t}}else if(this.needsFocus(s))return e.timeStamp-n>100||c&&window.top!==window&&"input"===r?(this.targetElement=null,!1):(this.focus(s),this.sendClick(s,e),c&&"select"===r||(this.targetElement=null,e.preventDefault()),!1);return!(!c||u||(i=s.fastClickScrollParent,!i||i.fastClickLastScrollTop===i.scrollTop))||(this.needsClick(s)||(e.preventDefault(),this.sendClick(s,e)),!1)},o.prototype.onTouchCancel=function(){this.trackingClick=!1,this.targetElement=null},o.prototype.onMouse=function(e){return!this.targetElement||(!!e.forwardedTouchEvent||(!e.cancelable||(!(!this.needsClick(this.targetElement)||this.cancelNextClick)||(e.stopImmediatePropagation?e.stopImmediatePropagation():e.propagationStopped=!0,e.stopPropagation(),e.preventDefault(),!1))))},o.prototype.onClick=function(e){var t;return this.trackingClick?(this.targetElement=null,this.trackingClick=!1,!0):"submit"===e.target.type&&0===e.detail||(t=this.onMouse(e),t||(this.targetElement=null),t)},o.prototype.destroy=function(){var e=this.layer;a&&(e.removeEventListener("mouseover",this.onMouse,!0),e.removeEventListener("mousedown",this.onMouse,!0),e.removeEventListener("mouseup",this.onMouse,!0)),e.removeEventListener("click",this.onClick,!0),e.removeEventListener("touchstart",this.onTouchStart,!1),e.removeEventListener("touchmove",this.onTouchMove,!1),e.removeEventListener("touchend",this.onTouchEnd,!1),e.removeEventListener("touchcancel",this.onTouchCancel,!1)},o.notNeeded=function(e){var t,n,r,i;if("undefined"==typeof window.ontouchstart)return!0;if(n=+(/Chrome\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1]){if(!a)return!0;if(t=document.querySelector("meta[name=viewport]")){if(t.content.indexOf("user-scalable=no")!==-1)return!0;if(n>31&&document.documentElement.scrollWidth<=window.outerWidth)return!0}}if(f&&(r=navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/),r[1]>=10&&r[2]>=3&&(t=document.querySelector("meta[name=viewport]")))){if(t.content.indexOf("user-scalable=no")!==-1)return!0;if(document.documentElement.scrollWidth<=window.outerWidth)return!0}return"none"===e.style.msTouchAction||"manipulation"===e.style.touchAction||(i=+(/Firefox\/([0-9]+)/.exec(navigator.userAgent)||[,0])[1],!!(i>=27&&(t=document.querySelector("meta[name=viewport]"),t&&(t.content.indexOf("user-scalable=no")!==-1||document.documentElement.scrollWidth<=window.outerWidth)))||("none"===e.style.touchAction||"manipulation"===e.style.touchAction))},o.attach=function(e,t){return new o(e,t)},"object"===i(n(34))&&n(34)?(r=function(){return o}.call(t,n,t,e),!(void 0!==r&&(e.exports=r))):"undefined"!=typeof e&&e.exports?(e.exports=o.attach,e.exports.FastClick=o):window.FastClick=o}()},function(e,t,n){"use strict";var r,i,o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};!function(s){var a=!1;if(r=s,i="function"==typeof r?r.call(t,n,t,e):r,!(void 0!==i&&(e.exports=i)),a=!0,"object"===o(t)&&(e.exports=s(),a=!0),!a){var c=window.Cookies,u=window.Cookies=s();u.noConflict=function(){return window.Cookies=c,u}}}(function(){function e(){for(var e=0,t={};e<arguments.length;e++){var n=arguments[e];for(var r in n)t[r]=n[r]}return t}function t(n){function r(t,i,o){var s;if("undefined"!=typeof document){if(arguments.length>1){if(o=e({path:"/"},r.defaults,o),"number"==typeof o.expires){var a=new Date;a.setMilliseconds(a.getMilliseconds()+864e5*o.expires),o.expires=a}try{s=JSON.stringify(i),/^[\{\[]/.test(s)&&(i=s)}catch(e){}return i=n.write?n.write(i,t):encodeURIComponent(String(i)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),t=encodeURIComponent(String(t)),t=t.replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent),t=t.replace(/[\(\)]/g,escape),document.cookie=[t,"=",i,o.expires?"; expires="+o.expires.toUTCString():"",o.path?"; path="+o.path:"",o.domain?"; domain="+o.domain:"",o.secure?"; secure":""].join("")}t||(s={});for(var c=document.cookie?document.cookie.split("; "):[],u=/(%[0-9A-Z]{2})+/g,l=0;l<c.length;l++){var f=c[l].split("="),h=f.slice(1).join("=");'"'===h.charAt(0)&&(h=h.slice(1,-1));try{var d=f[0].replace(u,decodeURIComponent);if(h=n.read?n.read(h,d):n(h,d)||h.replace(u,decodeURIComponent),this.json)try{h=JSON.parse(h)}catch(e){}if(t===d){s=h;break}t||(s[d]=h)}catch(e){}}return s}}return r.set=r,r.get=function(e){return r.call(r,e)},r.getJSON=function(){return r.apply({json:!0},[].slice.call(arguments))},r.defaults={},r.remove=function(t,n){r(t,"",e(n,{expires:-1}))},r.withConverter=t,r}return t(function(){})})},function(e,t,n){"use strict";var r,i;"function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};!function(){var o=function e(t){var n=new e.Builder;return n.pipeline.add(e.trimmer,e.stopWordFilter,e.stemmer),n.searchPipeline.add(e.stemmer),t.call(n,n),n.build()};o.version="2.0.2",o.utils={},o.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),o.utils.asString=function(e){return void 0===e||null===e?"":e.toString()},o.idf=function(e,t){var n=0;for(var r in e)"_index"!=r&&(n+=Object.keys(e[r]).length);return(t-n+.5)/(n+.5)},o.Token=function(e,t){this.str=e||"",this.metadata=t||{}},o.Token.prototype.toString=function(){return this.str},o.Token.prototype.update=function(e){return this.str=e(this.str,this.metadata),this},o.Token.prototype.clone=function(e){return e=e||function(e){return e},new o.Token(e(this.str,this.metadata),this.metadata)},o.tokenizer=function(e){if(null==e||void 0==e)return[];if(Array.isArray(e))return e.map(function(e){return new o.Token(o.utils.asString(e).toLowerCase())});for(var t=e.toString().trim().toLowerCase(),n=t.length,r=[],i=0,s=0;i<=n;i++){var a=t.charAt(i),c=i-s;(a.match(o.tokenizer.separator)||i==n)&&(c>0&&r.push(new o.Token(t.slice(s,i),{position:[s,c],index:r.length})),s=i+1)}return r},o.tokenizer.separator=/[\s\-]+/,o.Pipeline=function(){this._stack=[]},o.Pipeline.registeredFunctions=Object.create(null),o.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&o.utils.warn("Overwriting existing registered function: "+t),e.label=t,o.Pipeline.registeredFunctions[e.label]=e},o.Pipeline.warnIfFunctionNotRegistered=function(e){var t=e.label&&e.label in this.registeredFunctions;t||o.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},o.Pipeline.load=function(e){var t=new o.Pipeline;return e.forEach(function(e){var n=o.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)}),t},o.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){o.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},o.Pipeline.prototype.after=function(e,t){o.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},o.Pipeline.prototype.before=function(e,t){o.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},o.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},o.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n<t;n++){var r=this._stack[n];e=e.reduce(function(t,n,i){var o=r(n,i,e);return void 0===o||""===o?t:t.concat(o)},[])}return e},o.Pipeline.prototype.runString=function(e){var t=new o.Token(e);return this.run([t]).map(function(e){return e.toString()})},o.Pipeline.prototype.reset=function(){this._stack=[]},o.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return o.Pipeline.warnIfFunctionNotRegistered(e),e.label})},o.Vector=function(e){this._magnitude=0,this.elements=e||[]},o.Vector.prototype.insert=function(e,t){if(this._magnitude=0,0==this.elements.length)return void this.elements.push(e,t);for(var n=0,r=this.elements.length,i=r-n,o=2*Math.floor(i/2/2),s=this.elements[o];i>2;){if(s==e)throw"duplicate index";e>s&&(n=o),e<s&&(r=o),i=r-n,o=n+2*Math.floor(i/2/2),s=this.elements[o]}s>e&&this.elements.splice(o,0,e,t),s<e&&this.elements.splice(o+2,0,e,t)},o.Vector.prototype.magnitude=function(){if(this._magnitude)return this._magnitude;for(var e=0,t=this.elements.length,n=1;n<t;n+=2){var r=this.elements[n];e+=r*r}return this._magnitude=Math.sqrt(e)},o.Vector.prototype.dot=function(e){for(var t=0,n=this.elements,r=e.elements,i=n.length,o=r.length,s=0,a=0,c=0,u=0;c<i&&u<o;)s=n[c],a=r[u],s<a?c+=2:s>a?u+=2:s==a&&(t+=n[c+1]*r[u+1],c+=2,u+=2);return t},o.Vector.prototype.similarity=function(e){return this.dot(e)/(this.magnitude()*e.magnitude())},o.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t<this.elements.length;t+=2,n++)e[n]=this.elements[t];return e},o.Vector.prototype.toJSON=function(){return this.elements},o.stemmer=function(){var e={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},t={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",r="[aeiouy]",i=n+"[^aeiouy]*",o=r+"[aeiou]*",s="^("+i+")?"+o+i,a="^("+i+")?"+o+i+"("+o+")?$",c="^("+i+")?"+o+i+o+i,u="^("+i+")?"+r,l=new RegExp(s),f=new RegExp(c),h=new RegExp(a),d=new RegExp(u),p=/^(.+?)(ss|i)es$/,m=/^(.+?)([^s])s$/,v=/^(.+?)eed$/,y=/^(.+?)(ed|ing)$/,g=/.$/,w=/(at|bl|iz)$/,b=new RegExp("([^aeiouylsz])\\1$"),_=new RegExp("^"+i+r+"[^aeiouwxy]$"),x=/^(.+?[^aeiou])y$/,E=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,k=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,S=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,T=/^(.+?)(s|t)(ion)$/,L=/^(.+?)e$/,C=/ll$/,O=new RegExp("^"+i+r+"[^aeiouwxy]$"),P=function(n){var r,i,o,s,a,c,u;if(n.length<3)return n;if(o=n.substr(0,1),"y"==o&&(n=o.toUpperCase()+n.substr(1)),s=p,a=m,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=v,a=y,s.test(n)){var P=s.exec(n);s=l,s.test(P[1])&&(s=g,n=n.replace(s,""))}else if(a.test(n)){var P=a.exec(n);r=P[1],a=d,a.test(r)&&(n=r,a=w,c=b,u=_,a.test(n)?n+="e":c.test(n)?(s=g,n=n.replace(s,"")):u.test(n)&&(n+="e"))}if(s=x,s.test(n)){var P=s.exec(n);r=P[1],n=r+"i"}if(s=E,s.test(n)){var P=s.exec(n);r=P[1],i=P[2],s=l,s.test(r)&&(n=r+e[i])}if(s=k,s.test(n)){var P=s.exec(n);r=P[1],i=P[2],s=l,s.test(r)&&(n=r+t[i])}if(s=S,a=T,s.test(n)){var P=s.exec(n);r=P[1],s=f,s.test(r)&&(n=r)}else if(a.test(n)){var P=a.exec(n);r=P[1]+P[2],a=f,a.test(r)&&(n=r)}if(s=L,s.test(n)){var P=s.exec(n);r=P[1],s=f,a=h,c=O,(s.test(r)||a.test(r)&&!c.test(r))&&(n=r)}return s=C,a=f,s.test(n)&&a.test(n)&&(s=g,n=n.replace(s,"")),"y"==o&&(n=o.toLowerCase()+n.substr(1)),n};return function(e){return e.update(P)}}(),o.Pipeline.registerFunction(o.stemmer,"stemmer"),o.generateStopWordFilter=function(e){var t=e.reduce(function(e,t){return e[t]=t,e},{});return function(e){if(e&&t[e.toString()]!==e.toString())return e}},o.stopWordFilter=o.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),o.Pipeline.registerFunction(o.stopWordFilter,"stopWordFilter"),o.trimmer=function(e){return e.update(function(e){return e.replace(/^\W+/,"").replace(/\W+$/,"")})},o.Pipeline.registerFunction(o.trimmer,"trimmer"),o.TokenSet=function(){this.final=!1,this.edges={},this.id=o.TokenSet._nextId,o.TokenSet._nextId+=1},o.TokenSet._nextId=1,o.TokenSet.fromArray=function(e){for(var t=new o.TokenSet.Builder,n=0,r=e.length;n<r;n++)t.insert(e[n]);return t.finish(),t.root},o.TokenSet.fromClause=function(e){return"editDistance"in e?o.TokenSet.fromFuzzyString(e.term,e.editDistance):o.TokenSet.fromString(e.term)},o.TokenSet.fromFuzzyString=function(e,t){for(var n=new o.TokenSet,r=[{node:n,editsRemaining:t,str:e}];r.length;){var i=r.pop();if(i.str.length>0){var s,a=i.str.charAt(0);a in i.node.edges?s=i.node.edges[a]:(s=new o.TokenSet,i.node.edges[a]=s),1==i.str.length?s.final=!0:r.push({node:s,editsRemaining:i.editsRemaining,str:i.str.slice(1)})}if(i.editsRemaining>0&&i.str.length>1){var c,a=i.str.charAt(1);a in i.node.edges?c=i.node.edges[a]:(c=new o.TokenSet,i.node.edges[a]=c),i.str.length<=2?c.final=!0:r.push({node:c,editsRemaining:i.editsRemaining-1,str:i.str.slice(2)})}if(i.editsRemaining>0&&1==i.str.length&&(i.node.final=!0),i.editsRemaining>0&&i.str.length>=1){if("*"in i.node.edges)var u=i.node.edges["*"];else{var u=new o.TokenSet;i.node.edges["*"]=u}1==i.str.length?u.final=!0:r.push({node:u,editsRemaining:i.editsRemaining-1,str:i.str.slice(1)})}if(i.editsRemaining>0){if("*"in i.node.edges)var l=i.node.edges["*"];else{var l=new o.TokenSet;i.node.edges["*"]=l}0==i.str.length?l.final=!0:r.push({node:l,editsRemaining:i.editsRemaining-1,str:i.str})}if(i.editsRemaining>0&&i.str.length>1){var f,h=i.str.charAt(0),d=i.str.charAt(1);d in i.node.edges?f=i.node.edges[d]:(f=new o.TokenSet,i.node.edges[d]=f),1==i.str.length?f.final=!0:r.push({node:f,editsRemaining:i.editsRemaining-1,str:h+i.str.slice(2)})}}return n},o.TokenSet.fromString=function(e){for(var t=new o.TokenSet,n=t,r=!1,i=0,s=e.length;i<s;i++){var a=e[i],c=i==s-1;if("*"==a)r=!0,t.edges[a]=t,t.final=c;else{var u=new o.TokenSet;u.final=c,t.edges[a]=u,t=u,r&&(t.edges["*"]=n)}}return n},o.TokenSet.prototype.toArray=function(){for(var e=[],t=[{prefix:"",node:this}];t.length;){var n=t.pop(),r=Object.keys(n.node.edges),i=r.length;n.node.final&&e.push(n.prefix);for(var o=0;o<i;o++){var s=r[o];t.push({prefix:n.prefix.concat(s),node:n.node.edges[s]})}}return e},o.TokenSet.prototype.toString=function(){if(this._str)return this._str;for(var e=this.final?"1":"0",t=Object.keys(this.edges).sort(),n=t.length,r=0;r<n;r++){var i=t[r],o=this.edges[i];e=e+i+o.id}return e},o.TokenSet.prototype.intersect=function(e){for(var t=new o.TokenSet,n=void 0,r=[{qNode:e,output:t,node:this}];r.length;){n=r.pop();for(var i=Object.keys(n.qNode.edges),s=i.length,a=Object.keys(n.node.edges),c=a.length,u=0;u<s;u++)for(var l=i[u],f=0;f<c;f++){var h=a[f];if(h==l||"*"==l){var d=n.node.edges[h],p=n.qNode.edges[l],m=d.final&&p.final,v=void 0;h in n.output.edges?(v=n.output.edges[h],v.final=v.final||m):(v=new o.TokenSet,v.final=m,n.output.edges[h]=v),r.push({qNode:p,output:v,node:d})}}}return t},o.TokenSet.Builder=function(){this.previousWord="",this.root=new o.TokenSet,this.uncheckedNodes=[],this.minimizedNodes={}},o.TokenSet.Builder.prototype.insert=function(e){var t,n=0;if(e<this.previousWord)throw new Error("Out of order word insertion");for(var r=0;r<e.length&&r<this.previousWord.length&&e[r]==this.previousWord[r];r++)n++;this.minimize(n),t=0==this.uncheckedNodes.length?this.root:this.uncheckedNodes[this.uncheckedNodes.length-1].child;for(var r=n;r<e.length;r++){var i=new o.TokenSet,s=e[r];t.edges[s]=i,this.uncheckedNodes.push({parent:t,char:s,child:i}),t=i}t.final=!0,this.previousWord=e},o.TokenSet.Builder.prototype.finish=function(){this.minimize(0)},o.TokenSet.Builder.prototype.minimize=function(e){for(var t=this.uncheckedNodes.length-1;t>=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},o.Index=function(e){this.invertedIndex=e.invertedIndex,this.documentVectors=e.documentVectors,this.tokenSet=e.tokenSet,this.documentCount=e.documentCount,this.averageDocumentLength=e.averageDocumentLength,this.b=e.b,this.k1=e.k1,this.fields=e.fields,this.pipeline=e.pipeline},o.Index.prototype.search=function(e){return this.query(function(t){var n=new o.QueryParser(e,t);n.parse()})},o.Index.prototype.query=function(e){var t=new o.Query(this.fields),n=Object.create(null),r=new o.Vector;e.call(t,t);for(var i=0;i<t.clauses.length;i++){var s=t.clauses[i],a=null;a=s.usePipeline?this.pipeline.runString(s.term):[s.term];for(var c=0;c<a.length;c++){var u=a[c];s.term=u;for(var l=o.TokenSet.fromClause(s),f=this.tokenSet.intersect(l).toArray(),h=0;h<f.length;h++){var d=f[h],p=this.invertedIndex[d],m=p._index,v=o.idf(p,this.documentCount),y=1,g=v*((this.k1+1)*y)/(this.k1*(1-this.b+this.b*(t.clauses.length/this.averageDocumentLength))+y);r.insert(m,g*s.boost);for(var w=0;w<s.fields.length;w++)for(var b=s.fields[w],_=p[b],x=Object.keys(_),E=0;E<x.length;E++){var k,S,T=x[E];k=_[T],S=new o.MatchData(d,b,k),T in n?n[T].combine(S):n[T]=S}}}}for(var x=Object.keys(n),L=[],i=0;i<x.length;i++){var C=x[i],O=this.documentVectors[C],g=r.similarity(O);L.push({ref:C,score:g,matchData:n[C]})}return L.sort(function(e,t){return t.score-e.score})},o.Index.prototype.toJSON=function(){var e=Object.keys(this.invertedIndex).sort().map(function(e){return[e,this.invertedIndex[e]]},this),t=Object.keys(this.documentVectors).map(function(e){return[e,this.documentVectors[e].toJSON()]},this);return{version:o.version,averageDocumentLength:this.averageDocumentLength,b:this.b,k1:this.k1,fields:this.fields,documentVectors:t,invertedIndex:e,pipeline:this.pipeline.toJSON()}},o.Index.load=function(e){var t={},n={},r=e.documentVectors,i=0,s={},a=e.invertedIndex,c=new o.TokenSet.Builder,u=o.Pipeline.load(e.pipeline);e.version!=o.version&&o.utils.warn("Version mismatch when loading serialised index. Current version of lunr '"+o.version+"' does not match serialized index '"+e.version+"'");for(var l=0;l<r.length;l++,i++){var f=r[l],h=f[0],d=f[1];n[h]=new o.Vector(d)}for(var l=0;l<a.length;l++){var f=a[l],p=f[0],m=f[1];c.insert(p),s[p]=m}return c.finish(),t.b=e.b,t.k1=e.k1,t.fields=e.fields,t.averageDocumentLength=e.averageDocumentLength,t.documentCount=i,t.documentVectors=n,t.invertedIndex=s,t.tokenSet=c.root,t.pipeline=u,new o.Index(t)},o.Builder=function(){this._ref="id",this._fields=[],this.invertedIndex=Object.create(null),this.documentTermFrequencies={},this.documentLengths={},this.tokenizer=o.tokenizer,this.pipeline=new o.Pipeline,this.searchPipeline=new o.Pipeline,this.documentCount=0,this._b=.75,this._k1=1.2,this.termIndex=0,this.metadataWhitelist=[]},o.Builder.prototype.ref=function(e){this._ref=e},o.Builder.prototype.field=function(e){this._fields.push(e)},o.Builder.prototype.b=function(e){e<0?this._b=0:e>1?this._b=1:this._b=e},o.Builder.prototype.k1=function(e){this._k1=e},o.Builder.prototype.add=function(e){var t=e[this._ref],n={};this.documentCount+=1,this.documentTermFrequencies[t]=n,this.documentLengths[t]=0;for(var r=0;r<this._fields.length;r++){var i=this._fields[r],o=e[i],s=this.tokenizer(o),a=this.pipeline.run(s);this.documentLengths[t]+=a.length;for(var c=0;c<a.length;c++){var u=a[c];if(void 0==n[u]&&(n[u]=0),n[u]+=1,void 0==this.invertedIndex[u]){var l=Object.create(null);l._index=this.termIndex,this.termIndex+=1;for(var f=0;f<this._fields.length;f++)l[this._fields[f]]=Object.create(null);this.invertedIndex[u]=l}void 0==this.invertedIndex[u][i][t]&&(this.invertedIndex[u][i][t]=Object.create(null));for(var h=0;h<this.metadataWhitelist.length;h++){var d=this.metadataWhitelist[h],p=u.metadata[d];void 0==this.invertedIndex[u][i][t][d]&&(this.invertedIndex[u][i][t][d]=[]),this.invertedIndex[u][i][t][d].push(p)}}}},o.Builder.prototype.calculateAverageDocumentLengths=function(){for(var e=Object.keys(this.documentLengths),t=e.length,n=0,r=0;r<t;r++){var i=e[r];n+=this.documentLengths[i]}this.averageDocumentLength=n/t},o.Builder.prototype.createDocumentVectors=function(){for(var e={},t=Object.keys(this.documentTermFrequencies),n=t.length,r=0;r<n;r++){for(var i=t[r],s=this.documentLengths[i],a=new o.Vector,c=this.documentTermFrequencies[i],u=Object.keys(c),l=u.length,f=0;f<l;f++){var h=u[f],d=c[h],p=this.invertedIndex[h]._index,m=o.idf(this.invertedIndex[h],this.documentCount),v=m*((this._k1+1)*d)/(this._k1*(1-this._b+this._b*(s/this.averageDocumentLength))+d),y=Math.round(1e3*v)/1e3;a.insert(p,y)}e[i]=a}this.documentVectors=e},o.Builder.prototype.createTokenSet=function(){this.tokenSet=o.TokenSet.fromArray(Object.keys(this.invertedIndex).sort())},o.Builder.prototype.build=function(){return this.calculateAverageDocumentLengths(),this.createDocumentVectors(),this.createTokenSet(),new o.Index({invertedIndex:this.invertedIndex,documentVectors:this.documentVectors,tokenSet:this.tokenSet,averageDocumentLength:this.averageDocumentLength,documentCount:this.documentCount,fields:this._fields,pipeline:this.searchPipeline,b:this._b,k1:this._k1})},o.Builder.prototype.use=function(e){var t=Array.prototype.slice.call(arguments,1);t.unshift(this),e.apply(this,t)},o.MatchData=function(e,t,n){this.metadata={},this.metadata[e]={},this.metadata[e][t]=n},o.MatchData.prototype.combine=function(e){for(var t=Object.keys(e.metadata),n=0;n<t.length;n++){var r=t[n],i=Object.keys(e.metadata[r]);void 0==this.metadata[r]&&(this.metadata[r]={});for(var o=0;o<i.length;o++){var s=i[o],a=Object.keys(e.metadata[r][s]);void 0==this.metadata[r][s]&&(this.metadata[r][s]={});for(var c=0;c<a.length;c++){var u=a[c];void 0==this.metadata[r][s][u]?this.metadata[r][s][u]=e.metadata[r][s][u]:this.metadata[r][s][u]=this.metadata[r][s][u].concat(e.metadata[r][s][u])}}}},o.Query=function(e){this.clauses=[],this.allFields=e},o.Query.prototype.clause=function(e){return"fields"in e||(e.fields=this.allFields),"boost"in e||(e.boost=1),"usePipeline"in e||(e.usePipeline=!0),this.clauses.push(e),this},o.Query.prototype.term=function(e,t){var n=t||{};return n.term=e,this.clause(n),this},o.QueryParseError=function(e,t,n){this.name="QueryParseError",this.message=e,this.start=t,this.end=n},o.QueryParseError.prototype=new Error,o.QueryLexer=function(e){this.lexemes=[],this.str=e,this.length=e.length,this.pos=0,this.start=0},o.QueryLexer.prototype.run=function(){for(var e=o.QueryLexer.lexText;e;)e=e(this)},o.QueryLexer.prototype.emit=function(e){this.lexemes.push({type:e,str:this.str.slice(this.start,this.pos),start:this.start,end:this.pos}),this.start=this.pos},o.QueryLexer.prototype.next=function(){if(this.pos==this.length)return o.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},o.QueryLexer.prototype.width=function(){return this.pos-this.start},o.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},o.QueryLexer.prototype.backup=function(){this.pos-=1},o.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do e=this.next(),t=e.charCodeAt(0);while(t>47&&t<58);e!=o.QueryLexer.EOS&&this.backup()},o.QueryLexer.prototype.more=function(){return this.pos<this.length},o.QueryLexer.EOS="EOS",o.QueryLexer.FIELD="FIELD",o.QueryLexer.TERM="TERM",o.QueryLexer.EDIT_DISTANCE="EDIT_DISTANCE",o.QueryLexer.BOOST="BOOST",o.QueryLexer.lexField=function(e){return e.backup(),e.emit(o.QueryLexer.FIELD),e.ignore(),o.QueryLexer.lexText},o.QueryLexer.lexTerm=function(e){if(e.width()>1&&(e.backup(),e.emit(o.QueryLexer.TERM)),e.ignore(),e.more())return o.QueryLexer.lexText},o.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(o.QueryLexer.EDIT_DISTANCE),o.QueryLexer.lexText},o.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(o.QueryLexer.BOOST),o.QueryLexer.lexText},o.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(o.QueryLexer.TERM)},o.QueryLexer.termSeparator=o.tokenizer.separator,o.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==o.QueryLexer.EOS)return o.QueryLexer.lexEOS;if(":"==t)return o.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(o.QueryLexer.TERM),o.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(o.QueryLexer.TERM),o.QueryLexer.lexBoost;if(t.match(o.QueryLexer.termSeparator))return o.QueryLexer.lexTerm}},o.QueryParser=function(e,t){this.lexer=new o.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},o.QueryParser.prototype.parse=function(){
+this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=o.QueryParser.parseFieldOrTerm;e;)e=e(this);return this.query},o.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},o.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},o.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},o.QueryParser.parseFieldOrTerm=function(e){var t=e.peekLexeme();if(void 0!=t)switch(t.type){case o.QueryLexer.FIELD:return o.QueryParser.parseField;case o.QueryLexer.TERM:return o.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type+" with value '"+t.str+"'";throw new o.QueryParseError(n,t.start,t.end)}},o.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(void 0!=t){if(e.query.allFields.indexOf(t.str)==-1){var n=e.query.allFields.map(function(e){return"'"+e+"'"}).join(),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new o.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var i=e.peekLexeme();if(void 0==i){var r="expecting term, found nothing";throw new o.QueryParseError(r,t.start,t.end)}switch(i.type){case o.QueryLexer.TERM:return o.QueryParser.parseTerm;default:var r="expecting a field, found '"+i.type+"'";throw new o.QueryParseError(r,i.start,i.end)}}},o.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(void 0!=t){e.currentClause.term=t.str.toLowerCase(),t.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(void 0==n)return void e.nextClause();switch(n.type){case o.QueryLexer.TERM:return e.nextClause(),o.QueryParser.parseTerm;case o.QueryLexer.FIELD:return e.nextClause(),o.QueryParser.parseField;case o.QueryLexer.EDIT_DISTANCE:return o.QueryParser.parseEditDistance;case o.QueryLexer.BOOST:return o.QueryParser.parseBoost;default:var r="Unexpected lexeme type '"+n.type+"'";throw new o.QueryParseError(r,n.start,n.end)}}},o.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(void 0!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new o.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var i=e.peekLexeme();if(void 0==i)return void e.nextClause();switch(i.type){case o.QueryLexer.TERM:return e.nextClause(),o.QueryParser.parseTerm;case o.QueryLexer.FIELD:return e.nextClause(),o.QueryParser.parseField;case o.QueryLexer.EDIT_DISTANCE:return o.QueryParser.parseEditDistance;case o.QueryLexer.BOOST:return o.QueryParser.parseBoost;default:var r="Unexpected lexeme type '"+i.type+"'";throw new o.QueryParseError(r,i.start,i.end)}}},o.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(void 0!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new o.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var i=e.peekLexeme();if(void 0==i)return void e.nextClause();switch(i.type){case o.QueryLexer.TERM:return e.nextClause(),o.QueryParser.parseTerm;case o.QueryLexer.FIELD:return e.nextClause(),o.QueryParser.parseField;case o.QueryLexer.EDIT_DISTANCE:return o.QueryParser.parseEditDistance;case o.QueryLexer.BOOST:return o.QueryParser.parseBoost;default:var r="Unexpected lexeme type '"+i.type+"'";throw new o.QueryParseError(r,i.start,i.end)}}},function(o,s){r=s,i="function"==typeof r?r.call(t,n,t,e):r,!(void 0!==i&&(e.exports=i))}(this,function(){return o})}()},function(e,t,n){"use strict";var r=n(75),i=n(77),o=n(79),s=n(83),a=n(86),c=n(88),u=n(93);t.a={Event:r.a,Header:i.a,Nav:o.a,Search:s.a,Sidebar:a.a,Source:c.a,Tabs:u.a}},function(e,t,n){"use strict";var r=n(33),i=n(76);t.a={Listener:r.a,MatchMedia:i.a}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=(n(33),function e(t,n){r(this,e),this.handler_=function(e){e.matches?n.listen():n.unlisten()};var i=window.matchMedia(t);i.addListener(this.handler_),this.handler_(i)});t.a=i},function(e,t,n){"use strict";var r=n(78);t.a={Shadow:r.a}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function(){function e(t,n){r(this,e);var i="string"==typeof t?document.querySelector(t):t;if(!(i instanceof HTMLElement&&i.parentNode instanceof HTMLElement))throw new ReferenceError;if(this.el_=i.parentNode,i="string"==typeof n?document.querySelector(n):n,!(i instanceof HTMLElement))throw new ReferenceError;this.header_=i,this.height_=0,this.active_=!1}return i(e,[{key:"setup",value:function(){for(var e=this.el_;e=e.previousElementSibling;){if(!(e instanceof HTMLElement))throw new ReferenceError;this.height_+=e.offsetHeight}this.update()}},{key:"update",value:function(){var e=window.pageYOffset>=this.height_;e!==this.active_&&(this.header_.dataset.mdState=(this.active_=e)?"shadow":"")}},{key:"reset",value:function(){this.header_.dataset.mdState="",this.height_=0,this.active_=!1}}]),e}();t.a=o},function(e,t,n){"use strict";var r=n(80),i=n(81),o=n(82);t.a={Blur:r.a,Collapse:i.a,Scrolling:o.a}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function(){function e(t){r(this,e),this.els_="string"==typeof t?document.querySelectorAll(t):t,this.index_=0,this.offset_=window.pageYOffset,this.dir_=!1,this.anchors_=[].reduce.call(this.els_,function(e,t){return e.concat(document.getElementById(t.hash.substring(1))||[])},[])}return i(e,[{key:"setup",value:function(){this.update()}},{key:"update",value:function(){var e=window.pageYOffset,t=this.offset_-e<0;if(this.dir_!==t&&(this.index_=t?this.index_=0:this.index_=this.els_.length-1),0!==this.anchors_.length){if(this.offset_<=e)for(var n=this.index_+1;n<this.els_.length&&this.anchors_[n].offsetTop-80<=e;n++)n>0&&(this.els_[n-1].dataset.mdState="blur"),this.index_=n;else for(var r=this.index_;r>=0;r--){if(!(this.anchors_[r].offsetTop-80>e)){this.index_=r;break}r>0&&(this.els_[r-1].dataset.mdState="")}this.offset_=e,this.dir_=t}}},{key:"reset",value:function(){Array.prototype.forEach.call(this.els_,function(e){e.dataset.mdState=""}),this.index_=0,this.offset_=window.pageYOffset}}]),e}();t.a=o},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLElement))throw new ReferenceError;this.el_=n}return i(e,[{key:"update",value:function(){var e=this,t=this.el_.getBoundingClientRect().height;if(t)this.el_.style.maxHeight=t+"px",requestAnimationFrame(function(){e.el_.setAttribute("data-md-state","animate"),e.el_.style.maxHeight="0px"});else{this.el_.setAttribute("data-md-state","expand"),this.el_.style.maxHeight="";var n=this.el_.getBoundingClientRect().height;this.el_.removeAttribute("data-md-state"),this.el_.style.maxHeight="0px",requestAnimationFrame(function(){e.el_.setAttribute("data-md-state","animate"),e.el_.style.maxHeight=n+"px"})}var r=function e(t){var n=t.target;if(!(n instanceof HTMLElement))throw new ReferenceError;n.removeAttribute("data-md-state"),n.style.maxHeight="",n.removeEventListener("transitionend",e)};this.el_.addEventListener("transitionend",r,!1)}},{key:"reset",value:function(){this.el_.dataset.mdState="",this.el_.style.maxHeight=""}}]),e}();t.a=o},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLElement))throw new ReferenceError;this.el_=n}return i(e,[{key:"setup",value:function(){this.el_.children[1].style.webkitOverflowScrolling="touch";var e=this.el_.querySelectorAll("[data-md-toggle]");Array.prototype.forEach.call(e,function(e){if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=e.nextElementSibling;if(!(t instanceof HTMLElement))throw new ReferenceError;for(;"NAV"!==t.tagName&&t.nextElementSibling;)t=t.nextElementSibling;if(!(e.parentNode instanceof HTMLElement&&e.parentNode.parentNode instanceof HTMLElement))throw new ReferenceError;var n=e.parentNode.parentNode,r=t.children[t.children.length-1];n.style.webkitOverflowScrolling="",r.style.webkitOverflowScrolling="touch"}})}},{key:"update",value:function(e){var t=e.target;if(!(t instanceof HTMLElement))throw new ReferenceError;var n=t.nextElementSibling;if(!(n instanceof HTMLElement))throw new ReferenceError;for(;"NAV"!==n.tagName&&n.nextElementSibling;)n=n.nextElementSibling;if(!(t.parentNode instanceof HTMLElement&&t.parentNode.parentNode instanceof HTMLElement))throw new ReferenceError;var r=t.parentNode.parentNode,i=n.children[n.children.length-1];if(r.style.webkitOverflowScrolling="",i.style.webkitOverflowScrolling="",!t.checked){var o=function e(){n instanceof HTMLElement&&(r.style.webkitOverflowScrolling="touch",n.removeEventListener("transitionend",e))};n.addEventListener("transitionend",o,!1)}if(t.checked){var s=function e(){n instanceof HTMLElement&&(i.style.webkitOverflowScrolling="touch",n.removeEventListener("transitionend",e))};n.addEventListener("transitionend",s,!1)}}},{key:"reset",value:function(){this.el_.children[1].style.webkitOverflowScrolling="";var e=this.el_.querySelectorAll("[data-md-toggle]");Array.prototype.forEach.call(e,function(e){if(!(e instanceof HTMLInputElement))throw new ReferenceError;if(e.checked){var t=e.nextElementSibling;if(!(t instanceof HTMLElement))throw new ReferenceError;for(;"NAV"!==t.tagName&&t.nextElementSibling;)t=t.nextElementSibling;if(!(e.parentNode instanceof HTMLElement&&e.parentNode.parentNode instanceof HTMLElement))throw new ReferenceError;var n=e.parentNode.parentNode,r=t.children[t.children.length-1];n.style.webkitOverflowScrolling="",r.style.webkitOverflowScrolling=""}})}}]),e}();t.a=o},function(e,t,n){"use strict";var r=n(84),i=n(85);t.a={Lock:r.a,Result:i.a}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLInputElement))throw new ReferenceError;if(this.el_=n,!document.body)throw new ReferenceError;this.lock_=document.body}return i(e,[{key:"setup",value:function(){this.update()}},{key:"update",value:function(){var e=this;this.el_.checked?(this.offset_=window.pageYOffset,setTimeout(function(){window.scrollTo(0,0),e.el_.checked&&(e.lock_.dataset.mdState="lock")},400)):(this.lock_.dataset.mdState="",setTimeout(function(){"undefined"!=typeof e.offset_&&window.scrollTo(0,e.offset_)},100))}},{key:"reset",value:function(){"lock"===this.lock_.dataset.mdState&&window.scrollTo(0,this.offset_),this.lock_.dataset.mdState=""}}]),e}();t.a=o},function(e,t,n){"use strict";(function(e){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=n(70),o=n.n(i),s=n(73),a=n.n(s),c=function(){function e(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var s,a=e[Symbol.iterator]();!(r=(s=a.next()).done)&&(n.push(s.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{!r&&a.return&&a.return()}finally{if(i)throw o}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),l=function(){function t(e,n){r(this,t);var i="string"==typeof e?document.querySelector(e):e;if(!(i instanceof HTMLElement))throw new ReferenceError;this.el_=i;var o=Array.prototype.slice.call(this.el_.children),s=c(o,2),a=s[0],u=s[1];this.data_=n,this.meta_=a,this.list_=u,this.message_={placeholder:this.meta_.textContent,none:this.meta_.dataset.mdLangResultNone,one:this.meta_.dataset.mdLangResultOne,other:this.meta_.dataset.mdLangResultOther}}return u(t,[{key:"truncate_",value:function(e,t){var n=t;if(e.length>n){for(;" "!==e[n]&&--n>0;);return e.substring(0,n)+"..."}return e}},{key:"update",value:function(t){var n=this;if("focus"!==t.type||this.index_){if("focus"===t.type||"keyup"===t.type){var r=t.target;if(!(r instanceof HTMLInputElement))throw new ReferenceError;if(!this.index_||r.value===this.value_)return;for(;this.list_.firstChild;)this.list_.removeChild(this.list_.firstChild);if(this.value_=r.value,0===this.value_.length)return void(this.meta_.textContent=this.message_.placeholder);var i=this.index_.search(this.value_).reduce(function(e,t){var r=n.docs_.get(t.ref);if(r.parent){var i=r.parent.location;e.set(i,(e.get(i)||[]).concat(t))}else{var o=r.location;e.set(o,e.get(o)||[])}return e},new Map),s=new RegExp("\\b("+o()(this.value_.trim()).replace(" ","|")+")","img"),u=function(e){return"<em>"+e+"</em>"};i.forEach(function(t,r){var i=n.docs_.get(r);n.list_.appendChild(e.createElement("li",{class:"md-search-result__item"},e.createElement("a",{href:i.location,title:i.title,class:"md-search-result__link"},e.createElement("article",{class:"md-search-result__article md-search-result__article--document"},e.createElement("h1",{class:"md-search-result__title"},{__html:i.title.replace(s,u)}),i.text.length?e.createElement("p",{class:"md-search-result__teaser"},{__html:i.text.replace(s,u)}):{})),t.map(function(t){var r=n.docs_.get(t.ref);return e.createElement("a",{href:r.location,title:r.title,class:"md-search-result__link","data-md-rel":"anchor"},e.createElement("article",{class:"md-search-result__article"},e.createElement("h1",{class:"md-search-result__title"},{__html:r.title.replace(s,u)}),r.text.length?e.createElement("p",{class:"md-search-result__teaser"},{__html:n.truncate_(r.text.replace(s,u),400)}):{}))})))});var l=this.list_.querySelectorAll("[data-md-rel=anchor]");switch(Array.prototype.forEach.call(l,function(e){e.addEventListener("click",function(t){var n=document.querySelector("[data-md-toggle=search]");if(!(n instanceof HTMLInputElement))throw new ReferenceError;n.checked&&(n.checked=!1,n.dispatchEvent(new CustomEvent("change"))),t.preventDefault(),setTimeout(function(){document.location.href=e.href},100)})}),i.size){case 0:this.meta_.textContent=this.message_.none;break;case 1:this.meta_.textContent=this.message_.one;break;default:this.meta_.textContent=this.message_.other.replace("#",i.size)}}}else{var f=function(e){n.docs_=e.reduce(function(e,t){var n=t.location.split("#"),r=c(n,2),i=r[0],o=r[1];return o&&(t.parent=e.get(i),t.parent&&!t.parent.done&&(t.parent.title=t.title,t.parent.text=t.text,t.parent.done=!0)),t.text=t.text.replace(/\n/g," ").replace(/\s+/g," ").replace(/\s+([,.:;!?])/g,function(e,t){return t}),t.parent&&t.parent.title===t.title||e.set(t.location,t),e},new Map);var t=n.docs_;n.index_=a()(function(){var e=this;this.field("title",{boost:10}),this.field("text"),this.ref("location"),t.forEach(function(t){return e.add(t)})})};setTimeout(function(){return"function"==typeof n.data_?n.data_().then(f):f(n.data_)},250)}}}]),t}();t.a=l}).call(t,n(13))},function(e,t,n){"use strict";var r=n(87);t.a={Position:r.a}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function(){function e(t,n){r(this,e);var i="string"==typeof t?document.querySelector(t):t;if(!(i instanceof HTMLElement&&i.parentNode instanceof HTMLElement))throw new ReferenceError;if(this.el_=i,this.parent_=i.parentNode,i="string"==typeof n?document.querySelector(n):n,!(i instanceof HTMLElement))throw new ReferenceError;this.header_=i,this.height_=0,this.pad_="fixed"===window.getComputedStyle(this.header_).position}return i(e,[{key:"setup",value:function(){var e=Array.prototype.reduce.call(this.parent_.children,function(e,t){return Math.max(e,t.offsetTop)},0);this.offset_=e-(this.pad_?this.header_.offsetHeight:0),this.update()}},{key:"update",value:function(e){var t=window.pageYOffset,n=window.innerHeight;e&&"resize"===e.type&&this.setup();var r={top:this.pad_?this.header_.offsetHeight:0,bottom:this.parent_.offsetTop+this.parent_.offsetHeight},i=n-r.top-Math.max(0,this.offset_-t)-Math.max(0,t+n-r.bottom);i!==this.height_&&(this.el_.style.height=(this.height_=i)+"px"),t>=this.offset_?"lock"!==this.el_.dataset.mdState&&(this.el_.dataset.mdState="lock"):"lock"===this.el_.dataset.mdState&&(this.el_.dataset.mdState="")}},{key:"reset",value:function(){this.el_.dataset.mdState="",this.el_.style.height="",this.height_=0}}]),e}();t.a=o},function(e,t,n){"use strict";var r=n(89),i=n(92);t.a={Adapter:r.a,Repository:i.a}},function(e,t,n){"use strict";var r=n(91);t.a={GitHub:r.a}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=n(72),o=n.n(i),s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),a=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof HTMLAnchorElement))throw new ReferenceError;this.el_=n,this.base_=this.el_.href,this.salt_=this.hash_(this.base_)}return s(e,[{key:"fetch",value:function(){var e=this;return new Promise(function(t){var n=o.a.getJSON(e.salt_+".cache-source");"undefined"!=typeof n?t(n):e.fetch_().then(function(n){o.a.set(e.salt_+".cache-source",n,{expires:1/96}),t(n)})})}},{key:"fetch_",value:function(){throw new Error("fetch_(): Not implemented")}},{key:"format_",value:function(e){return e>1e4?(e/1e3).toFixed(0)+"k":e>1e3?(e/1e3).toFixed(1)+"k":""+e}},{key:"hash_",value:function(e){var t=0;if(0===e.length)return t;for(var n=0,r=e.length;n<r;n++)t=(t<<5)-t+e.charCodeAt(n),t|=0;return t}}]),e}();t.a=a},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var s=n(90),a=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),c=function(e){function t(e){r(this,t);var n=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.base_=n.base_.replace("github.com/","api.github.com/repos/").replace(/\/$/,""),n}return o(t,e),a(t,[{key:"fetch_",value:function(){var e=this;return fetch(this.base_).then(function(e){return e.json()}).then(function(t){return[e.format_(t.stargazers_count)+" Stars",e.format_(t.forks_count)+" Forks"]})}}]),t}(s.a);t.a=c},function(e,t,n){"use strict";(function(e){function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=function(){function t(e){n(this,t);var r="string"==typeof e?document.querySelector(e):e;if(!(r instanceof HTMLElement))throw new ReferenceError;this.el_=r}return r(t,[{key:"initialize",value:function(t){t.length&&this.el_.children.length&&this.el_.children[this.el_.children.length-1].appendChild(e.createElement("ul",{class:"md-source__facts"},t.map(function(t){return e.createElement("li",{class:"md-source__fact"},t)}))),this.el_.dataset.mdState="done"}}]),t}();t.a=i}).call(t,n(13))},function(e,t,n){"use strict";var r=n(94);t.a={Toggle:r.a}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=function(){function e(t){r(this,e);var n="string"==typeof t?document.querySelector(t):t;if(!(n instanceof Node))throw new ReferenceError;this.el_=n,this.offset_=5,this.active_=!1}return i(e,[{key:"update",value:function(){var e=window.pageYOffset>=this.offset_;e!==this.active_&&(this.el_.dataset.mdState=(this.active_=e)?"hidden":"")}},{key:"reset",value:function(){this.el_.dataset.mdState="",this.active_=!1}}]),e}();t.a=o},function(e,t,n){n(35),n(36),n(37),e.exports=n(38)}]); \ No newline at end of file
diff --git a/docs/build/assets/javascripts/modernizr-56ade86843.js b/docs/build/assets/javascripts/modernizr-56ade86843.js
new file mode 100644
index 0000000..cffa583
--- /dev/null
+++ b/docs/build/assets/javascripts/modernizr-56ade86843.js
@@ -0,0 +1 @@
+!function(e,n,t){function r(e,n){return typeof e===n}function o(){var e,n,t,o,i,s,f;for(var a in w)if(w.hasOwnProperty(a)){if(e=[],n=w[a],n.name&&(e.push(n.name.toLowerCase()),n.options&&n.options.aliases&&n.options.aliases.length))for(t=0;t<n.options.aliases.length;t++)e.push(n.options.aliases[t].toLowerCase());for(o=r(n.fn,"function")?n.fn():n.fn,i=0;i<e.length;i++)s=e[i],f=s.split("."),1===f.length?_[f[0]]=o:(!_[f[0]]||_[f[0]]instanceof Boolean||(_[f[0]]=new Boolean(_[f[0]])),_[f[0]][f[1]]=o),x.push((o?"":"no-")+f.join("-"))}}function i(e){var n=b.className,t=_._config.classPrefix||"";if(P&&(n=n.baseVal),_._config.enableJSClass){var r=new RegExp("(^|\\s)"+t+"no-js(\\s|$)");n=n.replace(r,"$1"+t+"js$2")}_._config.enableClasses&&(n+=" "+t+e.join(" "+t),P?b.className.baseVal=n:b.className=n)}function s(e,n){if("object"==typeof e)for(var t in e)S(e,t)&&s(t,e[t]);else{e=e.toLowerCase();var r=e.split("."),o=_[r[0]];if(2==r.length&&(o=o[r[1]]),"undefined"!=typeof o)return _;n="function"==typeof n?n():n,1==r.length?_[r[0]]=n:(!_[r[0]]||_[r[0]]instanceof Boolean||(_[r[0]]=new Boolean(_[r[0]])),_[r[0]][r[1]]=n),i([(n&&0!=n?"":"no-")+r.join("-")]),_._trigger(e,n)}return _}function f(e,n){return!!~(""+e).indexOf(n)}function a(){return"function"!=typeof n.createElement?n.createElement(arguments[0]):P?n.createElementNS.call(n,"http://www.w3.org/2000/svg",arguments[0]):n.createElement.apply(n,arguments)}function l(){var e=n.body;return e||(e=a(P?"svg":"body"),e.fake=!0),e}function u(e,t,r,o){var i,s,f,u,p="modernizr",d=a("div"),c=l();if(parseInt(r,10))for(;r--;)f=a("div"),f.id=o?o[r]:p+(r+1),d.appendChild(f);return i=a("style"),i.type="text/css",i.id="s"+p,(c.fake?c:d).appendChild(i),c.appendChild(d),i.styleSheet?i.styleSheet.cssText=e:i.appendChild(n.createTextNode(e)),d.id=p,c.fake&&(c.style.background="",c.style.overflow="hidden",u=b.style.overflow,b.style.overflow="hidden",b.appendChild(c)),s=t(d,e),c.fake?(c.parentNode.removeChild(c),b.style.overflow=u,b.offsetHeight):d.parentNode.removeChild(d),!!s}function p(e){return e.replace(/([A-Z])/g,function(e,n){return"-"+n.toLowerCase()}).replace(/^ms-/,"-ms-")}function d(n,r){var o=n.length;if("CSS"in e&&"supports"in e.CSS){for(;o--;)if(e.CSS.supports(p(n[o]),r))return!0;return!1}if("CSSSupportsRule"in e){for(var i=[];o--;)i.push("("+p(n[o])+":"+r+")");return i=i.join(" or "),u("@supports ("+i+") { #modernizr { position: absolute; } }",function(e){return"absolute"==getComputedStyle(e,null).position})}return t}function c(e){return e.replace(/([a-z])-([a-z])/g,function(e,n,t){return n+t.toUpperCase()}).replace(/^-/,"")}function h(e,n,o,i){function s(){u&&(delete E.style,delete E.modElem)}if(i=!r(i,"undefined")&&i,!r(o,"undefined")){var l=d(e,o);if(!r(l,"undefined"))return l}for(var u,p,h,m,v,y=["modernizr","tspan"];!E.style;)u=!0,E.modElem=a(y.shift()),E.style=E.modElem.style;for(h=e.length,p=0;p<h;p++)if(m=e[p],v=E.style[m],f(m,"-")&&(m=c(m)),E.style[m]!==t){if(i||r(o,"undefined"))return s(),"pfx"!=n||m;try{E.style[m]=o}catch(e){}if(E.style[m]!=v)return s(),"pfx"!=n||m}return s(),!1}function m(e,n){return function(){return e.apply(n,arguments)}}function v(e,n,t){var o;for(var i in e)if(e[i]in n)return t===!1?e[i]:(o=n[e[i]],r(o,"function")?m(o,t||n):o);return!1}function y(e,n,t,o,i){var s=e.charAt(0).toUpperCase()+e.slice(1),f=(e+" "+z.join(s+" ")+s).split(" ");return r(n,"string")||r(n,"undefined")?h(f,n,o,i):(f=(e+" "+k.join(s+" ")+s).split(" "),v(f,n,t))}function g(e,n,r){return y(e,t,t,n,r)}var w=[],C={_version:"3.3.1",_config:{classPrefix:"",enableClasses:!0,enableJSClass:!0,usePrefixes:!0},_q:[],on:function(e,n){var t=this;setTimeout(function(){n(t[e])},0)},addTest:function(e,n,t){w.push({name:e,fn:n,options:t})},addAsyncTest:function(e){w.push({name:null,fn:e})}},_=function(){};_.prototype=C,_=new _;var S,x=[],b=n.documentElement,P="svg"===b.nodeName.toLowerCase();!function(){var e={}.hasOwnProperty;S=r(e,"undefined")||r(e.call,"undefined")?function(e,n){return n in e&&r(e.constructor.prototype[n],"undefined")}:function(n,t){return e.call(n,t)}}(),C._l={},C.on=function(e,n){this._l[e]||(this._l[e]=[]),this._l[e].push(n),_.hasOwnProperty(e)&&setTimeout(function(){_._trigger(e,_[e])},0)},C._trigger=function(e,n){if(this._l[e]){var t=this._l[e];setTimeout(function(){var e,r;for(e=0;e<t.length;e++)(r=t[e])(n)},0),delete this._l[e]}},_._q.push(function(){C.addTest=s});var T="Moz O ms Webkit",z=C._config.usePrefixes?T.split(" "):[];C._cssomPrefixes=z;var j={elem:a("modernizr")};_._q.push(function(){delete j.elem});var E={style:j.elem.style};_._q.unshift(function(){delete E.style});var k=C._config.usePrefixes?T.toLowerCase().split(" "):[];C._domPrefixes=k,C.testAllProps=y,C.testAllProps=g;var N=C.testStyles=u,q="CSS"in e&&"supports"in e.CSS,A="supportsCSS"in e;_.addTest("supports",q||A),_.addTest("csstransforms3d",function(){var e=!!g("perspective","1px",!0),n=_._config.usePrefixes;if(e&&(!n||"webkitPerspective"in b.style)){var t,r="#modernizr{width:0;height:0}";_.supports?t="@supports (perspective: 1px)":(t="@media (transform-3d)",n&&(t+=",(-webkit-transform-3d)")),t+="{#modernizr{width:7px;height:18px;margin:0;padding:0;border:0}}",N(r+t,function(n){e=7===n.offsetWidth&&18===n.offsetHeight})}return e}),o(),i(x),delete C.addTest,delete C.addAsyncTest;for(var L=0;L<_._q.length;L++)_._q[L]();e.Modernizr=_}(window,document); \ No newline at end of file
diff --git a/docs/build/assets/stylesheets/application-4d0d3f2fbf.css b/docs/build/assets/stylesheets/application-4d0d3f2fbf.css
new file mode 100644
index 0000000..2c57878
--- /dev/null
+++ b/docs/build/assets/stylesheets/application-4d0d3f2fbf.css
@@ -0,0 +1 @@
+html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}html{-webkit-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none}body{margin:0}hr{overflow:visible;box-sizing:content-box}a{-webkit-text-decoration-skip:objects}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}a:active,a:hover{outline-width:0}small,sub,sup{font-size:80%}sub,sup{position:relative;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}table{border-collapse:collapse;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{padding:0;background:transparent;font-size:inherit}button,input{border:0;outline:0}.admonition:before,.md-icon,.md-nav__button,.md-nav__link:after,.md-nav__title:before,.md-search-result__article--document:before,.md-source-file:before,.md-typeset .critic.comment:before,.md-typeset .footnote-backref,.md-typeset .task-list-control .task-list-indicator:before{font-family:Material Icons;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none;white-space:nowrap;speak:none;word-wrap:normal;direction:ltr}.md-content__icon,.md-footer-nav__button,.md-header-nav__button,.md-nav__button,.md-nav__title:before,.md-search-result__article--document:before{display:inline-block;margin:.4rem;padding:.8rem;font-size:2.4rem;cursor:pointer}.md-icon--arrow-back:before{content:"arrow_back"}.md-icon--arrow-forward:before{content:"arrow_forward"}.md-icon--menu:before{content:"menu"}.md-icon--search:before{content:"search"}.md-icon--home:before{content:"school"}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body,input{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern","liga";font-feature-settings:"kern","liga";font-family:Helvetica Neue,Helvetica,Arial,sans-serif;font-weight:400}code,kbd,pre{color:rgba(0,0,0,.87);-webkit-font-feature-settings:"kern","liga";font-feature-settings:"kern","liga";font-family:Courier New,Courier,monospace;font-weight:400}.md-typeset{font-size:1.6rem;line-height:1.6;-webkit-print-color-adjust:exact}.md-typeset blockquote,.md-typeset ol,.md-typeset p,.md-typeset ul{margin:1em 0}.md-typeset h1{margin:0 0 4rem;color:rgba(0,0,0,.54);font-size:3.125rem;line-height:1.3}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{margin:4rem 0 1.6rem;font-size:2.5rem;line-height:1.4}.md-typeset h3{margin:3.2rem 0 1.6rem;font-size:2rem;font-weight:400;letter-spacing:-.01em;line-height:1.5}.md-typeset h2+h3{margin-top:1.6rem}.md-typeset h4{font-size:1.6rem}.md-typeset h4,.md-typeset h5,.md-typeset h6{margin:1.6rem 0;font-weight:700;letter-spacing:-.01em}.md-typeset h5,.md-typeset h6{color:rgba(0,0,0,.54);font-size:1.28rem}.md-typeset h5{text-transform:uppercase}.md-typeset hr{margin:1.5em 0;border-bottom:.1rem dotted rgba(0,0,0,.26)}.md-typeset a{color:#3f51b5;word-break:break-word}.md-typeset a,.md-typeset a:before{-webkit-transition:color .125s;transition:color .125s}.md-typeset a:active,.md-typeset a:hover{color:#536dfe}.md-typeset code,.md-typeset pre{background-color:hsla(0,0%,93%,.5);color:#37474f;font-size:85%}.md-typeset code{margin:0 .29412em;padding:.07353em 0;border-radius:.2rem;box-shadow:.29412em 0 0 hsla(0,0%,93%,.5),-.29412em 0 0 hsla(0,0%,93%,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset h1 code,.md-typeset h2 code,.md-typeset h3 code,.md-typeset h4 code,.md-typeset h5 code,.md-typeset h6 code{margin:0;background-color:transparent;box-shadow:none}.md-typeset a>code{margin:inherit;padding:inherit;border-radius:none;background-color:inherit;color:inherit;box-shadow:none}.md-typeset pre{margin:1em 0;padding:1rem 1.2rem;border-radius:.2rem;line-height:1.4;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset pre::-webkit-scrollbar{width:.4rem;height:.4rem}.md-typeset pre::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset pre>code{margin:0;background-color:transparent;font-size:inherit;box-shadow:none;-webkit-box-decoration-break:none;box-decoration-break:none}.md-typeset kbd{padding:0 .29412em;border:.1rem solid #c9c9c9;border-radius:.2rem;border-bottom-color:#bcbcbc;background-color:#fcfcfc;color:#555;font-size:85%;box-shadow:0 .1rem 0 #b0b0b0;word-break:break-word}.md-typeset mark{margin:0 .25em;padding:.0625em 0;border-radius:.2rem;background-color:rgba(255,235,59,.5);box-shadow:.25em 0 0 rgba(255,235,59,.5),-.25em 0 0 rgba(255,235,59,.5);word-break:break-word;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset abbr{border-bottom:.1rem dotted rgba(0,0,0,.54);cursor:help}.md-typeset small{opacity:.75}.md-typeset sub,.md-typeset sup{margin-left:.07812em}.md-typeset blockquote{padding-left:1.2rem;border-left:.4rem solid rgba(0,0,0,.26);color:rgba(0,0,0,.54)}.md-typeset ul{list-style-type:disc}.md-typeset ol,.md-typeset ul{margin-left:.625em;padding:0}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em;margin-left:1.25em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}.md-typeset ol li ol,.md-typeset ol li ul,.md-typeset ul li ol,.md-typeset ul li ul{margin:.5em 0 .5em .625em}.md-typeset dd{margin:1em 0 1em 1.875em}.md-typeset iframe,.md-typeset img,.md-typeset svg{max-width:100%}.md-typeset table:not([class]){box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2);display:inline-block;max-width:100%;border-radius:.2rem;font-size:1.28rem;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) td:not([align]),.md-typeset table:not([class]) th:not([align]){text-align:left}.md-typeset table:not([class]) th{min-width:10rem;padding:1.2rem 1.6rem;background-color:rgba(0,0,0,.54);color:#fff;vertical-align:top}.md-typeset table:not([class]) td{padding:1.2rem 1.6rem;border-top:.1rem solid rgba(0,0,0,.07);vertical-align:top}.md-typeset table:not([class]) tr:first-child td{border-top:0}.md-typeset table:not([class]) a{word-break:normal}.md-typeset__scrollwrap{margin:1em -1.6rem;overflow-x:auto;-webkit-overflow-scrolling:touch}.md-typeset .md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 1.6rem}.md-typeset .md-typeset__table table{display:table;width:100%;margin:0;overflow:hidden}html{font-size:62.5%}body,html{height:100%}body{position:relative}hr{display:block;height:.1rem;padding:0;border:0}.md-svg{display:none}.md-grid{max-width:122rem;margin-right:auto;margin-left:auto}.md-container,.md-main{overflow:auto}.md-container{display:table;width:100%;height:100%;padding-top:5.6rem;table-layout:fixed}.md-main{display:table-row;height:100%}.md-main__inner{min-height:100%;padding-top:3rem}.md-toggle{display:none}.md-overlay{position:fixed;top:0;width:0;height:0;-webkit-transition:width 0s .25s,height 0s .25s,opacity .25s;transition:width 0s .25s,height 0s .25s,opacity .25s;background-color:rgba(0,0,0,.54);opacity:0;z-index:2}.md-flex{display:table}.md-flex__cell{display:table-cell;position:relative;vertical-align:top}.md-flex__cell--shrink{width:0}.md-flex__cell--stretch{display:table;width:100%;table-layout:fixed}.md-flex__ellipsis{display:table-cell;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}@page{margin:25mm}.md-content__inner{margin:0 1.6rem 2.4rem;padding-top:2.4rem}.md-content__inner:before{display:block;height:.8rem;content:""}.md-content__inner>:last-child{margin-bottom:0}.md-content__icon{position:relative;margin:.8rem 0;padding-right:0;padding-left:0;float:right}html body .md-typeset .md-content__icon{color:rgba(0,0,0,.26)}.md-header{position:fixed;top:0;right:0;left:0;height:5.6rem;-webkit-transition:background-color .25s;transition:background-color .25s;background-color:#3f51b5;color:#fff;z-index:1;-webkit-backface-visibility:hidden;backface-visibility:hidden}.md-header,.no-js .md-header{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2)}.md-header-nav{padding:.4rem}.md-header-nav__button{position:relative;-webkit-transition:opacity .25s;transition:opacity .25s;z-index:1}.md-header-nav__button:hover{opacity:.7}.md-header-nav__button.md-logo img{display:block}.no-js .md-header-nav__button.md-icon--search{display:none}.md-header-nav__title{padding:0 2rem;font-size:1.8rem;line-height:4.8rem}.md-header-nav__parent{color:hsla(0,0%,100%,.7)}.md-header-nav__parent:after{display:inline;color:hsla(0,0%,100%,.3);content:"/"}.md-header-nav__source{display:none}.md-footer-nav{background-color:rgba(0,0,0,.87);color:#fff}.md-footer-nav__inner{padding:.4rem;overflow:auto}.md-footer-nav__link{padding-top:2.8rem;padding-bottom:.8rem;-webkit-transition:opacity .25s;transition:opacity .25s}.md-footer-nav__link:hover{opacity:.7}.md-footer-nav__link--prev{width:25%;float:left}.md-footer-nav__link--next{width:75%;float:right;text-align:right}.md-footer-nav__button{-webkit-transition:background .25s;transition:background .25s}.md-footer-nav__title{position:relative;padding:0 2rem;font-size:1.8rem;line-height:4.8rem}.md-footer-nav__direction{position:absolute;right:0;left:0;margin-top:-2rem;padding:0 2rem;color:hsla(0,0%,100%,.7);font-size:1.5rem}.md-footer-meta{background:rgba(0,0,0,.895)}.md-footer-meta__inner{margin-bottom:-.1rem;padding:.4rem;overflow:auto}html .md-footer-meta.md-typeset a{color:hsla(0,0%,100%,.7)}.md-footer-copyright{margin:0 1.2rem;padding:.8rem 0;color:hsla(0,0%,100%,.3);font-size:1.28rem}.md-footer-copyright__highlight{color:hsla(0,0%,100%,.7)}.md-footer-social{margin:0 .8rem;padding:.4rem 0 1.2rem}.md-footer-social__link{display:inline-block;width:3.2rem;height:3.2rem;border:.1rem solid hsla(0,0%,100%,.12);border-radius:100%;color:hsla(0,0%,100%,.7);font-size:1.6rem;text-align:center}.md-footer-social__link:before{line-height:1.9}.md-nav{font-size:1.4rem;line-height:1.3}.md-nav--secondary{-webkit-transition:border-left .25s;transition:border-left .25s;border-left:.4rem solid #3f51b5}.md-nav--secondary .md-nav__link--active{color:#3f51b5}.md-nav__title{display:block;padding:1.2rem 1.2rem 0;font-weight:700;text-overflow:ellipsis;overflow:hidden}.md-nav__title:before{display:none;content:"arrow_back"}.md-nav__title .md-nav__button{display:none}.md-nav__list{margin:0;padding:0;list-style:none}.md-nav__item{padding:0 1.2rem}.md-nav__item:last-child{padding-bottom:1.2rem}.md-nav__item .md-nav__item{padding-right:0}.md-nav__item .md-nav__item:last-child{padding-bottom:0}.md-nav__button img{width:100%;height:auto}.md-nav__link{display:block;margin-top:.625em;-webkit-transition:color .125s;transition:color .125s;text-overflow:ellipsis;cursor:pointer;overflow:hidden}.md-nav__item--nested>.md-nav__link:after{content:"keyboard_arrow_down"}html .md-nav__link[for=toc],html .md-nav__link[for=toc]+.md-nav__link:after,html .md-nav__link[for=toc]~.md-nav{display:none}.md-nav__link[data-md-state=blur]{color:rgba(0,0,0,.54)}.md-nav__item--active>.md-nav__link,.md-nav__link:active{color:#3f51b5}.md-nav__item--nested>.md-nav__link{color:inherit}.md-nav__link:focus,.md-nav__link:hover{color:#536dfe}.md-nav__source,.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}.md-search__inner{width:100%}.md-search__form{position:relative}.md-search__input{position:relative;padding:0 4.8rem 0 7.2rem;text-overflow:ellipsis;z-index:2}.md-search__input::-webkit-input-placeholder{-webkit-transition:color .25s cubic-bezier(.1,.7,.1,1);transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input::-moz-placeholder{-webkit-transition:color .25s cubic-bezier(.1,.7,.1,1);transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input:-ms-input-placeholder{-webkit-transition:color .25s cubic-bezier(.1,.7,.1,1);transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input::placeholder{-webkit-transition:color .25s cubic-bezier(.1,.7,.1,1);transition:color .25s cubic-bezier(.1,.7,.1,1)}.md-search__input::-webkit-input-placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input::-moz-placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input:-ms-input-placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:rgba(0,0,0,.54)}.md-search__input::-ms-clear{display:none}.md-search__icon{position:absolute;-webkit-transition:color .25s cubic-bezier(.1,.7,.1,1),opacity .25s;transition:color .25s cubic-bezier(.1,.7,.1,1),opacity .25s;font-size:2.4rem;cursor:pointer;z-index:2}.md-search__icon:hover{opacity:.7}.md-search__icon[for=search]{top:.8rem;left:1.2rem}.md-search__icon[for=search]:before{content:"search"}.md-search__icon[type=reset]{top:.8rem;right:1.2rem;-webkit-transform:scale(.125);transform:scale(.125);-webkit-transition:opacity .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1);transition:opacity .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s;transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1);opacity:0}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__icon[type=reset]{-webkit-transform:scale(1);transform:scale(1);opacity:1}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__icon[type=reset]:hover{opacity:.7}.md-search__output{position:absolute;width:100%;border-radius:0 0 .2rem .2rem;overflow:hidden;z-index:1}.md-search__scrollwrap{height:100%;background:-webkit-linear-gradient(top,#fff 10%,hsla(0,0%,100%,0)),-webkit-linear-gradient(top,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background:linear-gradient(180deg,#fff 10%,hsla(0,0%,100%,0)),linear-gradient(180deg,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background-attachment:local,scroll;background-color:#fff;background-repeat:no-repeat;background-size:100% 2rem,100% 1rem;box-shadow:inset 0 .1rem 0 rgba(0,0,0,.07);overflow-y:auto;-webkit-overflow-scrolling:touch}.md-search-result{color:rgba(0,0,0,.87);word-break:break-word}.md-search-result__meta{padding:0 1.6rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-size:1.28rem;line-height:4rem}.md-search-result__list{margin:0;padding:0;border-top:.1rem solid rgba(0,0,0,.07);list-style:none}.md-search-result__item{box-shadow:0 -.1rem 0 rgba(0,0,0,.07)}.md-search-result__link{display:block;-webkit-transition:background .25s;transition:background .25s;outline:0;overflow:hidden}.md-search-result__link:hover,.md-search-result__link[data-md-state=active]{background-color:rgba(83,109,254,.1)}.md-search-result__link:hover .md-search-result__article:before,.md-search-result__link[data-md-state=active] .md-search-result__article:before{opacity:.7}.md-search-result__link:last-child .md-search-result__teaser{margin-bottom:1.2rem}.md-search-result__article{position:relative;padding:0 1.6rem;overflow:auto}.md-search-result__article--document:before{position:absolute;left:0;-webkit-transition:opacity .25s;transition:opacity .25s;color:rgba(0,0,0,.54);content:"find_in_page"}.md-search-result__article--document .md-search-result__title{margin:1.3rem 0;font-size:1.6rem;font-weight:400;line-height:1.4}.md-search-result__title{margin:.5em 0;font-size:1.28rem;font-weight:700;line-height:1.4}.md-search-result__teaser{display:-webkit-box;max-height:3.3rem;margin:.5em 0;color:rgba(0,0,0,.54);font-size:1.28rem;line-height:1.4;text-overflow:ellipsis;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:2}.md-search-result em{font-style:normal;font-weight:700;text-decoration:underline}.md-sidebar{position:absolute;width:24.2rem;padding:2.4rem 0;overflow:hidden}.md-sidebar[data-md-state=lock]{position:fixed;top:5.6rem}.md-sidebar--secondary{display:none}.md-sidebar__scrollwrap{max-height:100%;margin:0 .4rem;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden}.md-sidebar__scrollwrap::-webkit-scrollbar{width:.4rem;height:.4rem}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}@-webkit-keyframes a{0%{height:0}to{height:1.3rem}}@keyframes a{0%{height:0}to{height:1.3rem}}@-webkit-keyframes b{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes b{0%{-webkit-transform:translateY(100%);transform:translateY(100%);opacity:0}50%{opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}.md-source{display:block;padding-right:1.2rem;-webkit-transition:opacity .25s;transition:opacity .25s;font-size:1.3rem;line-height:1.2;white-space:nowrap}.md-source:hover{opacity:.7}.md-source:after,.md-source__icon{display:inline-block;height:4.8rem;content:"";vertical-align:middle}.md-source__icon{width:4.8rem}.md-source__icon svg{width:2.4rem;height:2.4rem;margin-top:1.2rem;margin-left:1.2rem}.md-source__icon+.md-source__repository{margin-left:-4.4rem;padding-left:4rem}.md-source__repository{display:inline-block;max-width:100%;margin-left:1.2rem;font-weight:700;text-overflow:ellipsis;overflow:hidden;vertical-align:middle}.md-source__facts{margin:0;padding:0;font-size:1.1rem;font-weight:700;list-style-type:none;opacity:.75;overflow:hidden}[data-md-state=done] .md-source__facts{-webkit-animation:a .25s ease-in;animation:a .25s ease-in}.md-source__fact{float:left}[data-md-state=done] .md-source__fact{-webkit-animation:b .4s ease-out;animation:b .4s ease-out}.md-source__fact:before{margin:0 .2rem;content:"\00B7"}.md-source__fact:first-child:before{display:none}.md-source-file{display:inline-block;margin:1em .5em 1em 0;padding-right:.5rem;border-radius:.2rem;background:rgba(0,0,0,.07);font-size:1.28rem;list-style-type:none;cursor:pointer;overflow:hidden}.md-source-file:before{display:inline-block;margin-right:.5rem;padding:.5rem;background:rgba(0,0,0,.26);color:#fff;font-size:1.6rem;content:"clear_all";vertical-align:middle}html .md-source-file{-webkit-transition:background .4s,color .4s,box-shadow .4s cubic-bezier(.4,0,.2,1);transition:background .4s,color .4s,box-shadow .4s cubic-bezier(.4,0,.2,1)}html .md-source-file:before{-webkit-transition:inherit;transition:inherit}html body .md-typeset .md-source-file{color:rgba(0,0,0,.54)}.md-source-file:hover{box-shadow:0 0 8px rgba(0,0,0,.18),0 8px 16px rgba(0,0,0,.36)}.md-source-file:hover:before{background:#536dfe}.md-tabs{width:100%;-webkit-transition:background .25s;transition:background .25s;background:rgba(50,64,144,.9675);overflow:auto}.md-tabs__list{margin:0;margin-left:.4rem;padding:0;list-style:none;white-space:nowrap}.md-tabs__item{display:inline-block;height:4.8rem;padding-right:1.2rem;padding-left:1.2rem}.md-tabs__link{display:block;margin-top:1.6rem;-webkit-transition:color .25s,opacity .1s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:color .25s,opacity .1s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);transition:color .25s,transform .4s cubic-bezier(.1,.7,.1,1),opacity .1s;transition:color .25s,transform .4s cubic-bezier(.1,.7,.1,1),opacity .1s,-webkit-transform .4s cubic-bezier(.1,.7,.1,1);color:hsla(0,0%,100%,.7);font-size:1.4rem}.md-tabs__link--active,.md-tabs__link:hover{color:#fff}.md-tabs__item:nth-child(2) .md-tabs__link{-webkit-transition-delay:.02s;transition-delay:.02s}.md-tabs__item:nth-child(3) .md-tabs__link{-webkit-transition-delay:.04s;transition-delay:.04s}.md-tabs__item:nth-child(4) .md-tabs__link{-webkit-transition-delay:.06s;transition-delay:.06s}.md-tabs__item:nth-child(5) .md-tabs__link{-webkit-transition-delay:.08s;transition-delay:.08s}.md-tabs__item:nth-child(6) .md-tabs__link{-webkit-transition-delay:.1s;transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{-webkit-transition-delay:.12s;transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{-webkit-transition-delay:.14s;transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{-webkit-transition-delay:.16s;transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{-webkit-transition-delay:.18s;transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{-webkit-transition-delay:.2s;transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{-webkit-transition-delay:.22s;transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{-webkit-transition-delay:.24s;transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{-webkit-transition-delay:.26s;transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{-webkit-transition-delay:.28s;transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{-webkit-transition-delay:.3s;transition-delay:.3s}.md-tabs[data-md-state=hidden]{background:#3f51b5;pointer-events:none}.md-tabs[data-md-state=hidden] .md-tabs__link{-webkit-transform:translateY(50%);transform:translateY(50%);-webkit-transition:color .25s,opacity .1s,-webkit-transform 0s .4s;transition:color .25s,opacity .1s,-webkit-transform 0s .4s;transition:color .25s,transform 0s .4s,opacity .1s;transition:color .25s,transform 0s .4s,opacity .1s,-webkit-transform 0s .4s;opacity:0}.admonition{position:relative;margin:1.5625em 0;padding:.8rem 1.2rem;border-left:3.2rem solid rgba(68,138,255,.4);border-radius:.2rem;background-color:rgba(68,138,255,.15);font-size:1.28rem}.admonition:before{position:absolute;left:-2.6rem;color:#fff;font-size:2rem;content:"edit";vertical-align:-.25em}.admonition :first-child{margin-top:0}.admonition :last-child{margin-bottom:0}.admonition.summary,.admonition.tldr{border-color:rgba(0,176,255,.4);background-color:rgba(0,176,255,.15)}.admonition.summary:before,.admonition.tldr:before{content:"subject"}.admonition.hint,.admonition.important,.admonition.tip{border-color:rgba(0,191,165,.4);background-color:rgba(0,191,165,.15)}.admonition.hint:before,.admonition.important:before,.admonition.tip:before{content:"whatshot"}.admonition.check,.admonition.done,.admonition.success{border-color:rgba(0,230,118,.4);background-color:rgba(0,230,118,.15)}.admonition.check:before,.admonition.done:before,.admonition.success:before{content:"done"}.admonition.attention,.admonition.caution,.admonition.warning{border-color:rgba(255,145,0,.4);background-color:rgba(255,145,0,.15)}.admonition.attention:before,.admonition.caution:before,.admonition.warning:before{content:"warning"}.admonition.fail,.admonition.failure,.admonition.missing{border-color:rgba(255,82,82,.4);background-color:rgba(255,82,82,.15)}.admonition.fail:before,.admonition.failure:before,.admonition.missing:before{content:"clear"}.admonition.danger,.admonition.error{border-color:rgba(255,23,68,.4);background-color:rgba(255,23,68,.15)}.admonition.danger:before,.admonition.error:before{content:"flash_on"}.admonition.bug{border-color:rgba(245,0,87,.4);background-color:rgba(245,0,87,.15)}.admonition.bug:before{content:"bug_report"}.admonition.cite,.admonition.quote{border-color:hsla(0,0%,62%,.4);background-color:hsla(0,0%,62%,.15)}.admonition.cite:before,.admonition.quote:before{content:"format_quote"}.admonition-title{font-weight:700}html .admonition-title{margin-bottom:0}html .admonition-title+*{margin-top:0}.codehilite .o,.codehilite .ow{color:inherit}.codehilite .ge{color:#000}.codehilite .gr{color:#a00}.codehilite .gh{color:#999}.codehilite .go{color:#888}.codehilite .gp{color:#555}.codehilite .gs{color:inherit}.codehilite .gu{color:#aaa}.codehilite .gt{color:#a00}.codehilite .gd{background-color:#fdd}.codehilite .gi{background-color:#dfd}.codehilite .k{color:#3b78e7}.codehilite .kc{color:#a71d5d}.codehilite .kd,.codehilite .kn{color:#3b78e7}.codehilite .kp{color:#a71d5d}.codehilite .kr,.codehilite .kt{color:#3e61a2}.codehilite .c,.codehilite .cm{color:#999}.codehilite .cp{color:#666}.codehilite .c1,.codehilite .ch,.codehilite .cs{color:#999}.codehilite .na,.codehilite .nb{color:#c2185b}.codehilite .bp{color:#3e61a2}.codehilite .nc{color:#c2185b}.codehilite .no{color:#3e61a2}.codehilite .nd,.codehilite .ni{color:#666}.codehilite .ne,.codehilite .nf{color:#c2185b}.codehilite .nl{color:#3b5179}.codehilite .nn{color:#ec407a}.codehilite .nt{color:#3b78e7}.codehilite .nv,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#3e61a2}.codehilite .nx{color:#ec407a}.codehilite .il,.codehilite .m,.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#e74c3c}.codehilite .s,.codehilite .sb,.codehilite .sc{color:#0d904f}.codehilite .sd{color:#999}.codehilite .s2{color:#0d904f}.codehilite .se,.codehilite .sh,.codehilite .si,.codehilite .sx{color:#183691}.codehilite .sr{color:#009926}.codehilite .s1,.codehilite .ss{color:#0d904f}.codehilite .err{color:#a61717}.codehilite .w{color:transparent}.codehilite .hll{display:block;margin:0 -1.2rem;padding:0 1.2rem;background-color:rgba(255,235,59,.5)}.md-typeset .codehilite{margin:1em 0;padding:1rem 1.2rem .8rem;border-radius:.2rem;background-color:hsla(0,0%,93%,.5);color:#37474f;line-height:1.4;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset .codehilite::-webkit-scrollbar{width:.4rem;height:.4rem}.md-typeset .codehilite::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-typeset .codehilite::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-typeset .codehilite pre{display:inline-block;min-width:100%;margin:0;padding:0;background-color:transparent;overflow:visible;vertical-align:top}.md-typeset .codehilitetable{display:block;margin:1em 0;border-radius:.2em;font-size:1.6rem;overflow:hidden}.md-typeset .codehilitetable tbody,.md-typeset .codehilitetable td{display:block;padding:0}.md-typeset .codehilitetable tr{display:-webkit-box;display:-ms-flexbox;display:flex}.md-typeset .codehilitetable .codehilite,.md-typeset .codehilitetable .linenodiv{margin:0;border-radius:0}.md-typeset .codehilitetable .linenodiv{padding:1rem 1.2rem .8rem}.md-typeset .codehilitetable .linenodiv,.md-typeset .codehilitetable .linenodiv>pre{height:100%}.md-typeset .codehilitetable .linenos{background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.26);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-typeset .codehilitetable .linenos pre{margin:0;padding:0;background-color:transparent;color:inherit;text-align:right}.md-typeset .codehilitetable .code{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden}.md-typeset>.codehilitetable{box-shadow:none}.md-typeset .footnote{color:rgba(0,0,0,.54);font-size:1.28rem}.md-typeset .footnote ol{margin-left:0}.md-typeset .footnote li{-webkit-transition:color .25s;transition:color .25s}.md-typeset .footnote li:before{display:block;height:0}.md-typeset .footnote li:target{color:rgba(0,0,0,.87)}.md-typeset .footnote li:target:before{margin-top:-9rem;padding-top:9rem;pointer-events:none}.md-typeset .footnote li :first-child{margin-top:0}.md-typeset .footnote li:hover .footnote-backref,.md-typeset .footnote li:target .footnote-backref{-webkit-transform:translateX(0);transform:translateX(0);opacity:1}.md-typeset .footnote li:hover .footnote-backref:hover,.md-typeset .footnote li:target .footnote-backref{color:#536dfe}.md-typeset .footnote-ref:before{display:inline;margin:0 .2em;border-left:.1rem solid rgba(0,0,0,.26);font-size:1.25em;content:"";vertical-align:-.5rem}.md-typeset .footnote-backref{display:inline-block;-webkit-transform:translateX(.5rem);transform:translateX(.5rem);-webkit-transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:color .25s,opacity .125s .125s,-webkit-transform .25s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s;transition:transform .25s .125s,color .25s,opacity .125s .125s,-webkit-transform .25s .125s;color:rgba(0,0,0,.26);font-size:0;opacity:0;vertical-align:text-bottom}.md-typeset .footnote-backref:before{font-size:1.6rem;content:"keyboard_return"}.md-typeset .headerlink{display:inline-block;margin-left:1rem;-webkit-transform:translateY(.5rem);transform:translateY(.5rem);-webkit-transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:color .25s,opacity .125s .25s,-webkit-transform .25s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s;transition:transform .25s .25s,color .25s,opacity .125s .25s,-webkit-transform .25s .25s;opacity:0}html body .md-typeset .headerlink{color:rgba(0,0,0,.26)}.md-typeset [id]:before{display:inline-block;content:""}.md-typeset [id]:target:before{margin-top:-9.8rem;padding-top:9.8rem}.md-typeset [id] .headerlink:focus,.md-typeset [id]:hover .headerlink,.md-typeset [id]:target .headerlink{-webkit-transform:translate(0);transform:translate(0);opacity:1}.md-typeset [id] .headerlink:focus,.md-typeset [id]:hover .headerlink:hover,.md-typeset [id]:target .headerlink{color:#536dfe}.md-typeset h1 .headerlink{display:none}.md-typeset h2[id]:before{display:block;margin-top:-.4rem;padding-top:.4rem}.md-typeset h2[id]:target:before{margin-top:-8.4rem;padding-top:8.4rem}.md-typeset h3[id]:before{display:block;margin-top:-.7rem;padding-top:.7rem}.md-typeset h3[id]:target:before{margin-top:-8.7rem;padding-top:8.7rem}.md-typeset h4[id]:before{display:block;margin-top:-.8rem;padding-top:.8rem}.md-typeset h4[id]:target:before{margin-top:-8.8rem;padding-top:8.8rem}.md-typeset h5[id]:before{display:block;margin-top:-1.1rem;padding-top:1.1rem}.md-typeset h5[id]:target:before{margin-top:-9.1rem;padding-top:9.1rem}.md-typeset h6[id]:before{display:block;margin-top:-1.1rem;padding-top:1.1rem}.md-typeset h6[id]:target:before{margin-top:-9.1rem;padding-top:9.1rem}.md-typeset .MJXc-display{margin:.75em 0;padding:.25em 0;overflow:auto;-webkit-overflow-scrolling:touch}.md-typeset .MathJax_CHTML{outline:0}.md-typeset .comment.critic,.md-typeset del.critic,.md-typeset ins.critic{margin:0 .25em;padding:.0625em 0;border-radius:.2rem;-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset del.critic{background-color:#fdd;box-shadow:.25em 0 0 #fdd,-.25em 0 0 #fdd}.md-typeset ins.critic{background-color:#dfd;box-shadow:.25em 0 0 #dfd,-.25em 0 0 #dfd}.md-typeset .critic.comment{background-color:hsla(0,0%,93%,.5);color:#37474f;box-shadow:.25em 0 0 hsla(0,0%,93%,.5),-.25em 0 0 hsla(0,0%,93%,.5)}.md-typeset .critic.comment:before{padding-right:.125em;color:rgba(0,0,0,.26);content:"chat";vertical-align:-.125em}.md-typeset .critic.block{display:block;margin:1em 0;padding-right:1.6rem;padding-left:1.6rem;box-shadow:none}.md-typeset .critic.block :first-child{margin-top:.5em}.md-typeset .critic.block :last-child{margin-bottom:.5em}.md-typeset .emojione{width:2rem;vertical-align:text-top}.md-typeset code.codehilite{margin:0 .29412em;padding:.07353em 0}.md-typeset .task-list-item{position:relative;list-style-type:none}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em;left:-2em}.md-typeset .task-list-control .task-list-indicator:before{position:absolute;top:.05em;left:-1.25em;color:rgba(0,0,0,.26);font-size:1.5em;content:"check_box_outline_blank";vertical-align:-.25em}.md-typeset .task-list-control [type=checkbox]:checked+.task-list-indicator:before{content:"check_box"}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}@media print{.md-typeset a:after{color:rgba(0,0,0,.54);content:" [" attr(href) "]"}.md-typeset code{box-shadow:none;-webkit-box-decoration-break:initial;box-decoration-break:slice}.md-content__icon,.md-footer,.md-header,.md-sidebar,.md-tabs,.md-typeset .headerlink{display:none}}@media only screen and (max-width:44.9375em){.md-typeset pre{margin:1em -1.6rem;padding:1rem 1.6rem;border-radius:0}.md-footer-nav__link--prev .md-footer-nav__title{display:none}.md-search-result__teaser{max-height:5rem;-webkit-line-clamp:3}.codehilite .hll{margin:0 -1.6rem;padding:0 1.6rem}.md-typeset>.codehilite{padding:1rem 1.6rem .8rem}.md-typeset>.codehilite,.md-typeset>.codehilitetable{margin:1em -1.6rem;border-radius:0}.md-typeset>.codehilitetable .codehilite,.md-typeset>.codehilitetable .linenodiv{padding:1rem 1.6rem}.md-typeset>p>.MJXc-display{margin:.75em -1.6rem;padding:.25em 1.6rem}}@media only screen and (min-width:100em){html{font-size:68.75%}}@media only screen and (min-width:125em){html{font-size:75%}}@media only screen and (max-width:59.9375em){body[data-md-state=lock]{overflow:hidden}.ios body[data-md-state=lock] .md-container{display:none}.md-nav--secondary{border-left:0}html .md-nav__link[for=toc]{display:block;padding-right:4.8rem}html .md-nav__link[for=toc]:after{color:inherit;content:"toc"}html .md-nav__link[for=toc]+.md-nav__link{display:none}html .md-nav__link[for=toc]~.md-nav{display:-webkit-box;display:-ms-flexbox;display:flex}.md-nav__source{display:block;padding:.4rem;background-color:rgba(50,64,144,.9675);color:#fff}.md-search__overlay{position:absolute;top:.4rem;left:.4rem;width:4rem;height:4rem;-webkit-transform-origin:center;transform-origin:center;-webkit-transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:opacity .2s .2s,-webkit-transform .3s .1s;transition:transform .3s .1s,opacity .2s .2s;transition:transform .3s .1s,opacity .2s .2s,-webkit-transform .3s .1s;border-radius:2rem;background-color:#fff;overflow:hidden;pointer-events:none}[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transition:opacity .1s,-webkit-transform .4s;transition:opacity .1s,-webkit-transform .4s;transition:transform .4s,opacity .1s;transition:transform .4s,opacity .1s,-webkit-transform .4s;opacity:1}.md-search__inner{position:fixed;top:0;left:100%;height:100%;-webkit-transform:translateX(5%);transform:translateX(5%);-webkit-transition:left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:left 0s .3s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;transition:left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;transition:left 0s .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.4,0,.2,1) .15s;opacity:0;z-index:2}[data-md-toggle=search]:checked~.md-header .md-search__inner{left:0;-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:left 0s 0s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;transition:left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;transition:left 0s 0s,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s,-webkit-transform .15s cubic-bezier(.1,.7,.1,1) .15s;opacity:1}.md-search__input{width:100%;height:5.6rem;font-size:1.8rem}.md-search__icon[for=search]{top:1.6rem;left:1.6rem}.md-search__icon[for=search][for=search]:before{content:"arrow_back"}.md-search__icon[type=reset]{top:1.6rem;right:1.6rem}.md-search__output{top:5.6rem;bottom:0}.md-search-result__article--document:before{display:none}}@media only screen and (max-width:76.1875em){[data-md-toggle=drawer]:checked~.md-overlay{width:100%;height:100%;-webkit-transition:width 0s,height 0s,opacity .25s;transition:width 0s,height 0s,opacity .25s;opacity:1}.md-header-nav__button.md-icon--home,.md-header-nav__button.md-logo{display:none}.md-nav{background-color:#fff}.md-nav--primary,.md-nav--primary .md-nav{display:-webkit-box;display:-ms-flexbox;display:flex;position:absolute;top:0;right:0;left:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:100%;z-index:1}.md-nav--primary .md-nav__item,.md-nav--primary .md-nav__title{font-size:1.6rem;line-height:1.5}html .md-nav--primary .md-nav__title{position:relative;height:11.2rem;padding:6rem 1.6rem .4rem;background-color:rgba(0,0,0,.07);color:rgba(0,0,0,.54);font-weight:400;line-height:4.8rem;white-space:nowrap;cursor:pointer}html .md-nav--primary .md-nav__title:before{display:block;position:absolute;top:.4rem;left:.4rem;width:4rem;height:4rem;color:rgba(0,0,0,.54)}html .md-nav--primary .md-nav__title~.md-nav__list{background:-webkit-linear-gradient(top,#fff 10%,hsla(0,0%,100%,0)),-webkit-linear-gradient(top,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background:linear-gradient(180deg,#fff 10%,hsla(0,0%,100%,0)),linear-gradient(180deg,rgba(0,0,0,.26),rgba(0,0,0,.07) 35%,transparent 60%);background-attachment:local,scroll;background-color:#fff;background-repeat:no-repeat;background-size:100% 2rem,100% 1rem;box-shadow:inset 0 .1rem 0 rgba(0,0,0,.07)}html .md-nav--primary .md-nav__title~.md-nav__list>.md-nav__item:first-child{border-top:0}html .md-nav--primary .md-nav__title--site{position:relative;background-color:#3f51b5;color:#fff}html .md-nav--primary .md-nav__title--site .md-nav__button{display:block;position:absolute;top:.4rem;left:.4rem;width:6.4rem;height:6.4rem;font-size:4.8rem}html .md-nav--primary .md-nav__title--site:before{display:none}.md-nav--primary .md-nav__list{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow-y:auto}.md-nav--primary .md-nav__item{padding:0;border-top:.1rem solid rgba(0,0,0,.07)}.md-nav--primary .md-nav__item--nested>.md-nav__link{padding-right:4.8rem}.md-nav--primary .md-nav__item--nested>.md-nav__link:after{content:"keyboard_arrow_right"}.md-nav--primary .md-nav__link{position:relative;margin-top:0;padding:1.6rem}.md-nav--primary .md-nav__link:after{position:absolute;top:50%;right:1.2rem;margin-top:-1.2rem;color:rgba(0,0,0,.54);font-size:2.4rem}.md-nav--primary .md-nav__link:focus:after,.md-nav--primary .md-nav__link:hover:after{color:inherit}.md-nav--primary .md-nav--secondary .md-nav__link{position:static}.md-nav--primary .md-nav--secondary .md-nav{position:static;background-color:transparent}.md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:2.8rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:4rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:5.2rem}.md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:6.4rem}.md-nav__toggle~.md-nav{display:none}.csstransforms3d .md-nav__toggle~.md-nav{-webkit-transform:translateX(100%);transform:translateX(100%);-webkit-transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s;transition:transform .25s cubic-bezier(.8,0,.6,1),opacity .125s .05s,-webkit-transform .25s cubic-bezier(.8,0,.6,1);opacity:0}.csstransforms3d .md-nav__toggle~.md-nav,.md-nav__toggle:checked~.md-nav{display:-webkit-box;display:-ms-flexbox;display:flex}.csstransforms3d .md-nav__toggle:checked~.md-nav{-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .125s .125s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);opacity:1}.md-sidebar--primary{position:fixed;top:0;left:-24.2rem;width:24.2rem;height:100%;-webkit-transform:translateX(0);transform:translateX(0);-webkit-transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s,-webkit-transform .25s cubic-bezier(.4,0,.2,1);background-color:#fff;z-index:2}.no-csstransforms3d .md-sidebar--primary{display:none}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.4);-webkit-transform:translateX(24.2rem);transform:translateX(24.2rem)}.no-csstransforms3d [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{display:block}.md-sidebar--primary .md-sidebar__scrollwrap{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;margin:0}.md-tabs{display:none}}@media only screen and (min-width:60em){.md-content{margin-right:24.2rem}.md-header-nav__button.md-icon--search{display:none}.md-header-nav__source{display:block;width:23rem;max-width:23rem;padding-right:1.2rem}.md-search{margin-right:2.8rem;padding:.4rem}.md-search__overlay{position:fixed;top:0;left:0;width:0;height:0;-webkit-transition:width 0s .25s,height 0s .25s,opacity .25s;transition:width 0s .25s,height 0s .25s,opacity .25s;background-color:rgba(0,0,0,.54);cursor:pointer}[data-md-toggle=search]:checked~.md-header .md-search__overlay{width:100%;height:100%;-webkit-transition:width 0s,height 0s,opacity .25s;transition:width 0s,height 0s,opacity .25s;opacity:1}.md-search__inner{position:relative}.md-search__form{width:23rem;float:right;-webkit-transition:width .25s cubic-bezier(.1,.7,.1,1);transition:width .25s cubic-bezier(.1,.7,.1,1);border-radius:.2rem}.md-search__input{width:100%;height:4rem;padding-left:4.8rem;-webkit-transition:background-color .25s cubic-bezier(.1,.7,.1,1),color .25s cubic-bezier(.1,.7,.1,1);transition:background-color .25s cubic-bezier(.1,.7,.1,1),color .25s cubic-bezier(.1,.7,.1,1);border-radius:.2rem;background-color:rgba(0,0,0,.26);color:#fff;font-size:1.6rem}.md-search__input+.md-search__icon,.md-search__input::-webkit-input-placeholder{color:#fff}.md-search__input+.md-search__icon,.md-search__input::-moz-placeholder{color:#fff}.md-search__input+.md-search__icon,.md-search__input:-ms-input-placeholder{color:#fff}.md-search__input+.md-search__icon,.md-search__input::placeholder{color:#fff}.md-search__input:hover{background-color:hsla(0,0%,100%,.12)}[data-md-toggle=search]:checked~.md-header .md-search__input{border-radius:.2rem .2rem 0 0;background-color:#fff;color:rgba(0,0,0,.87);text-overflow:none}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-webkit-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::-moz-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input:-ms-input-placeholder{color:rgba(0,0,0,.54)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:rgba(0,0,0,.54)}.md-search__output{top:4rem;-webkit-transition:opacity .4s;transition:opacity .4s;opacity:0}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.4);opacity:1}.md-search__scrollwrap{max-height:0}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap::-webkit-scrollbar{width:.4rem;height:.4rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.26)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}.md-search-result__article,.md-search-result__meta{padding-left:4.8rem}.md-sidebar--secondary{display:block;margin-left:100%;-webkit-transform:translate(-100%);transform:translate(-100%)}}@media only screen and (min-width:76.25em){.md-content{margin-left:24.2rem}.md-content__inner{margin-right:2.4rem;margin-left:2.4rem}.md-header{box-shadow:none}.md-header[data-md-state=shadow]{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2)}.md-header-nav__button.md-icon--menu{display:none}.md-nav[data-md-state=animate]{-webkit-transition:max-height .25s cubic-bezier(.86,0,.07,1);transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav__toggle~.md-nav{max-height:0;overflow:hidden}.md-nav[data-md-state=expand],.md-nav__toggle:checked~.md-nav{max-height:100%}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--nested>.md-nav__link:after{display:inline-block;-webkit-transform-origin:.45em .45em;transform-origin:.45em .45em;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;vertical-align:-.125em}.js .md-nav__item--nested>.md-nav__link:after{-webkit-transition:-webkit-transform .4s;transition:-webkit-transform .4s;transition:transform .4s;transition:transform .4s,-webkit-transform .4s}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link:after{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__form{width:68.8rem}.md-sidebar--secondary{margin-left:122rem}.md-sidebar__inner{border-right:.1rem solid rgba(0,0,0,.07)}.md-tabs~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested{font-size:0}.md-tabs--active~.md-main .md-nav--primary .md-nav__title--site{display:none}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item{font-size:0}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested{display:none;font-size:1.4rem;overflow:auto}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested>.md-nav__link{margin-top:1.2rem;font-weight:700;pointer-events:none}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--nested>.md-nav__link:after{display:none}.md-tabs--active~.md-main .md-nav--primary>.md-nav__list>.md-nav__item--active{display:block}.md-tabs--active~.md-main .md-nav[data-md-level="1"]{max-height:none}.md-tabs--active~.md-main .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{padding-left:0}}@media only screen and (max-width:29.9375em){.md-header-nav__parent{display:none}[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(45);transform:scale(45)}}@media only screen and (min-width:45em){.md-footer-nav__link{width:50%}.md-footer-copyright{max-width:75%;float:left}.md-footer-social{padding:1.2rem 0;float:right}}@media only screen and (min-width:30em) and (max-width:44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(60);transform:scale(60)}}@media only screen and (min-width:45em) and (max-width:59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{-webkit-transform:scale(75);transform:scale(75)}}@media only screen and (min-width:60em) and (max-width:76.1875em){.md-search__scrollwrap,[data-md-toggle=search]:checked~.md-header .md-search__form{width:46.8rem}.md-search-result__teaser{max-height:5rem;-webkit-line-clamp:3}} \ No newline at end of file
diff --git a/docs/build/assets/stylesheets/application-f78e5cb881.palette.css b/docs/build/assets/stylesheets/application-f78e5cb881.palette.css
new file mode 100644
index 0000000..69bbee0
--- /dev/null
+++ b/docs/build/assets/stylesheets/application-f78e5cb881.palette.css
@@ -0,0 +1 @@
+button[data-md-color-accent],button[data-md-color-primary]{width:13rem;margin-bottom:.4rem;padding:2.4rem .8rem .4rem;-webkit-transition:background-color .25s,opacity .25s;transition:background-color .25s,opacity .25s;border-radius:.2rem;color:#fff;font-size:1.28rem;text-align:left;cursor:pointer}button[data-md-color-accent]:hover,button[data-md-color-primary]:hover{opacity:.75}button[data-md-color-primary=red]{background-color:#ef5350}[data-md-color-primary=red] .md-typeset a{color:#ef5350}[data-md-color-primary=red] .md-header{background-color:#ef5350}[data-md-color-primary=red] .md-nav__item--active>.md-nav__link,[data-md-color-primary=red] .md-nav__link:active{color:#ef5350}[data-md-color-primary=red] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=pink]{background-color:#e91e63}[data-md-color-primary=pink] .md-typeset a{color:#e91e63}[data-md-color-primary=pink] .md-header{background-color:#e91e63}[data-md-color-primary=pink] .md-nav__item--active>.md-nav__link,[data-md-color-primary=pink] .md-nav__link:active{color:#e91e63}[data-md-color-primary=pink] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=purple]{background-color:#ab47bc}[data-md-color-primary=purple] .md-typeset a{color:#ab47bc}[data-md-color-primary=purple] .md-header{background-color:#ab47bc}[data-md-color-primary=purple] .md-nav__item--active>.md-nav__link,[data-md-color-primary=purple] .md-nav__link:active{color:#ab47bc}[data-md-color-primary=purple] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=deep-purple]{background-color:#7e57c2}[data-md-color-primary=deep-purple] .md-typeset a{color:#7e57c2}[data-md-color-primary=deep-purple] .md-header{background-color:#7e57c2}[data-md-color-primary=deep-purple] .md-nav__item--active>.md-nav__link,[data-md-color-primary=deep-purple] .md-nav__link:active{color:#7e57c2}[data-md-color-primary=deep-purple] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=indigo]{background-color:#3f51b5}[data-md-color-primary=indigo] .md-typeset a{color:#3f51b5}[data-md-color-primary=indigo] .md-header{background-color:#3f51b5}[data-md-color-primary=indigo] .md-nav__item--active>.md-nav__link,[data-md-color-primary=indigo] .md-nav__link:active{color:#3f51b5}[data-md-color-primary=indigo] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=blue]{background-color:#2196f3}[data-md-color-primary=blue] .md-typeset a{color:#2196f3}[data-md-color-primary=blue] .md-header{background-color:#2196f3}[data-md-color-primary=blue] .md-nav__item--active>.md-nav__link,[data-md-color-primary=blue] .md-nav__link:active{color:#2196f3}[data-md-color-primary=blue] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=light-blue]{background-color:#03a9f4}[data-md-color-primary=light-blue] .md-typeset a{color:#03a9f4}[data-md-color-primary=light-blue] .md-header{background-color:#03a9f4}[data-md-color-primary=light-blue] .md-nav__item--active>.md-nav__link,[data-md-color-primary=light-blue] .md-nav__link:active{color:#03a9f4}[data-md-color-primary=light-blue] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=cyan]{background-color:#00bcd4}[data-md-color-primary=cyan] .md-typeset a{color:#00bcd4}[data-md-color-primary=cyan] .md-header{background-color:#00bcd4}[data-md-color-primary=cyan] .md-nav__item--active>.md-nav__link,[data-md-color-primary=cyan] .md-nav__link:active{color:#00bcd4}[data-md-color-primary=cyan] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=teal]{background-color:#009688}[data-md-color-primary=teal] .md-typeset a{color:#009688}[data-md-color-primary=teal] .md-header{background-color:#009688}[data-md-color-primary=teal] .md-nav__item--active>.md-nav__link,[data-md-color-primary=teal] .md-nav__link:active{color:#009688}[data-md-color-primary=teal] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=green]{background-color:#4caf50}[data-md-color-primary=green] .md-typeset a{color:#4caf50}[data-md-color-primary=green] .md-header{background-color:#4caf50}[data-md-color-primary=green] .md-nav__item--active>.md-nav__link,[data-md-color-primary=green] .md-nav__link:active{color:#4caf50}[data-md-color-primary=green] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=light-green]{background-color:#7cb342}[data-md-color-primary=light-green] .md-typeset a{color:#7cb342}[data-md-color-primary=light-green] .md-header{background-color:#7cb342}[data-md-color-primary=light-green] .md-nav__item--active>.md-nav__link,[data-md-color-primary=light-green] .md-nav__link:active{color:#7cb342}[data-md-color-primary=light-green] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=lime]{background-color:#c0ca33}[data-md-color-primary=lime] .md-typeset a{color:#c0ca33}[data-md-color-primary=lime] .md-header{background-color:#c0ca33}[data-md-color-primary=lime] .md-nav__item--active>.md-nav__link,[data-md-color-primary=lime] .md-nav__link:active{color:#c0ca33}[data-md-color-primary=lime] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=yellow]{background-color:#f9a825}[data-md-color-primary=yellow] .md-typeset a{color:#f9a825}[data-md-color-primary=yellow] .md-header{background-color:#f9a825}[data-md-color-primary=yellow] .md-nav__item--active>.md-nav__link,[data-md-color-primary=yellow] .md-nav__link:active{color:#f9a825}[data-md-color-primary=yellow] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=amber]{background-color:#ffb300}[data-md-color-primary=amber] .md-typeset a{color:#ffb300}[data-md-color-primary=amber] .md-header{background-color:#ffb300}[data-md-color-primary=amber] .md-nav__item--active>.md-nav__link,[data-md-color-primary=amber] .md-nav__link:active{color:#ffb300}[data-md-color-primary=amber] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=orange]{background-color:#fb8c00}[data-md-color-primary=orange] .md-typeset a{color:#fb8c00}[data-md-color-primary=orange] .md-header{background-color:#fb8c00}[data-md-color-primary=orange] .md-nav__item--active>.md-nav__link,[data-md-color-primary=orange] .md-nav__link:active{color:#fb8c00}[data-md-color-primary=orange] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=deep-orange]{background-color:#ff7043}[data-md-color-primary=deep-orange] .md-typeset a{color:#ff7043}[data-md-color-primary=deep-orange] .md-header{background-color:#ff7043}[data-md-color-primary=deep-orange] .md-nav__item--active>.md-nav__link,[data-md-color-primary=deep-orange] .md-nav__link:active{color:#ff7043}[data-md-color-primary=deep-orange] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=brown]{background-color:#795548}[data-md-color-primary=brown] .md-typeset a{color:#795548}[data-md-color-primary=brown] .md-header{background-color:#795548}[data-md-color-primary=brown] .md-nav__item--active>.md-nav__link,[data-md-color-primary=brown] .md-nav__link:active{color:#795548}[data-md-color-primary=brown] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=grey]{background-color:#757575}[data-md-color-primary=grey] .md-typeset a{color:#757575}[data-md-color-primary=grey] .md-header{background-color:#757575}[data-md-color-primary=grey] .md-nav__item--active>.md-nav__link,[data-md-color-primary=grey] .md-nav__link:active{color:#757575}[data-md-color-primary=grey] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-primary=blue-grey]{background-color:#546e7a}[data-md-color-primary=blue-grey] .md-typeset a{color:#546e7a}[data-md-color-primary=blue-grey] .md-header{background-color:#546e7a}[data-md-color-primary=blue-grey] .md-nav__item--active>.md-nav__link,[data-md-color-primary=blue-grey] .md-nav__link:active{color:#546e7a}[data-md-color-primary=blue-grey] .md-nav__item--nested>.md-nav__link{color:inherit}button[data-md-color-accent=red]{background-color:#ff1744}[data-md-color-accent=red] .md-typeset a:active,[data-md-color-accent=red] .md-typeset a:hover{color:#ff1744}[data-md-color-accent=red] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=red] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#ff1744}[data-md-color-accent=red] .md-nav__link:hover,[data-md-color-accent=red] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=red] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=red] .md-typeset [id] .headerlink:focus,[data-md-color-accent=red] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=red] .md-typeset [id]:target .headerlink{color:#ff1744}[data-md-color-accent=red] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff1744}[data-md-color-accent=red] .md-search-result__link:hover,[data-md-color-accent=red] .md-search-result__link[data-md-state=active]{background-color:rgba(255,23,68,.1)}[data-md-color-accent=red] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff1744}[data-md-color-accent=red] .md-source-file:hover:before{background-color:#ff1744}button[data-md-color-accent=pink]{background-color:#f50057}[data-md-color-accent=pink] .md-typeset a:active,[data-md-color-accent=pink] .md-typeset a:hover{color:#f50057}[data-md-color-accent=pink] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=pink] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#f50057}[data-md-color-accent=pink] .md-nav__link:hover,[data-md-color-accent=pink] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=pink] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=pink] .md-typeset [id] .headerlink:focus,[data-md-color-accent=pink] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=pink] .md-typeset [id]:target .headerlink{color:#f50057}[data-md-color-accent=pink] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#f50057}[data-md-color-accent=pink] .md-search-result__link:hover,[data-md-color-accent=pink] .md-search-result__link[data-md-state=active]{background-color:rgba(245,0,87,.1)}[data-md-color-accent=pink] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#f50057}[data-md-color-accent=pink] .md-source-file:hover:before{background-color:#f50057}button[data-md-color-accent=purple]{background-color:#e040fb}[data-md-color-accent=purple] .md-typeset a:active,[data-md-color-accent=purple] .md-typeset a:hover{color:#e040fb}[data-md-color-accent=purple] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=purple] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#e040fb}[data-md-color-accent=purple] .md-nav__link:hover,[data-md-color-accent=purple] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=purple] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=purple] .md-typeset [id] .headerlink:focus,[data-md-color-accent=purple] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=purple] .md-typeset [id]:target .headerlink{color:#e040fb}[data-md-color-accent=purple] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#e040fb}[data-md-color-accent=purple] .md-search-result__link:hover,[data-md-color-accent=purple] .md-search-result__link[data-md-state=active]{background-color:rgba(224,64,251,.1)}[data-md-color-accent=purple] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#e040fb}[data-md-color-accent=purple] .md-source-file:hover:before{background-color:#e040fb}button[data-md-color-accent=deep-purple]{background-color:#7c4dff}[data-md-color-accent=deep-purple] .md-typeset a:active,[data-md-color-accent=deep-purple] .md-typeset a:hover{color:#7c4dff}[data-md-color-accent=deep-purple] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=deep-purple] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#7c4dff}[data-md-color-accent=deep-purple] .md-nav__link:hover,[data-md-color-accent=deep-purple] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=deep-purple] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=deep-purple] .md-typeset [id] .headerlink:focus,[data-md-color-accent=deep-purple] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=deep-purple] .md-typeset [id]:target .headerlink{color:#7c4dff}[data-md-color-accent=deep-purple] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#7c4dff}[data-md-color-accent=deep-purple] .md-search-result__link:hover,[data-md-color-accent=deep-purple] .md-search-result__link[data-md-state=active]{background-color:rgba(124,77,255,.1)}[data-md-color-accent=deep-purple] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#7c4dff}[data-md-color-accent=deep-purple] .md-source-file:hover:before{background-color:#7c4dff}button[data-md-color-accent=indigo]{background-color:#536dfe}[data-md-color-accent=indigo] .md-typeset a:active,[data-md-color-accent=indigo] .md-typeset a:hover{color:#536dfe}[data-md-color-accent=indigo] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=indigo] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#536dfe}[data-md-color-accent=indigo] .md-nav__link:hover,[data-md-color-accent=indigo] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=indigo] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=indigo] .md-typeset [id] .headerlink:focus,[data-md-color-accent=indigo] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=indigo] .md-typeset [id]:target .headerlink{color:#536dfe}[data-md-color-accent=indigo] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}[data-md-color-accent=indigo] .md-search-result__link:hover,[data-md-color-accent=indigo] .md-search-result__link[data-md-state=active]{background-color:rgba(83,109,254,.1)}[data-md-color-accent=indigo] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#536dfe}[data-md-color-accent=indigo] .md-source-file:hover:before{background-color:#536dfe}button[data-md-color-accent=blue]{background-color:#448aff}[data-md-color-accent=blue] .md-typeset a:active,[data-md-color-accent=blue] .md-typeset a:hover{color:#448aff}[data-md-color-accent=blue] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=blue] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#448aff}[data-md-color-accent=blue] .md-nav__link:hover,[data-md-color-accent=blue] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=blue] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=blue] .md-typeset [id] .headerlink:focus,[data-md-color-accent=blue] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=blue] .md-typeset [id]:target .headerlink{color:#448aff}[data-md-color-accent=blue] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#448aff}[data-md-color-accent=blue] .md-search-result__link:hover,[data-md-color-accent=blue] .md-search-result__link[data-md-state=active]{background-color:rgba(68,138,255,.1)}[data-md-color-accent=blue] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#448aff}[data-md-color-accent=blue] .md-source-file:hover:before{background-color:#448aff}button[data-md-color-accent=light-blue]{background-color:#0091ea}[data-md-color-accent=light-blue] .md-typeset a:active,[data-md-color-accent=light-blue] .md-typeset a:hover{color:#0091ea}[data-md-color-accent=light-blue] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=light-blue] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#0091ea}[data-md-color-accent=light-blue] .md-nav__link:hover,[data-md-color-accent=light-blue] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=light-blue] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=light-blue] .md-typeset [id] .headerlink:focus,[data-md-color-accent=light-blue] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=light-blue] .md-typeset [id]:target .headerlink{color:#0091ea}[data-md-color-accent=light-blue] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#0091ea}[data-md-color-accent=light-blue] .md-search-result__link:hover,[data-md-color-accent=light-blue] .md-search-result__link[data-md-state=active]{background-color:rgba(0,145,234,.1)}[data-md-color-accent=light-blue] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#0091ea}[data-md-color-accent=light-blue] .md-source-file:hover:before{background-color:#0091ea}button[data-md-color-accent=cyan]{background-color:#00b8d4}[data-md-color-accent=cyan] .md-typeset a:active,[data-md-color-accent=cyan] .md-typeset a:hover{color:#00b8d4}[data-md-color-accent=cyan] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=cyan] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#00b8d4}[data-md-color-accent=cyan] .md-nav__link:hover,[data-md-color-accent=cyan] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=cyan] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=cyan] .md-typeset [id] .headerlink:focus,[data-md-color-accent=cyan] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=cyan] .md-typeset [id]:target .headerlink{color:#00b8d4}[data-md-color-accent=cyan] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00b8d4}[data-md-color-accent=cyan] .md-search-result__link:hover,[data-md-color-accent=cyan] .md-search-result__link[data-md-state=active]{background-color:rgba(0,184,212,.1)}[data-md-color-accent=cyan] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00b8d4}[data-md-color-accent=cyan] .md-source-file:hover:before{background-color:#00b8d4}button[data-md-color-accent=teal]{background-color:#00bfa5}[data-md-color-accent=teal] .md-typeset a:active,[data-md-color-accent=teal] .md-typeset a:hover{color:#00bfa5}[data-md-color-accent=teal] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=teal] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#00bfa5}[data-md-color-accent=teal] .md-nav__link:hover,[data-md-color-accent=teal] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=teal] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=teal] .md-typeset [id] .headerlink:focus,[data-md-color-accent=teal] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=teal] .md-typeset [id]:target .headerlink{color:#00bfa5}[data-md-color-accent=teal] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00bfa5}[data-md-color-accent=teal] .md-search-result__link:hover,[data-md-color-accent=teal] .md-search-result__link[data-md-state=active]{background-color:rgba(0,191,165,.1)}[data-md-color-accent=teal] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00bfa5}[data-md-color-accent=teal] .md-source-file:hover:before{background-color:#00bfa5}button[data-md-color-accent=green]{background-color:#00c853}[data-md-color-accent=green] .md-typeset a:active,[data-md-color-accent=green] .md-typeset a:hover{color:#00c853}[data-md-color-accent=green] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=green] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#00c853}[data-md-color-accent=green] .md-nav__link:hover,[data-md-color-accent=green] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=green] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=green] .md-typeset [id] .headerlink:focus,[data-md-color-accent=green] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=green] .md-typeset [id]:target .headerlink{color:#00c853}[data-md-color-accent=green] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00c853}[data-md-color-accent=green] .md-search-result__link:hover,[data-md-color-accent=green] .md-search-result__link[data-md-state=active]{background-color:rgba(0,200,83,.1)}[data-md-color-accent=green] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#00c853}[data-md-color-accent=green] .md-source-file:hover:before{background-color:#00c853}button[data-md-color-accent=light-green]{background-color:#64dd17}[data-md-color-accent=light-green] .md-typeset a:active,[data-md-color-accent=light-green] .md-typeset a:hover{color:#64dd17}[data-md-color-accent=light-green] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=light-green] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#64dd17}[data-md-color-accent=light-green] .md-nav__link:hover,[data-md-color-accent=light-green] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=light-green] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=light-green] .md-typeset [id] .headerlink:focus,[data-md-color-accent=light-green] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=light-green] .md-typeset [id]:target .headerlink{color:#64dd17}[data-md-color-accent=light-green] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#64dd17}[data-md-color-accent=light-green] .md-search-result__link:hover,[data-md-color-accent=light-green] .md-search-result__link[data-md-state=active]{background-color:rgba(100,221,23,.1)}[data-md-color-accent=light-green] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#64dd17}[data-md-color-accent=light-green] .md-source-file:hover:before{background-color:#64dd17}button[data-md-color-accent=lime]{background-color:#aeea00}[data-md-color-accent=lime] .md-typeset a:active,[data-md-color-accent=lime] .md-typeset a:hover{color:#aeea00}[data-md-color-accent=lime] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=lime] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#aeea00}[data-md-color-accent=lime] .md-nav__link:hover,[data-md-color-accent=lime] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=lime] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=lime] .md-typeset [id] .headerlink:focus,[data-md-color-accent=lime] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=lime] .md-typeset [id]:target .headerlink{color:#aeea00}[data-md-color-accent=lime] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#aeea00}[data-md-color-accent=lime] .md-search-result__link:hover,[data-md-color-accent=lime] .md-search-result__link[data-md-state=active]{background-color:rgba(174,234,0,.1)}[data-md-color-accent=lime] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#aeea00}[data-md-color-accent=lime] .md-source-file:hover:before{background-color:#aeea00}button[data-md-color-accent=yellow]{background-color:#ffd600}[data-md-color-accent=yellow] .md-typeset a:active,[data-md-color-accent=yellow] .md-typeset a:hover{color:#ffd600}[data-md-color-accent=yellow] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=yellow] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#ffd600}[data-md-color-accent=yellow] .md-nav__link:hover,[data-md-color-accent=yellow] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=yellow] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=yellow] .md-typeset [id] .headerlink:focus,[data-md-color-accent=yellow] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=yellow] .md-typeset [id]:target .headerlink{color:#ffd600}[data-md-color-accent=yellow] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffd600}[data-md-color-accent=yellow] .md-search-result__link:hover,[data-md-color-accent=yellow] .md-search-result__link[data-md-state=active]{background-color:rgba(255,214,0,.1)}[data-md-color-accent=yellow] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffd600}[data-md-color-accent=yellow] .md-source-file:hover:before{background-color:#ffd600}button[data-md-color-accent=amber]{background-color:#ffab00}[data-md-color-accent=amber] .md-typeset a:active,[data-md-color-accent=amber] .md-typeset a:hover{color:#ffab00}[data-md-color-accent=amber] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=amber] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#ffab00}[data-md-color-accent=amber] .md-nav__link:hover,[data-md-color-accent=amber] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=amber] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=amber] .md-typeset [id] .headerlink:focus,[data-md-color-accent=amber] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=amber] .md-typeset [id]:target .headerlink{color:#ffab00}[data-md-color-accent=amber] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffab00}[data-md-color-accent=amber] .md-search-result__link:hover,[data-md-color-accent=amber] .md-search-result__link[data-md-state=active]{background-color:rgba(255,171,0,.1)}[data-md-color-accent=amber] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ffab00}[data-md-color-accent=amber] .md-source-file:hover:before{background-color:#ffab00}button[data-md-color-accent=orange]{background-color:#ff9100}[data-md-color-accent=orange] .md-typeset a:active,[data-md-color-accent=orange] .md-typeset a:hover{color:#ff9100}[data-md-color-accent=orange] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=orange] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#ff9100}[data-md-color-accent=orange] .md-nav__link:hover,[data-md-color-accent=orange] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=orange] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=orange] .md-typeset [id] .headerlink:focus,[data-md-color-accent=orange] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=orange] .md-typeset [id]:target .headerlink{color:#ff9100}[data-md-color-accent=orange] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff9100}[data-md-color-accent=orange] .md-search-result__link:hover,[data-md-color-accent=orange] .md-search-result__link[data-md-state=active]{background-color:rgba(255,145,0,.1)}[data-md-color-accent=orange] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff9100}[data-md-color-accent=orange] .md-source-file:hover:before{background-color:#ff9100}button[data-md-color-accent=deep-orange]{background-color:#ff6e40}[data-md-color-accent=deep-orange] .md-typeset a:active,[data-md-color-accent=deep-orange] .md-typeset a:hover{color:#ff6e40}[data-md-color-accent=deep-orange] .md-typeset .codehilite::-webkit-scrollbar-thumb:hover,[data-md-color-accent=deep-orange] .md-typeset pre::-webkit-scrollbar-thumb:hover{background-color:#ff6e40}[data-md-color-accent=deep-orange] .md-nav__link:hover,[data-md-color-accent=deep-orange] .md-typeset .footnote li:hover .footnote-backref:hover,[data-md-color-accent=deep-orange] .md-typeset .footnote li:target .footnote-backref,[data-md-color-accent=deep-orange] .md-typeset [id] .headerlink:focus,[data-md-color-accent=deep-orange] .md-typeset [id]:hover .headerlink:hover,[data-md-color-accent=deep-orange] .md-typeset [id]:target .headerlink{color:#ff6e40}[data-md-color-accent=deep-orange] .md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff6e40}[data-md-color-accent=deep-orange] .md-search-result__link:hover,[data-md-color-accent=deep-orange] .md-search-result__link[data-md-state=active]{background-color:rgba(255,110,64,.1)}[data-md-color-accent=deep-orange] .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:#ff6e40}[data-md-color-accent=deep-orange] .md-source-file:hover:before{background-color:#ff6e40}@media only screen and (max-width:59.9375em){[data-md-color-primary=red] .md-nav__source{background-color:rgba(190,66,64,.9675)}[data-md-color-primary=pink] .md-nav__source{background-color:rgba(185,24,79,.9675)}[data-md-color-primary=purple] .md-nav__source{background-color:rgba(136,57,150,.9675)}[data-md-color-primary=deep-purple] .md-nav__source{background-color:rgba(100,69,154,.9675)}[data-md-color-primary=indigo] .md-nav__source{background-color:rgba(50,64,144,.9675)}[data-md-color-primary=blue] .md-nav__source{background-color:rgba(26,119,193,.9675)}[data-md-color-primary=light-blue] .md-nav__source{background-color:rgba(2,134,194,.9675)}[data-md-color-primary=cyan] .md-nav__source{background-color:rgba(0,150,169,.9675)}[data-md-color-primary=teal] .md-nav__source{background-color:rgba(0,119,108,.9675)}[data-md-color-primary=green] .md-nav__source{background-color:rgba(60,139,64,.9675)}[data-md-color-primary=light-green] .md-nav__source{background-color:rgba(99,142,53,.9675)}[data-md-color-primary=lime] .md-nav__source{background-color:rgba(153,161,41,.9675)}[data-md-color-primary=yellow] .md-nav__source{background-color:rgba(198,134,29,.9675)}[data-md-color-primary=amber] .md-nav__source{background-color:rgba(203,142,0,.9675)}[data-md-color-primary=orange] .md-nav__source{background-color:rgba(200,111,0,.9675)}[data-md-color-primary=deep-orange] .md-nav__source{background-color:rgba(203,89,53,.9675)}[data-md-color-primary=brown] .md-nav__source{background-color:rgba(96,68,57,.9675)}[data-md-color-primary=grey] .md-nav__source{background-color:rgba(93,93,93,.9675)}[data-md-color-primary=blue-grey] .md-nav__source{background-color:rgba(67,88,97,.9675)}}@media only screen and (max-width:76.1875em){html [data-md-color-primary=red] .md-nav--primary .md-nav__title--site{background-color:#ef5350}html [data-md-color-primary=pink] .md-nav--primary .md-nav__title--site{background-color:#e91e63}html [data-md-color-primary=purple] .md-nav--primary .md-nav__title--site{background-color:#ab47bc}html [data-md-color-primary=deep-purple] .md-nav--primary .md-nav__title--site{background-color:#7e57c2}html [data-md-color-primary=indigo] .md-nav--primary .md-nav__title--site{background-color:#3f51b5}html [data-md-color-primary=blue] .md-nav--primary .md-nav__title--site{background-color:#2196f3}html [data-md-color-primary=light-blue] .md-nav--primary .md-nav__title--site{background-color:#03a9f4}html [data-md-color-primary=cyan] .md-nav--primary .md-nav__title--site{background-color:#00bcd4}html [data-md-color-primary=teal] .md-nav--primary .md-nav__title--site{background-color:#009688}html [data-md-color-primary=green] .md-nav--primary .md-nav__title--site{background-color:#4caf50}html [data-md-color-primary=light-green] .md-nav--primary .md-nav__title--site{background-color:#7cb342}html [data-md-color-primary=lime] .md-nav--primary .md-nav__title--site{background-color:#c0ca33}html [data-md-color-primary=yellow] .md-nav--primary .md-nav__title--site{background-color:#f9a825}html [data-md-color-primary=amber] .md-nav--primary .md-nav__title--site{background-color:#ffb300}html [data-md-color-primary=orange] .md-nav--primary .md-nav__title--site{background-color:#fb8c00}html [data-md-color-primary=deep-orange] .md-nav--primary .md-nav__title--site{background-color:#ff7043}html [data-md-color-primary=brown] .md-nav--primary .md-nav__title--site{background-color:#795548}html [data-md-color-primary=grey] .md-nav--primary .md-nav__title--site{background-color:#757575}html [data-md-color-primary=blue-grey] .md-nav--primary .md-nav__title--site{background-color:#546e7a}}@media only screen and (min-width:60em){[data-md-color-primary=red] .md-nav--secondary{border-left:.4rem solid #ef5350}[data-md-color-primary=pink] .md-nav--secondary{border-left:.4rem solid #e91e63}[data-md-color-primary=purple] .md-nav--secondary{border-left:.4rem solid #ab47bc}[data-md-color-primary=deep-purple] .md-nav--secondary{border-left:.4rem solid #7e57c2}[data-md-color-primary=indigo] .md-nav--secondary{border-left:.4rem solid #3f51b5}[data-md-color-primary=blue] .md-nav--secondary{border-left:.4rem solid #2196f3}[data-md-color-primary=light-blue] .md-nav--secondary{border-left:.4rem solid #03a9f4}[data-md-color-primary=cyan] .md-nav--secondary{border-left:.4rem solid #00bcd4}[data-md-color-primary=teal] .md-nav--secondary{border-left:.4rem solid #009688}[data-md-color-primary=green] .md-nav--secondary{border-left:.4rem solid #4caf50}[data-md-color-primary=light-green] .md-nav--secondary{border-left:.4rem solid #7cb342}[data-md-color-primary=lime] .md-nav--secondary{border-left:.4rem solid #c0ca33}[data-md-color-primary=yellow] .md-nav--secondary{border-left:.4rem solid #f9a825}[data-md-color-primary=amber] .md-nav--secondary{border-left:.4rem solid #ffb300}[data-md-color-primary=orange] .md-nav--secondary{border-left:.4rem solid #fb8c00}[data-md-color-primary=deep-orange] .md-nav--secondary{border-left:.4rem solid #ff7043}[data-md-color-primary=brown] .md-nav--secondary{border-left:.4rem solid #795548}[data-md-color-primary=grey] .md-nav--secondary{border-left:.4rem solid #757575}[data-md-color-primary=blue-grey] .md-nav--secondary{border-left:.4rem solid #546e7a}}@media only screen and (min-width:76.25em){[data-md-color-primary=red] .md-tabs{background:rgba(190,66,64,.9675)}[data-md-color-primary=red] .md-tabs[data-md-state=hidden]{background:#ef5350}[data-md-color-primary=pink] .md-tabs{background:rgba(185,24,79,.9675)}[data-md-color-primary=pink] .md-tabs[data-md-state=hidden]{background:#e91e63}[data-md-color-primary=purple] .md-tabs{background:rgba(136,57,150,.9675)}[data-md-color-primary=purple] .md-tabs[data-md-state=hidden]{background:#ab47bc}[data-md-color-primary=deep-purple] .md-tabs{background:rgba(100,69,154,.9675)}[data-md-color-primary=deep-purple] .md-tabs[data-md-state=hidden]{background:#7e57c2}[data-md-color-primary=indigo] .md-tabs{background:rgba(50,64,144,.9675)}[data-md-color-primary=indigo] .md-tabs[data-md-state=hidden]{background:#3f51b5}[data-md-color-primary=blue] .md-tabs{background:rgba(26,119,193,.9675)}[data-md-color-primary=blue] .md-tabs[data-md-state=hidden]{background:#2196f3}[data-md-color-primary=light-blue] .md-tabs{background:rgba(2,134,194,.9675)}[data-md-color-primary=light-blue] .md-tabs[data-md-state=hidden]{background:#03a9f4}[data-md-color-primary=cyan] .md-tabs{background:rgba(0,150,169,.9675)}[data-md-color-primary=cyan] .md-tabs[data-md-state=hidden]{background:#00bcd4}[data-md-color-primary=teal] .md-tabs{background:rgba(0,119,108,.9675)}[data-md-color-primary=teal] .md-tabs[data-md-state=hidden]{background:#009688}[data-md-color-primary=green] .md-tabs{background:rgba(60,139,64,.9675)}[data-md-color-primary=green] .md-tabs[data-md-state=hidden]{background:#4caf50}[data-md-color-primary=light-green] .md-tabs{background:rgba(99,142,53,.9675)}[data-md-color-primary=light-green] .md-tabs[data-md-state=hidden]{background:#7cb342}[data-md-color-primary=lime] .md-tabs{background:rgba(153,161,41,.9675)}[data-md-color-primary=lime] .md-tabs[data-md-state=hidden]{background:#c0ca33}[data-md-color-primary=yellow] .md-tabs{background:rgba(198,134,29,.9675)}[data-md-color-primary=yellow] .md-tabs[data-md-state=hidden]{background:#f9a825}[data-md-color-primary=amber] .md-tabs{background:rgba(203,142,0,.9675)}[data-md-color-primary=amber] .md-tabs[data-md-state=hidden]{background:#ffb300}[data-md-color-primary=orange] .md-tabs{background:rgba(200,111,0,.9675)}[data-md-color-primary=orange] .md-tabs[data-md-state=hidden]{background:#fb8c00}[data-md-color-primary=deep-orange] .md-tabs{background:rgba(203,89,53,.9675)}[data-md-color-primary=deep-orange] .md-tabs[data-md-state=hidden]{background:#ff7043}[data-md-color-primary=brown] .md-tabs{background:rgba(96,68,57,.9675)}[data-md-color-primary=brown] .md-tabs[data-md-state=hidden]{background:#795548}[data-md-color-primary=grey] .md-tabs{background:rgba(93,93,93,.9675)}[data-md-color-primary=grey] .md-tabs[data-md-state=hidden]{background:#757575}[data-md-color-primary=blue-grey] .md-tabs{background:rgba(67,88,97,.9675)}[data-md-color-primary=blue-grey] .md-tabs[data-md-state=hidden]{background:#546e7a}} \ No newline at end of file
diff --git a/docs/build/images/editor-checkbox.png b/docs/build/images/editor-checkbox.png
new file mode 100644
index 0000000..dcea71c
--- /dev/null
+++ b/docs/build/images/editor-checkbox.png
Binary files differ
diff --git a/docs/build/images/editor-file-repeater.png b/docs/build/images/editor-file-repeater.png
new file mode 100644
index 0000000..ec4d372
--- /dev/null
+++ b/docs/build/images/editor-file-repeater.png
Binary files differ
diff --git a/docs/build/images/editor-file.png b/docs/build/images/editor-file.png
new file mode 100644
index 0000000..93ab56f
--- /dev/null
+++ b/docs/build/images/editor-file.png
Binary files differ
diff --git a/docs/build/images/editor-input-repeater.png b/docs/build/images/editor-input-repeater.png
new file mode 100644
index 0000000..5ab4256
--- /dev/null
+++ b/docs/build/images/editor-input-repeater.png
Binary files differ
diff --git a/docs/build/images/editor-input.png b/docs/build/images/editor-input.png
new file mode 100644
index 0000000..eea009a
--- /dev/null
+++ b/docs/build/images/editor-input.png
Binary files differ
diff --git a/docs/build/images/editor-richtext.png b/docs/build/images/editor-richtext.png
new file mode 100644
index 0000000..a953eda
--- /dev/null
+++ b/docs/build/images/editor-richtext.png
Binary files differ
diff --git a/docs/build/images/editor-select-repeater.png b/docs/build/images/editor-select-repeater.png
new file mode 100644
index 0000000..a175e5c
--- /dev/null
+++ b/docs/build/images/editor-select-repeater.png
Binary files differ
diff --git a/docs/build/images/editor-select.png b/docs/build/images/editor-select.png
new file mode 100644
index 0000000..ffd0ca6
--- /dev/null
+++ b/docs/build/images/editor-select.png
Binary files differ
diff --git a/docs/build/images/editor-tags.png b/docs/build/images/editor-tags.png
new file mode 100644
index 0000000..ea7c994
--- /dev/null
+++ b/docs/build/images/editor-tags.png
Binary files differ
diff --git a/docs/build/images/editor-textarea.png b/docs/build/images/editor-textarea.png
new file mode 100644
index 0000000..f714b48
--- /dev/null
+++ b/docs/build/images/editor-textarea.png
Binary files differ
diff --git a/docs/build/images/logo.png b/docs/build/images/logo.png
new file mode 100644
index 0000000..40b7b21
--- /dev/null
+++ b/docs/build/images/logo.png
Binary files differ
diff --git a/docs/build/images/ponzu-banner.png b/docs/build/images/ponzu-banner.png
new file mode 100644
index 0000000..855f97e
--- /dev/null
+++ b/docs/build/images/ponzu-banner.png
Binary files differ
diff --git a/docs/build/index.html b/docs/build/index.html
new file mode 100644
index 0000000..8ba871c
--- /dev/null
+++ b/docs/build/index.html
@@ -0,0 +1,941 @@
+
+<!DOCTYPE html>
+<html lang="en" class="no-js">
+ <head>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+
+
+
+
+ <link rel="shortcut icon" href="./assets/images/favicon.png">
+
+ <meta name="generator" content="mkdocs-0.16.3, mkdocs-material-1.6.1">
+
+
+
+ <title>Ponzu</title>
+
+
+
+ <script src="./assets/javascripts/modernizr-56ade86843.js"></script>
+
+
+ <link rel="stylesheet" href="./assets/stylesheets/application-4d0d3f2fbf.css">
+
+ <link rel="stylesheet" href="./assets/stylesheets/application-f78e5cb881.palette.css">
+
+
+
+
+
+
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
+ <style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
+
+ <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+
+
+
+ </head>
+
+
+
+
+ <body data-md-color-primary="grey" data-md-color-accent="light-blue">
+
+ <svg class="md-svg">
+ <defs>
+
+
+ <svg xmlns="http://www.w3.org/2000/svg" width="416" height="448" viewBox="0 0 416 448" id="github"><path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19T128 352t-18.125-8.5-10.75-19T96 304t3.125-20.5 10.75-19T128 256t18.125 8.5 10.75 19T160 304zm160 0q0 10-3.125 20.5t-10.75 19T288 352t-18.125-8.5-10.75-19T256 304t3.125-20.5 10.75-19T288 256t18.125 8.5 10.75 19T320 304zm40 0q0-30-17.25-51T296 232q-10.25 0-48.75 5.25Q229.5 240 208 240t-39.25-2.75Q130.75 232 120 232q-29.5 0-46.75 21T56 304q0 22 8 38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0 37.25-1.75t35-7.375 30.5-15 20.25-25.75T360 304zm56-44q0 51.75-15.25 82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5T212 416q-19.5 0-35.5-.75t-36.875-3.125-38.125-7.5-34.25-12.875T37 371.5t-21.5-28.75Q0 312 0 260q0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25 30.875Q171.5 96 212 96q37 0 70 8 26.25-20.5 46.75-30.25T376 64q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34 99.5z"/></svg>
+
+ </defs>
+ </svg>
+ <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
+ <input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
+ <label class="md-overlay" data-md-component="overlay" for="drawer"></label>
+
+ <header class="md-header" data-md-component="header">
+ <nav class="md-header-nav md-grid">
+ <div class="md-flex">
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <a href="." title="Ponzu" class="md-logo md-header-nav__button">
+ <img src="./images/logo.png" width="24" height="24">
+ </a>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
+ </div>
+ <div class="md-flex__cell md-flex__cell--stretch">
+ <span class="md-flex__ellipsis md-header-nav__title">
+
+
+
+
+ Home
+
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+
+ <label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
+
+<div class="md-search" data-md-component="search">
+ <label class="md-search__overlay" for="search"></label>
+ <div class="md-search__inner">
+ <form class="md-search__form" name="search">
+ <input type="text" class="md-search__input" name="query" required placeholder="Search" accesskey="s" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query">
+ <label class="md-icon md-search__icon" for="search"></label>
+ <button type="reset" class="md-icon md-search__icon" data-md-component="reset">close</button>
+ </form>
+ <div class="md-search__output">
+ <div class="md-search__scrollwrap" data-md-scrollfix>
+ <div class="md-search-result" data-md-component="result">
+ <div class="md-search-result__meta" data-md-lang-result-none="No matching documents" data-md-lang-result-one="1 matching document" data-md-lang-result-other="# matching documents">
+ Type to start searching
+ </div>
+ <ol class="md-search-result__list"></ol>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <div class="md-header-nav__source">
+
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+
+ </div>
+ </div>
+ </div>
+ </nav>
+</header>
+
+ <div class="md-container">
+
+
+ <main class="md-main">
+ <div class="md-main__inner md-grid" data-md-component="container">
+
+
+ <div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+ <nav class="md-nav md-nav--primary" data-md-level="0">
+ <label class="md-nav__title md-nav__title--site" for="drawer">
+
+ <i class="md-logo md-nav__button">
+ <img src="./images/logo.png">
+ </i>
+
+ Ponzu
+ </label>
+
+ <div class="md-nav__source">
+
+
+
+
+
+
+ <a href="https://github.com/ponzu-cms/ponzu" title="Go to repository" class="md-source" data-md-source="github">
+
+ <div class="md-source__icon">
+ <svg viewBox="0 0 24 24" width="24" height="24">
+ <use xlink:href="#github" width="24" height="24"></use>
+ </svg>
+ </div>
+
+ <div class="md-source__repository">
+ ponzu-cms/ponzu
+ </div>
+ </a>
+
+ </div>
+
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--active">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
+
+
+
+
+ <label class="md-nav__link md-nav__link--active" for="toc">
+ Home
+ </label>
+
+ <a href="." title="Home" class="md-nav__link md-nav__link--active">
+ Home
+ </a>
+
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#what-is-ponzu" title="What is Ponzu?" class="md-nav__link">
+ What is Ponzu?
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#table-of-contents" title="Table of Contents" class="md-nav__link">
+ Table of Contents
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#need-help-get-in-touch" title="Need help? Get in touch" class="md-nav__link">
+ Need help? Get in touch
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
+
+ <label class="md-nav__link" for="nav-2">
+ CLI
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-2">
+ CLI
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="CLI/General-Usage/" title="General Usage" class="md-nav__link">
+ General Usage
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="CLI/Generating-References/" title="Generating References" class="md-nav__link">
+ Generating References
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3">
+
+ <label class="md-nav__link" for="nav-3">
+ Content
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-3">
+ Content
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="Content/An-Overview/" title="An Overview" class="md-nav__link">
+ An Overview
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="Content/Extending-Content/" title="Extending Content" class="md-nav__link">
+ Extending Content
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
+
+ <label class="md-nav__link" for="nav-4">
+ Form Fields
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-4">
+ Form Fields
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="Form-Fields/HTML-Inputs/" title="HTML Inputs" class="md-nav__link">
+ HTML Inputs
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
+
+ <label class="md-nav__link" for="nav-5">
+ HTTP APIs
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-5">
+ HTTP APIs
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="HTTP-APIs/Content/" title="Content" class="md-nav__link">
+ Content
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="HTTP-APIs/File-Metadata/" title="File Metadata" class="md-nav__link">
+ File Metadata
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="HTTP-APIs/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
+
+ <label class="md-nav__link" for="nav-6">
+ Interfaces
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-6">
+ Interfaces
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="Interfaces/API/" title="API" class="md-nav__link">
+ API
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="Interfaces/Editor/" title="Editor" class="md-nav__link">
+ Editor
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="Interfaces/Format/" title="Format" class="md-nav__link">
+ Format
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="Interfaces/Item/" title="Item" class="md-nav__link">
+ Item
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="Interfaces/Search/" title="Search" class="md-nav__link">
+ Search
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
+
+ <label class="md-nav__link" for="nav-7">
+ Ponzu Addons
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-7">
+ Ponzu Addons
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="Ponzu-Addons/Creating-Addons/" title="Creating Addons" class="md-nav__link">
+ Creating Addons
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="Ponzu-Addons/Using-Addons/" title="Using Addons" class="md-nav__link">
+ Using Addons
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
+
+ <label class="md-nav__link" for="nav-8">
+ Quickstart
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-8">
+ Quickstart
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="Quickstart/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
+
+ <label class="md-nav__link" for="nav-9">
+ References
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-9">
+ References
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="References/Overview/" title="Overview" class="md-nav__link">
+ Overview
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
+
+ <label class="md-nav__link" for="nav-10">
+ Running Backups
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-10">
+ Running Backups
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="Running-Backups/Backups/" title="Backups" class="md-nav__link">
+ Backups
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
+
+ <label class="md-nav__link" for="nav-11">
+ System Configuration
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-11">
+ System Configuration
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="System-Configuration/Settings/" title="Settings" class="md-nav__link">
+ Settings
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item md-nav__item--nested">
+
+ <input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
+
+ <label class="md-nav__link" for="nav-12">
+ System Deployment
+ </label>
+ <nav class="md-nav" data-md-component="collapsible" data-md-level="1">
+ <label class="md-nav__title" for="nav-12">
+ System Deployment
+ </label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="System-Deployment/Docker/" title="Docker" class="md-nav__link">
+ Docker
+ </a>
+ </li>
+
+
+
+
+
+
+
+ <li class="md-nav__item">
+ <a href="System-Deployment/SysV-Style/" title="SysV Style" class="md-nav__link">
+ SysV Style
+ </a>
+ </li>
+
+
+ </ul>
+ </nav>
+ </li>
+
+
+ </ul>
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
+ <div class="md-sidebar__scrollwrap">
+ <div class="md-sidebar__inner">
+
+<nav class="md-nav md-nav--secondary">
+
+
+
+
+
+ <label class="md-nav__title" for="toc">Table of contents</label>
+ <ul class="md-nav__list" data-md-scrollfix>
+
+ <li class="md-nav__item">
+ <a href="#what-is-ponzu" title="What is Ponzu?" class="md-nav__link">
+ What is Ponzu?
+ </a>
+
+ <nav class="md-nav">
+ <ul class="md-nav__list">
+
+ <li class="md-nav__item">
+ <a href="#table-of-contents" title="Table of Contents" class="md-nav__link">
+ Table of Contents
+ </a>
+
+</li>
+
+ <li class="md-nav__item">
+ <a href="#need-help-get-in-touch" title="Need help? Get in touch" class="md-nav__link">
+ Need help? Get in touch
+ </a>
+
+</li>
+
+ </ul>
+ </nav>
+
+</li>
+
+
+
+ </ul>
+
+</nav>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="md-content">
+ <article class="md-content__inner md-typeset">
+
+
+
+ <h1 id="ponzu-cms-server-framework-docs">Ponzu CMS + Server Framework Docs<a class="headerlink" href="#ponzu-cms-server-framework-docs" title="Permanent link">&para;</a></h1>
+<p><img alt="Ponzu" src="./images/ponzu-banner.png" /></p>
+<h2 id="what-is-ponzu">What is Ponzu?<a class="headerlink" href="#what-is-ponzu" title="Permanent link">&para;</a></h2>
+<blockquote>
+<p>Watch the <a href="https://www.youtube.com/watch?v=T_1ncPoLgrg"><strong>video introduction</strong></a></p>
+</blockquote>
+<p>Ponzu is a powerful and efficient open-source HTTP server framework and CMS. It
+provides automatic, free, and secure HTTP/2 over TLS (certificates obtained via
+<a href="https://letsencrypt.org">Let's Encrypt</a>), a useful CMS and scaffolding to generate
+content editors, and a fast HTTP API on which to build modern applications.</p>
+<p>Want to jump in right away? Try the <a href="./Quickstart/Overview">Quickstart</a></p>
+<h3 id="table-of-contents">Table of Contents<a class="headerlink" href="#table-of-contents" title="Permanent link">&para;</a></h3>
+<ol>
+<li><a href="./CLI/General-Usage/">CLI</a></li>
+<li><a href="./Content/An-Overview">Content</a></li>
+<li><a href="./Form-Fields/HTML-Inputs">Form Fields</a></li>
+<li><a href="./HTTP-APIs/Content">HTTP API - Content</a></li>
+<li><a href="./HTTP-APIs/File-Metadata">HTTP API - File Metadata</a></li>
+<li><a href="./HTTP-APIs/Search">HTTP API - Search</a></li>
+<li><a href="./Interfaces/API">Interfaces - API</a></li>
+<li><a href="./Interfaces/Editor">Interfaces - Editor</a></li>
+<li><a href="./Interfaces/Item">Interfaces - Item</a></li>
+<li><a href="./Interfaces/Search">Interfaces - Search</a></li>
+<li><a href="./Ponzu-Addons/Creating-Addons">Creating Ponzu Addons</a></li>
+<li><a href="./Ponzu-Addons/Using-Addons">Using Ponzu Addons</a></li>
+<li><a href="./Quickstart/Overview">Quickstart</a></li>
+<li><a href="./Running-Backups/Backups">Backups</a></li>
+<li><a href="./System-Configuration/Settings">System Configuration</a></li>
+</ol>
+<h3 id="need-help-get-in-touch">Need help? Get in touch<a class="headerlink" href="#need-help-get-in-touch" title="Permanent link">&para;</a></h3>
+<ul>
+<li>Chat: <a href="https://gophers.slack.com/messages/C3TBV356D">#ponzu on Slack</a></li>
+<li>Reach out on Twitter: <a href="https://twitter.com/ponzu_cms">@ponzu_cms</a></li>
+<li>File an <a href="https://github.com/ponzu-cms/ponzu/issues">issue</a></li>
+</ul>
+<hr />
+<p>current version: <code>v0.9.2</code> @ ponzu:master</p>
+
+
+
+
+
+
+
+ </article>
+ </div>
+ </div>
+ </main>
+
+
+<footer class="md-footer">
+
+ <div class="md-footer-nav">
+ <nav class="md-footer-nav__inner md-grid">
+
+
+ <a href="CLI/General-Usage/" title="General Usage" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
+ <div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
+ <span class="md-flex__ellipsis">
+ <span class="md-footer-nav__direction">
+ Next
+ </span>
+ General Usage
+ </span>
+ </div>
+ <div class="md-flex__cell md-flex__cell--shrink">
+ <i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
+ </div>
+ </a>
+
+ </nav>
+ </div>
+
+ <div class="md-footer-meta md-typeset">
+ <div class="md-footer-meta__inner md-grid">
+ <div class="md-footer-copyright">
+
+ powered by
+ <a href="http://www.mkdocs.org" title="MkDocs">MkDocs</a>
+ and
+ <a href="http://squidfunk.github.io/mkdocs-material/" title="Material for MkDocs">
+ Material for MkDocs</a>
+ </div>
+
+
+ <div class="md-footer-social">
+
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
+
+ <a href="https://github.com/ponzu-cms" class="md-footer-social__link fa fa-github"></a>
+
+ <a href="https://twitter.com/ponzu_cms" class="md-footer-social__link fa fa-twitter"></a>
+
+ </div>
+
+
+ </div>
+ </div>
+</footer>
+
+ </div>
+
+ <script src="./assets/javascripts/application-6b599127bc.js"></script>
+ <script>app.initialize({url:{base:"."}})</script>
+
+
+
+
+ <script>!function(e,t,a,n,o,c,i){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,c=t.createElement(a),i=t.getElementsByTagName(a)[0],c.async=1,c.src=n,i.parentNode.insertBefore(c,i)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-98609560-1","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var t=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",t,e.href)})});var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})</script>
+
+
+ </body>
+</html> \ No newline at end of file
diff --git a/docs/build/mkdocs/js/lunr.min.js b/docs/build/mkdocs/js/lunr.min.js
new file mode 100644
index 0000000..b0198df
--- /dev/null
+++ b/docs/build/mkdocs/js/lunr.min.js
@@ -0,0 +1,7 @@
+/**
+ * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.7.0
+ * Copyright (C) 2016 Oliver Nightingale
+ * MIT Licensed
+ * @license
+ */
+!function(){var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.7.0",t.utils={},t.utils.warn=function(t){return function(e){t.console&&console.warn&&console.warn(e)}}(this),t.utils.asString=function(t){return void 0===t||null===t?"":t.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=t;if("function"!=typeof e)throw new TypeError("last argument must be a function");n.forEach(function(t){this.hasHandler(t)||(this.events[t]=[]),this.events[t].push(e)},this)},t.EventEmitter.prototype.removeListener=function(t,e){if(this.hasHandler(t)){var n=this.events[t].indexOf(e);this.events[t].splice(n,1),this.events[t].length||delete this.events[t]}},t.EventEmitter.prototype.emit=function(t){if(this.hasHandler(t)){var e=Array.prototype.slice.call(arguments,1);this.events[t].forEach(function(t){t.apply(void 0,e)})}},t.EventEmitter.prototype.hasHandler=function(t){return t in this.events},t.tokenizer=function(e){return arguments.length&&null!=e&&void 0!=e?Array.isArray(e)?e.map(function(e){return t.utils.asString(e).toLowerCase()}):e.toString().trim().toLowerCase().split(t.tokenizer.seperator):[]},t.tokenizer.seperator=/[\s\-]+/,t.tokenizer.load=function(t){var e=this.registeredFunctions[t];if(!e)throw new Error("Cannot load un-registered function: "+t);return e},t.tokenizer.label="default",t.tokenizer.registeredFunctions={"default":t.tokenizer},t.tokenizer.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing tokenizer: "+n),e.label=n,this.registeredFunctions[n]=e},t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.registeredFunctions[e];if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},t.Pipeline.prototype.remove=function(t){var e=this._stack.indexOf(t);-1!=e&&this._stack.splice(e,1)},t.Pipeline.prototype.run=function(t){for(var e=[],n=t.length,i=this._stack.length,r=0;n>r;r++){for(var o=t[r],s=0;i>s&&(o=this._stack[s](o,r,t),void 0!==o&&""!==o);s++);void 0!==o&&""!==o&&e.push(o)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(e<i.idx)return this.list=new t.Vector.Node(e,n,i),this.length++;for(var r=i,o=i.next;void 0!=o;){if(e<o.idx)return r.next=new t.Vector.Node(e,n,o),this.length++;r=o,o=o.next}return r.next=new t.Vector.Node(e,n,o),this.length++},t.Vector.prototype.magnitude=function(){if(this._magnitude)return this._magnitude;for(var t,e=this.list,n=0;e;)t=e.val,n+=t*t,e=e.next;return this._magnitude=Math.sqrt(n)},t.Vector.prototype.dot=function(t){for(var e=this.list,n=t.list,i=0;e&&n;)e.idx<n.idx?e=e.next:e.idx>n.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t<arguments.length;t++)e=arguments[t],~this.indexOf(e)||this.elements.splice(this.locationFor(e),0,e);this.length=this.elements.length},t.SortedSet.prototype.toArray=function(){return this.elements.slice()},t.SortedSet.prototype.map=function(t,e){return this.elements.map(t,e)},t.SortedSet.prototype.forEach=function(t,e){return this.elements.forEach(t,e)},t.SortedSet.prototype.indexOf=function(t){for(var e=0,n=this.elements.length,i=n-e,r=e+Math.floor(i/2),o=this.elements[r];i>1;){if(o===t)return r;t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r]}return o===t?r:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,r=e+Math.floor(i/2),o=this.elements[r];i>1;)t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r];return o>t?r:t>o?r+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,r=0,o=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>o-1||r>s-1)break;a[i]!==h[r]?a[i]<h[r]?i++:a[i]>h[r]&&r++:(n.add(a[i]),i++,r++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone();for(var r=0,o=n.toArray();r<o.length;r++)i.add(o[r]);return i},t.SortedSet.prototype.toJSON=function(){return this.toArray()},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.Store,this.tokenStore=new t.TokenStore,this.corpusTokens=new t.SortedSet,this.eventEmitter=new t.EventEmitter,this.tokenizerFn=t.tokenizer,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var t=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,t)},t.Index.prototype.off=function(t,e){return this.eventEmitter.removeListener(t,e)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;return n._fields=e.fields,n._ref=e.ref,n.tokenizer=t.tokenizer.load(e.tokenizer),n.documentStore=t.Store.load(e.documentStore),n.tokenStore=t.TokenStore.load(e.tokenStore),n.corpusTokens=t.SortedSet.load(e.corpusTokens),n.pipeline=t.Pipeline.load(e.pipeline),n},t.Index.prototype.field=function(t,e){var e=e||{},n={name:t,boost:e.boost||1};return this._fields.push(n),this},t.Index.prototype.ref=function(t){return this._ref=t,this},t.Index.prototype.tokenizer=function(e){var n=e.label&&e.label in t.tokenizer.registeredFunctions;return n||t.utils.warn("Function is not a registered tokenizer. This may cause problems when serialising the index"),this.tokenizerFn=e,this},t.Index.prototype.add=function(e,n){var i={},r=new t.SortedSet,o=e[this._ref],n=void 0===n?!0:n;this._fields.forEach(function(t){var n=this.pipeline.run(this.tokenizerFn(e[t.name]));i[t.name]=n;for(var o=0;o<n.length;o++){var s=n[o];r.add(s),this.corpusTokens.add(s)}},this),this.documentStore.set(o,r);for(var s=0;s<r.length;s++){for(var a=r.elements[s],h=0,u=0;u<this._fields.length;u++){var l=this._fields[u],c=i[l.name],f=c.length;if(f){for(var d=0,p=0;f>p;p++)c[p]===a&&d++;h+=d/f*l.boost}}this.tokenStore.add(a,{ref:o,tf:h})}n&&this.eventEmitter.emit("add",e,this)},t.Index.prototype.remove=function(t,e){var n=t[this._ref],e=void 0===e?!0:e;if(this.documentStore.has(n)){var i=this.documentStore.get(n);this.documentStore.remove(n),i.forEach(function(t){this.tokenStore.remove(t,n)},this),e&&this.eventEmitter.emit("remove",t,this)}},t.Index.prototype.update=function(t,e){var e=void 0===e?!0:e;this.remove(t,!1),this.add(t,!1),e&&this.eventEmitter.emit("update",t,this)},t.Index.prototype.idf=function(t){var e="@"+t;if(Object.prototype.hasOwnProperty.call(this._idfCache,e))return this._idfCache[e];var n=this.tokenStore.count(t),i=1;return n>0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(this.tokenizerFn(e)),i=new t.Vector,r=[],o=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*o,h=this,u=this.tokenStore.expand(e).reduce(function(n,r){var o=h.corpusTokens.indexOf(r),s=h.idf(r),u=1,l=new t.SortedSet;if(r!==e){var c=Math.max(3,r.length-e.length);u=1/Math.log(c)}o>-1&&i.insert(o,a*s*u);for(var f=h.tokenStore.get(r),d=Object.keys(f),p=d.length,v=0;p>v;v++)l.add(f[d[v]].ref);return n.union(l)},new t.SortedSet);r.push(u)},this);var a=r.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,r=new t.Vector,o=0;i>o;o++){var s=n.elements[o],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);r.insert(this.corpusTokens.indexOf(s),a*h)}return r},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,tokenizer:this.tokenizerFn.label,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",r=n+"[^aeiouy]*",o=i+"[aeiou]*",s="^("+r+")?"+o+r,a="^("+r+")?"+o+r+"("+o+")?$",h="^("+r+")?"+o+r+o+r,u="^("+r+")?"+i,l=new RegExp(s),c=new RegExp(h),f=new RegExp(a),d=new RegExp(u),p=/^(.+?)(ss|i)es$/,v=/^(.+?)([^s])s$/,g=/^(.+?)eed$/,m=/^(.+?)(ed|ing)$/,y=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),k=new RegExp("^"+r+i+"[^aeiouwxy]$"),x=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,F=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,_=/^(.+?)(s|t)(ion)$/,z=/^(.+?)e$/,O=/ll$/,P=new RegExp("^"+r+i+"[^aeiouwxy]$"),T=function(n){var i,r,o,s,a,h,u;if(n.length<3)return n;if(o=n.substr(0,1),"y"==o&&(n=o.toUpperCase()+n.substr(1)),s=p,a=v,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=g,a=m,s.test(n)){var T=s.exec(n);s=l,s.test(T[1])&&(s=y,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=d,a.test(i)&&(n=i,a=S,h=w,u=k,a.test(n)?n+="e":h.test(n)?(s=y,n=n.replace(s,"")):u.test(n)&&(n+="e"))}if(s=x,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+t[r])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+e[r])}if(s=F,a=_,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=z,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=P,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=O,a=c,s.test(n)&&a.test(n)&&(s=y,n=n.replace(s,"")),"y"==o&&(n=o.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.generateStopWordFilter=function(t){var e=t.reduce(function(t,e){return t[e]=e,t},{});return function(t){return t&&e[t]!==t?t:void 0}},t.stopWordFilter=t.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){return t.replace(/^\W+/,"").replace(/\W+$/,"")},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t.charAt(0),r=t.slice(1);return i in n||(n[i]={docs:{}}),0===r.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(r,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;n<t.length;n++){if(!e[t.charAt(n)])return!1;e=e[t.charAt(n)]}return!0},t.TokenStore.prototype.getNode=function(t){if(!t)return{};for(var e=this.root,n=0;n<t.length;n++){if(!e[t.charAt(n)])return{};e=e[t.charAt(n)]}return e},t.TokenStore.prototype.get=function(t,e){return this.getNode(t,e).docs||{}},t.TokenStore.prototype.count=function(t,e){return Object.keys(this.get(t,e)).length},t.TokenStore.prototype.remove=function(t,e){if(t){for(var n=this.root,i=0;i<t.length;i++){if(!(t.charAt(i)in n))return;n=n[t.charAt(i)]}delete n.docs[e]}},t.TokenStore.prototype.expand=function(t,e){var n=this.getNode(t),i=n.docs||{},e=e||[];return Object.keys(i).length&&e.push(t),Object.keys(n).forEach(function(n){"docs"!==n&&e.concat(this.expand(t+n,e))},this),e},t.TokenStore.prototype.toJSON=function(){return{root:this.root,length:this.length}},function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():t.lunr=e()}(this,function(){return t})}();
diff --git a/docs/build/mkdocs/js/mustache.min.js b/docs/build/mkdocs/js/mustache.min.js
new file mode 100644
index 0000000..7fc6da8
--- /dev/null
+++ b/docs/build/mkdocs/js/mustache.min.js
@@ -0,0 +1 @@
+(function(global,factory){if(typeof exports==="object"&&exports){factory(exports)}else if(typeof define==="function"&&define.amd){define(["exports"],factory)}else{factory(global.Mustache={})}})(this,function(mustache){var Object_toString=Object.prototype.toString;var isArray=Array.isArray||function(object){return Object_toString.call(object)==="[object Array]"};function isFunction(object){return typeof object==="function"}function escapeRegExp(string){return string.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}var RegExp_test=RegExp.prototype.test;function testRegExp(re,string){return RegExp_test.call(re,string)}var nonSpaceRe=/\S/;function isWhitespace(string){return!testRegExp(nonSpaceRe,string)}var entityMap={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#x2F;"};function escapeHtml(string){return String(string).replace(/[&<>"'\/]/g,function(s){return entityMap[s]})}var whiteRe=/\s*/;var spaceRe=/\s+/;var equalsRe=/\s*=/;var curlyRe=/\s*\}/;var tagRe=/#|\^|\/|>|\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tags){if(typeof tags==="string")tags=tags.split(spaceRe,2);if(!isArray(tags)||tags.length!==2)throw new Error("Invalid tags: "+tags);openingTagRe=new RegExp(escapeRegExp(tags[0])+"\\s*");closingTagRe=new RegExp("\\s*"+escapeRegExp(tags[1]));closingCurlyRe=new RegExp("\\s*"+escapeRegExp("}"+tags[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i<valueLength;++i){chr=value.charAt(i);if(isWhitespace(chr)){spaces.push(tokens.length)}else{nonSpace=true}tokens.push(["text",chr,start,start+1]);start+=1;if(chr==="\n")stripSpace()}}if(!scanner.scan(openingTagRe))break;hasTag=true;type=scanner.scan(tagRe)||"name";scanner.scan(whiteRe);if(type==="="){value=scanner.scanUntil(equalsRe);scanner.scan(equalsRe);scanner.scanUntil(closingTagRe)}else if(type==="{"){value=scanner.scanUntil(closingCurlyRe);scanner.scan(curlyRe);scanner.scanUntil(closingTagRe);type="&"}else{value=scanner.scanUntil(closingTagRe)}if(!scanner.scan(closingTagRe))throw new Error("Unclosed tag at "+scanner.pos);token=[type,value,start,scanner.pos];tokens.push(token);if(type==="#"||type==="^"){sections.push(token)}else if(type==="/"){openSection=sections.pop();if(!openSection)throw new Error('Unopened section "'+value+'" at '+start);if(openSection[1]!==value)throw new Error('Unclosed section "'+openSection[1]+'" at '+start)}else if(type==="name"||type==="{"||type==="&"){nonSpace=true}else if(type==="="){compileTags(value)}}openSection=sections.pop();if(openSection)throw new Error('Unclosed section "'+openSection[1]+'" at '+scanner.pos);return nestTokens(squashTokens(tokens))}function squashTokens(tokens){var squashedTokens=[];var token,lastToken;for(var i=0,numTokens=tokens.length;i<numTokens;++i){token=tokens[i];if(token){if(token[0]==="text"&&lastToken&&lastToken[0]==="text"){lastToken[1]+=token[1];lastToken[3]=token[3]}else{squashedTokens.push(token);lastToken=token}}}return squashedTokens}function nestTokens(tokens){var nestedTokens=[];var collector=nestedTokens;var sections=[];var token,section;for(var i=0,numTokens=tokens.length;i<numTokens;++i){token=tokens[i];switch(token[0]){case"#":case"^":collector.push(token);sections.push(token);collector=token[4]=[];break;case"/":section=sections.pop();section[5]=token[2];collector=sections.length>0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function(){return this.tail===""};Scanner.prototype.scan=function(re){var match=this.tail.match(re);if(!match||match.index!==0)return"";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail="";break;case 0:match="";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={".":this.view};this.parent=parentContext}Context.prototype.push=function(view){return new Context(view,this)};Context.prototype.lookup=function(name){var cache=this.cache;var value;if(name in cache){value=cache[name]}else{var context=this,names,index,lookupHit=false;while(context){if(name.indexOf(".")>0){value=context.view;names=name.split(".");index=0;while(value!=null&&index<names.length){if(index===names.length-1&&value!=null)lookupHit=typeof value==="object"&&value.hasOwnProperty(names[index]);value=value[names[index++]]}}else if(context.view!=null&&typeof context.view==="object"){value=context.view[name];lookupHit=context.view.hasOwnProperty(name)}if(lookupHit)break;context=context.parent}cache[name]=value}if(isFunction(value))value=value.call(this.view);return value};function Writer(){this.cache={}}Writer.prototype.clearCache=function(){this.cache={}};Writer.prototype.parse=function(template,tags){var cache=this.cache;var tokens=cache[template];if(tokens==null)tokens=cache[template]=parseTemplate(template,tags);return tokens};Writer.prototype.render=function(template,view,partials){var tokens=this.parse(template);var context=view instanceof Context?view:new Context(view);return this.renderTokens(tokens,context,partials,template)};Writer.prototype.renderTokens=function(tokens,context,partials,originalTemplate){var buffer="";var token,symbol,value;for(var i=0,numTokens=tokens.length;i<numTokens;++i){value=undefined;token=tokens[i];symbol=token[0];if(symbol==="#")value=this._renderSection(token,context,partials,originalTemplate);else if(symbol==="^")value=this._renderInverted(token,context,partials,originalTemplate);else if(symbol===">")value=this._renderPartial(token,context,partials,originalTemplate);else if(symbol==="&")value=this._unescapedValue(token,context);else if(symbol==="name")value=this._escapedValue(token,context);else if(symbol==="text")value=this._rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype._renderSection=function(token,context,partials,originalTemplate){var self=this;var buffer="";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;j<valueLength;++j){buffer+=this.renderTokens(token[4],context.push(value[j]),partials,originalTemplate)}}else if(typeof value==="object"||typeof value==="string"||typeof value==="number"){buffer+=this.renderTokens(token[4],context.push(value),partials,originalTemplate)}else if(isFunction(value)){if(typeof originalTemplate!=="string")throw new Error("Cannot use higher-order sections without the original template");value=value.call(context.view,originalTemplate.slice(token[3],token[5]),subRender);if(value!=null)buffer+=value}else{buffer+=this.renderTokens(token[4],context,partials,originalTemplate)}return buffer};Writer.prototype._renderInverted=function(token,context,partials,originalTemplate){var value=context.lookup(token[1]);if(!value||isArray(value)&&value.length===0)return this.renderTokens(token[4],context,partials,originalTemplate)};Writer.prototype._renderPartial=function(token,context,partials){if(!partials)return;var value=isFunction(partials)?partials(token[1]):partials[token[1]];if(value!=null)return this.renderTokens(this.parse(value),context,partials,value)};Writer.prototype._unescapedValue=function(token,context){var value=context.lookup(token[1]);if(value!=null)return value};Writer.prototype._escapedValue=function(token,context){var value=context.lookup(token[1]);if(value!=null)return mustache.escape(value)};Writer.prototype._rawValue=function(token){return token[1]};mustache.name="mustache.js";mustache.version="2.0.0";mustache.tags=["{{","}}"];var defaultWriter=new Writer;mustache.clearCache=function(){return defaultWriter.clearCache()};mustache.parse=function(template,tags){return defaultWriter.parse(template,tags)};mustache.render=function(template,view,partials){return defaultWriter.render(template,view,partials)};mustache.to_html=function(template,view,partials,send){var result=mustache.render(template,view,partials);if(isFunction(send)){send(result)}else{return result}};mustache.escape=escapeHtml;mustache.Scanner=Scanner;mustache.Context=Context;mustache.Writer=Writer}); \ No newline at end of file
diff --git a/docs/build/mkdocs/js/require.js b/docs/build/mkdocs/js/require.js
new file mode 100644
index 0000000..8638a31
--- /dev/null
+++ b/docs/build/mkdocs/js/require.js
@@ -0,0 +1,36 @@
+/*
+ RequireJS 2.1.16 Copyright (c) 2010-2015, The Dojo Foundation All Rights Reserved.
+ Available via the MIT or new BSD license.
+ see: http://github.com/jrburke/requirejs for details
+*/
+var requirejs,require,define;
+(function(ba){function G(b){return"[object Function]"===K.call(b)}function H(b){return"[object Array]"===K.call(b)}function v(b,c){if(b){var d;for(d=0;d<b.length&&(!b[d]||!c(b[d],d,b));d+=1);}}function T(b,c){if(b){var d;for(d=b.length-1;-1<d&&(!b[d]||!c(b[d],d,b));d-=1);}}function t(b,c){return fa.call(b,c)}function m(b,c){return t(b,c)&&b[c]}function B(b,c){for(var d in b)if(t(b,d)&&c(b[d],d))break}function U(b,c,d,e){c&&B(c,function(c,g){if(d||!t(b,g))e&&"object"===typeof c&&c&&!H(c)&&!G(c)&&!(c instanceof
+RegExp)?(b[g]||(b[g]={}),U(b[g],c,d,e)):b[g]=c});return b}function u(b,c){return function(){return c.apply(b,arguments)}}function ca(b){throw b;}function da(b){if(!b)return b;var c=ba;v(b.split("."),function(b){c=c[b]});return c}function C(b,c,d,e){c=Error(c+"\nhttp://requirejs.org/docs/errors.html#"+b);c.requireType=b;c.requireModules=e;d&&(c.originalError=d);return c}function ga(b){function c(a,k,b){var f,l,c,d,e,g,i,p,k=k&&k.split("/"),h=j.map,n=h&&h["*"];if(a){a=a.split("/");l=a.length-1;j.nodeIdCompat&&
+Q.test(a[l])&&(a[l]=a[l].replace(Q,""));"."===a[0].charAt(0)&&k&&(l=k.slice(0,k.length-1),a=l.concat(a));l=a;for(c=0;c<l.length;c++)if(d=l[c],"."===d)l.splice(c,1),c-=1;else if(".."===d&&!(0===c||1==c&&".."===l[2]||".."===l[c-1])&&0<c)l.splice(c-1,2),c-=2;a=a.join("/")}if(b&&h&&(k||n)){l=a.split("/");c=l.length;a:for(;0<c;c-=1){e=l.slice(0,c).join("/");if(k)for(d=k.length;0<d;d-=1)if(b=m(h,k.slice(0,d).join("/")))if(b=m(b,e)){f=b;g=c;break a}!i&&(n&&m(n,e))&&(i=m(n,e),p=c)}!f&&i&&(f=i,g=p);f&&(l.splice(0,
+g,f),a=l.join("/"))}return(f=m(j.pkgs,a))?f:a}function d(a){z&&v(document.getElementsByTagName("script"),function(k){if(k.getAttribute("data-requiremodule")===a&&k.getAttribute("data-requirecontext")===i.contextName)return k.parentNode.removeChild(k),!0})}function e(a){var k=m(j.paths,a);if(k&&H(k)&&1<k.length)return k.shift(),i.require.undef(a),i.makeRequire(null,{skipMap:!0})([a]),!0}function n(a){var k,c=a?a.indexOf("!"):-1;-1<c&&(k=a.substring(0,c),a=a.substring(c+1,a.length));return[k,a]}function p(a,
+k,b,f){var l,d,e=null,g=k?k.name:null,j=a,p=!0,h="";a||(p=!1,a="_@r"+(K+=1));a=n(a);e=a[0];a=a[1];e&&(e=c(e,g,f),d=m(r,e));a&&(e?h=d&&d.normalize?d.normalize(a,function(a){return c(a,g,f)}):-1===a.indexOf("!")?c(a,g,f):a:(h=c(a,g,f),a=n(h),e=a[0],h=a[1],b=!0,l=i.nameToUrl(h)));b=e&&!d&&!b?"_unnormalized"+(O+=1):"";return{prefix:e,name:h,parentMap:k,unnormalized:!!b,url:l,originalName:j,isDefine:p,id:(e?e+"!"+h:h)+b}}function s(a){var k=a.id,b=m(h,k);b||(b=h[k]=new i.Module(a));return b}function q(a,
+k,b){var f=a.id,c=m(h,f);if(t(r,f)&&(!c||c.defineEmitComplete))"defined"===k&&b(r[f]);else if(c=s(a),c.error&&"error"===k)b(c.error);else c.on(k,b)}function w(a,b){var c=a.requireModules,f=!1;if(b)b(a);else if(v(c,function(b){if(b=m(h,b))b.error=a,b.events.error&&(f=!0,b.emit("error",a))}),!f)g.onError(a)}function x(){R.length&&(ha.apply(A,[A.length,0].concat(R)),R=[])}function y(a){delete h[a];delete V[a]}function F(a,b,c){var f=a.map.id;a.error?a.emit("error",a.error):(b[f]=!0,v(a.depMaps,function(f,
+d){var e=f.id,g=m(h,e);g&&(!a.depMatched[d]&&!c[e])&&(m(b,e)?(a.defineDep(d,r[e]),a.check()):F(g,b,c))}),c[f]=!0)}function D(){var a,b,c=(a=1E3*j.waitSeconds)&&i.startTime+a<(new Date).getTime(),f=[],l=[],g=!1,h=!0;if(!W){W=!0;B(V,function(a){var i=a.map,j=i.id;if(a.enabled&&(i.isDefine||l.push(a),!a.error))if(!a.inited&&c)e(j)?g=b=!0:(f.push(j),d(j));else if(!a.inited&&(a.fetched&&i.isDefine)&&(g=!0,!i.prefix))return h=!1});if(c&&f.length)return a=C("timeout","Load timeout for modules: "+f,null,
+f),a.contextName=i.contextName,w(a);h&&v(l,function(a){F(a,{},{})});if((!c||b)&&g)if((z||ea)&&!X)X=setTimeout(function(){X=0;D()},50);W=!1}}function E(a){t(r,a[0])||s(p(a[0],null,!0)).init(a[1],a[2])}function I(a){var a=a.currentTarget||a.srcElement,b=i.onScriptLoad;a.detachEvent&&!Y?a.detachEvent("onreadystatechange",b):a.removeEventListener("load",b,!1);b=i.onScriptError;(!a.detachEvent||Y)&&a.removeEventListener("error",b,!1);return{node:a,id:a&&a.getAttribute("data-requiremodule")}}function J(){var a;
+for(x();A.length;){a=A.shift();if(null===a[0])return w(C("mismatch","Mismatched anonymous define() module: "+a[a.length-1]));E(a)}}var W,Z,i,L,X,j={waitSeconds:7,baseUrl:"./",paths:{},bundles:{},pkgs:{},shim:{},config:{}},h={},V={},$={},A=[],r={},S={},aa={},K=1,O=1;L={require:function(a){return a.require?a.require:a.require=i.makeRequire(a.map)},exports:function(a){a.usingExports=!0;if(a.map.isDefine)return a.exports?r[a.map.id]=a.exports:a.exports=r[a.map.id]={}},module:function(a){return a.module?
+a.module:a.module={id:a.map.id,uri:a.map.url,config:function(){return m(j.config,a.map.id)||{}},exports:a.exports||(a.exports={})}}};Z=function(a){this.events=m($,a.id)||{};this.map=a;this.shim=m(j.shim,a.id);this.depExports=[];this.depMaps=[];this.depMatched=[];this.pluginMaps={};this.depCount=0};Z.prototype={init:function(a,b,c,f){f=f||{};if(!this.inited){this.factory=b;if(c)this.on("error",c);else this.events.error&&(c=u(this,function(a){this.emit("error",a)}));this.depMaps=a&&a.slice(0);this.errback=
+c;this.inited=!0;this.ignore=f.ignore;f.enabled||this.enabled?this.enable():this.check()}},defineDep:function(a,b){this.depMatched[a]||(this.depMatched[a]=!0,this.depCount-=1,this.depExports[a]=b)},fetch:function(){if(!this.fetched){this.fetched=!0;i.startTime=(new Date).getTime();var a=this.map;if(this.shim)i.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],u(this,function(){return a.prefix?this.callPlugin():this.load()}));else return a.prefix?this.callPlugin():this.load()}},load:function(){var a=
+this.map.url;S[a]||(S[a]=!0,i.load(this.map.id,a))},check:function(){if(this.enabled&&!this.enabling){var a,b,c=this.map.id;b=this.depExports;var f=this.exports,l=this.factory;if(this.inited)if(this.error)this.emit("error",this.error);else{if(!this.defining){this.defining=!0;if(1>this.depCount&&!this.defined){if(G(l)){if(this.events.error&&this.map.isDefine||g.onError!==ca)try{f=i.execCb(c,l,b,f)}catch(d){a=d}else f=i.execCb(c,l,b,f);this.map.isDefine&&void 0===f&&((b=this.module)?f=b.exports:this.usingExports&&
+(f=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?"define":"require",w(this.error=a)}else f=l;this.exports=f;if(this.map.isDefine&&!this.ignore&&(r[c]=f,g.onResourceLoad))g.onResourceLoad(i,this.map,this.depMaps);y(c);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else this.fetch()}},callPlugin:function(){var a=
+this.map,b=a.id,d=p(a.prefix);this.depMaps.push(d);q(d,"defined",u(this,function(f){var l,d;d=m(aa,this.map.id);var e=this.map.name,P=this.map.parentMap?this.map.parentMap.name:null,n=i.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(f.normalize&&(e=f.normalize(e,function(a){return c(a,P,!0)})||""),f=p(a.prefix+"!"+e,this.map.parentMap),q(f,"defined",u(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),d=m(h,f.id)){this.depMaps.push(f);
+if(this.events.error)d.on("error",u(this,function(a){this.emit("error",a)}));d.enable()}}else d?(this.map.url=i.nameToUrl(d),this.load()):(l=u(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),l.error=u(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];B(h,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&y(a.map.id)});w(a)}),l.fromText=u(this,function(f,c){var d=a.name,e=p(d),P=M;c&&(f=c);P&&(M=!1);s(e);t(j.config,b)&&(j.config[d]=j.config[b]);try{g.exec(f)}catch(h){return w(C("fromtexteval",
+"fromText eval for "+b+" failed: "+h,h,[b]))}P&&(M=!0);this.depMaps.push(e);i.completeLoad(d);n([d],l)}),f.load(a.name,n,l,j))}));i.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){V[this.map.id]=this;this.enabling=this.enabled=!0;v(this.depMaps,u(this,function(a,b){var c,f;if("string"===typeof a){a=p(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=m(L,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;q(a,"defined",u(this,function(a){this.defineDep(b,
+a);this.check()}));this.errback?q(a,"error",u(this,this.errback)):this.events.error&&q(a,"error",u(this,function(a){this.emit("error",a)}))}c=a.id;f=h[c];!t(L,c)&&(f&&!f.enabled)&&i.enable(a,this)}));B(this.pluginMaps,u(this,function(a){var b=m(h,a.id);b&&!b.enabled&&i.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){v(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};i={config:j,contextName:b,
+registry:h,defined:r,urlFetched:S,defQueue:A,Module:Z,makeModuleMap:p,nextTick:g.nextTick,onError:w,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=j.shim,c={paths:!0,bundles:!0,config:!0,map:!0};B(a,function(a,b){c[b]?(j[b]||(j[b]={}),U(j[b],a,!0,!0)):j[b]=a});a.bundles&&B(a.bundles,function(a,b){v(a,function(a){a!==b&&(aa[a]=b)})});a.shim&&(B(a.shim,function(a,c){H(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=i.makeShimExports(a);
+b[c]=a}),j.shim=b);a.packages&&v(a.packages,function(a){var b,a="string"===typeof a?{name:a}:a;b=a.name;a.location&&(j.paths[b]=a.location);j.pkgs[b]=a.name+"/"+(a.main||"main").replace(ia,"").replace(Q,"")});B(h,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=p(b))});if(a.deps||a.callback)i.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(ba,arguments));return b||a.exports&&da(a.exports)}},makeRequire:function(a,e){function j(c,d,m){var n,
+q;e.enableBuildCallback&&(d&&G(d))&&(d.__requireJsBuild=!0);if("string"===typeof c){if(G(d))return w(C("requireargs","Invalid require call"),m);if(a&&t(L,c))return L[c](h[a.id]);if(g.get)return g.get(i,c,a,j);n=p(c,a,!1,!0);n=n.id;return!t(r,n)?w(C("notloaded",'Module name "'+n+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):r[n]}J();i.nextTick(function(){J();q=s(p(null,a));q.skipMap=e.skipMap;q.init(c,d,m,{enabled:!0});D()});return j}e=e||{};U(j,{isBrowser:z,toUrl:function(b){var d,
+e=b.lastIndexOf("."),k=b.split("/")[0];if(-1!==e&&(!("."===k||".."===k)||1<e))d=b.substring(e,b.length),b=b.substring(0,e);return i.nameToUrl(c(b,a&&a.id,!0),d,!0)},defined:function(b){return t(r,p(b,a,!1,!0).id)},specified:function(b){b=p(b,a,!1,!0).id;return t(r,b)||t(h,b)}});a||(j.undef=function(b){x();var c=p(b,a,!0),e=m(h,b);d(b);delete r[b];delete S[c.url];delete $[b];T(A,function(a,c){a[0]===b&&A.splice(c,1)});e&&(e.events.defined&&($[b]=e.events),y(b))});return j},enable:function(a){m(h,a.id)&&
+s(a).enable()},completeLoad:function(a){var b,c,d=m(j.shim,a)||{},g=d.exports;for(x();A.length;){c=A.shift();if(null===c[0]){c[0]=a;if(b)break;b=!0}else c[0]===a&&(b=!0);E(c)}c=m(h,a);if(!b&&!t(r,a)&&c&&!c.inited){if(j.enforceDefine&&(!g||!da(g)))return e(a)?void 0:w(C("nodefine","No define call for "+a,null,[a]));E([a,d.deps||[],d.exportsFn])}D()},nameToUrl:function(a,b,c){var d,e,h;(d=m(j.pkgs,a))&&(a=d);if(d=m(aa,a))return i.nameToUrl(d,b,c);if(g.jsExtRegExp.test(a))d=a+(b||"");else{d=j.paths;
+a=a.split("/");for(e=a.length;0<e;e-=1)if(h=a.slice(0,e).join("/"),h=m(d,h)){H(h)&&(h=h[0]);a.splice(0,e,h);break}d=a.join("/");d+=b||(/^data\:|\?/.test(d)||c?"":".js");d=("/"===d.charAt(0)||d.match(/^[\w\+\.\-]+:/)?"":j.baseUrl)+d}return j.urlArgs?d+((-1===d.indexOf("?")?"?":"&")+j.urlArgs):d},load:function(a,b){g.load(i,a,b)},execCb:function(a,b,c,d){return b.apply(d,c)},onScriptLoad:function(a){if("load"===a.type||ja.test((a.currentTarget||a.srcElement).readyState))N=null,a=I(a),i.completeLoad(a.id)},
+onScriptError:function(a){var b=I(a);if(!e(b.id))return w(C("scripterror","Script error for: "+b.id,a,[b.id]))}};i.require=i.makeRequire();return i}var g,x,y,D,I,E,N,J,s,O,ka=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,la=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,Q=/\.js$/,ia=/^\.\//;x=Object.prototype;var K=x.toString,fa=x.hasOwnProperty,ha=Array.prototype.splice,z=!!("undefined"!==typeof window&&"undefined"!==typeof navigator&&window.document),ea=!z&&"undefined"!==typeof importScripts,ja=
+z&&"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,Y="undefined"!==typeof opera&&"[object Opera]"===opera.toString(),F={},q={},R=[],M=!1;if("undefined"===typeof define){if("undefined"!==typeof requirejs){if(G(requirejs))return;q=requirejs;requirejs=void 0}"undefined"!==typeof require&&!G(require)&&(q=require,require=void 0);g=requirejs=function(b,c,d,e){var n,p="_";!H(b)&&"string"!==typeof b&&(n=b,H(c)?(b=c,c=d,d=e):b=[]);n&&n.context&&(p=n.context);(e=m(F,p))||(e=F[p]=g.s.newContext(p));
+n&&e.configure(n);return e.require(b,c,d)};g.config=function(b){return g(b)};g.nextTick="undefined"!==typeof setTimeout?function(b){setTimeout(b,4)}:function(b){b()};require||(require=g);g.version="2.1.16";g.jsExtRegExp=/^\/|:|\?|\.js$/;g.isBrowser=z;x=g.s={contexts:F,newContext:ga};g({});v(["toUrl","undef","defined","specified"],function(b){g[b]=function(){var c=F._;return c.require[b].apply(c,arguments)}});if(z&&(y=x.head=document.getElementsByTagName("head")[0],D=document.getElementsByTagName("base")[0]))y=
+x.head=D.parentNode;g.onError=ca;g.createNode=function(b){var c=b.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script");c.type=b.scriptType||"text/javascript";c.charset="utf-8";c.async=!0;return c};g.load=function(b,c,d){var e=b&&b.config||{};if(z)return e=g.createNode(e,c,d),e.setAttribute("data-requirecontext",b.contextName),e.setAttribute("data-requiremodule",c),e.attachEvent&&!(e.attachEvent.toString&&0>e.attachEvent.toString().indexOf("[native code"))&&
+!Y?(M=!0,e.attachEvent("onreadystatechange",b.onScriptLoad)):(e.addEventListener("load",b.onScriptLoad,!1),e.addEventListener("error",b.onScriptError,!1)),e.src=d,J=e,D?y.insertBefore(e,D):y.appendChild(e),J=null,e;if(ea)try{importScripts(d),b.completeLoad(c)}catch(m){b.onError(C("importscripts","importScripts failed for "+c+" at "+d,m,[c]))}};z&&!q.skipDataMain&&T(document.getElementsByTagName("script"),function(b){y||(y=b.parentNode);if(I=b.getAttribute("data-main"))return s=I,q.baseUrl||(E=s.split("/"),
+s=E.pop(),O=E.length?E.join("/")+"/":"./",q.baseUrl=O),s=s.replace(Q,""),g.jsExtRegExp.test(s)&&(s=I),q.deps=q.deps?q.deps.concat(s):[s],!0});define=function(b,c,d){var e,g;"string"!==typeof b&&(d=c,c=b,b=null);H(c)||(d=c,c=null);!c&&G(d)&&(c=[],d.length&&(d.toString().replace(ka,"").replace(la,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c)));if(M){if(!(e=J))N&&"interactive"===N.readyState||T(document.getElementsByTagName("script"),function(b){if("interactive"===
+b.readyState)return N=b}),e=N;e&&(b||(b=e.getAttribute("data-requiremodule")),g=F[e.getAttribute("data-requirecontext")])}(g?g.defQueue:R).push([b,c,d])};define.amd={jQuery:!0};g.exec=function(b){return eval(b)};g(q)}})(this);
diff --git a/docs/build/mkdocs/js/search-results-template.mustache b/docs/build/mkdocs/js/search-results-template.mustache
new file mode 100644
index 0000000..a8b3862
--- /dev/null
+++ b/docs/build/mkdocs/js/search-results-template.mustache
@@ -0,0 +1,4 @@
+<article>
+ <h3><a href="{{location}}">{{title}}</a></h3>
+ <p>{{summary}}</p>
+</article>
diff --git a/docs/build/mkdocs/js/search.js b/docs/build/mkdocs/js/search.js
new file mode 100644
index 0000000..d5c8661
--- /dev/null
+++ b/docs/build/mkdocs/js/search.js
@@ -0,0 +1,88 @@
+require([
+ base_url + '/mkdocs/js/mustache.min.js',
+ base_url + '/mkdocs/js/lunr.min.js',
+ 'text!search-results-template.mustache',
+ 'text!../search_index.json',
+], function (Mustache, lunr, results_template, data) {
+ "use strict";
+
+ function getSearchTerm()
+ {
+ var sPageURL = window.location.search.substring(1);
+ var sURLVariables = sPageURL.split('&');
+ for (var i = 0; i < sURLVariables.length; i++)
+ {
+ var sParameterName = sURLVariables[i].split('=');
+ if (sParameterName[0] == 'q')
+ {
+ return decodeURIComponent(sParameterName[1].replace(/\+/g, '%20'));
+ }
+ }
+ }
+
+ var index = lunr(function () {
+ this.field('title', {boost: 10});
+ this.field('text');
+ this.ref('location');
+ });
+
+ data = JSON.parse(data);
+ var documents = {};
+
+ for (var i=0; i < data.docs.length; i++){
+ var doc = data.docs[i];
+ doc.location = base_url + doc.location;
+ index.add(doc);
+ documents[doc.location] = doc;
+ }
+
+ var search = function(){
+
+ var query = document.getElementById('mkdocs-search-query').value;
+ var search_results = document.getElementById("mkdocs-search-results");
+ while (search_results.firstChild) {
+ search_results.removeChild(search_results.firstChild);
+ }
+
+ if(query === ''){
+ return;
+ }
+
+ var results = index.search(query);
+
+ if (results.length > 0){
+ for (var i=0; i < results.length; i++){
+ var result = results[i];
+ doc = documents[result.ref];
+ doc.base_url = base_url;
+ doc.summary = doc.text.substring(0, 200);
+ var html = Mustache.to_html(results_template, doc);
+ search_results.insertAdjacentHTML('beforeend', html);
+ }
+ } else {
+ search_results.insertAdjacentHTML('beforeend', "<p>No results found</p>");
+ }
+
+ if(jQuery){
+ /*
+ * We currently only automatically hide bootstrap models. This
+ * requires jQuery to work.
+ */
+ jQuery('#mkdocs_search_modal a').click(function(){
+ jQuery('#mkdocs_search_modal').modal('hide');
+ });
+ }
+
+ };
+
+ var search_input = document.getElementById('mkdocs-search-query');
+
+ var term = getSearchTerm();
+ if (term){
+ search_input.value = term;
+ search();
+ }
+
+ search_input.addEventListener("keyup", search);
+
+});
diff --git a/docs/build/mkdocs/js/text.js b/docs/build/mkdocs/js/text.js
new file mode 100644
index 0000000..17921b6
--- /dev/null
+++ b/docs/build/mkdocs/js/text.js
@@ -0,0 +1,390 @@
+/**
+ * @license RequireJS text 2.0.12 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved.
+ * Available via the MIT or new BSD license.
+ * see: http://github.com/requirejs/text for details
+ */
+/*jslint regexp: true */
+/*global require, XMLHttpRequest, ActiveXObject,
+ define, window, process, Packages,
+ java, location, Components, FileUtils */
+
+define(['module'], function (module) {
+ 'use strict';
+
+ var text, fs, Cc, Ci, xpcIsWindows,
+ progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'],
+ xmlRegExp = /^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,
+ bodyRegExp = /<body[^>]*>\s*([\s\S]+)\s*<\/body>/im,
+ hasLocation = typeof location !== 'undefined' && location.href,
+ defaultProtocol = hasLocation && location.protocol && location.protocol.replace(/\:/, ''),
+ defaultHostName = hasLocation && location.hostname,
+ defaultPort = hasLocation && (location.port || undefined),
+ buildMap = {},
+ masterConfig = (module.config && module.config()) || {};
+
+ text = {
+ version: '2.0.12',
+
+ strip: function (content) {
+ //Strips <?xml ...?> declarations so that external SVG and XML
+ //documents can be added to a document without worry. Also, if the string
+ //is an HTML document, only the part inside the body tag is returned.
+ if (content) {
+ content = content.replace(xmlRegExp, "");
+ var matches = content.match(bodyRegExp);
+ if (matches) {
+ content = matches[1];
+ }
+ } else {
+ content = "";
+ }
+ return content;
+ },
+
+ jsEscape: function (content) {
+ return content.replace(/(['\\])/g, '\\$1')
+ .replace(/[\f]/g, "\\f")
+ .replace(/[\b]/g, "\\b")
+ .replace(/[\n]/g, "\\n")
+ .replace(/[\t]/g, "\\t")
+ .replace(/[\r]/g, "\\r")
+ .replace(/[\u2028]/g, "\\u2028")
+ .replace(/[\u2029]/g, "\\u2029");
+ },
+
+ createXhr: masterConfig.createXhr || function () {
+ //Would love to dump the ActiveX crap in here. Need IE 6 to die first.
+ var xhr, i, progId;
+ if (typeof XMLHttpRequest !== "undefined") {
+ return new XMLHttpRequest();
+ } else if (typeof ActiveXObject !== "undefined") {
+ for (i = 0; i < 3; i += 1) {
+ progId = progIds[i];
+ try {
+ xhr = new ActiveXObject(progId);
+ } catch (e) {}
+
+ if (xhr) {
+ progIds = [progId]; // so faster next time
+ break;
+ }
+ }
+ }
+
+ return xhr;
+ },
+
+ /**
+ * Parses a resource name into its component parts. Resource names
+ * look like: module/name.ext!strip, where the !strip part is
+ * optional.
+ * @param {String} name the resource name
+ * @returns {Object} with properties "moduleName", "ext" and "strip"
+ * where strip is a boolean.
+ */
+ parseName: function (name) {
+ var modName, ext, temp,
+ strip = false,
+ index = name.indexOf("."),
+ isRelative = name.indexOf('./') === 0 ||
+ name.indexOf('../') === 0;
+
+ if (index !== -1 && (!isRelative || index > 1)) {
+ modName = name.substring(0, index);
+ ext = name.substring(index + 1, name.length);
+ } else {
+ modName = name;
+ }
+
+ temp = ext || modName;
+ index = temp.indexOf("!");
+ if (index !== -1) {
+ //Pull off the strip arg.
+ strip = temp.substring(index + 1) === "strip";
+ temp = temp.substring(0, index);
+ if (ext) {
+ ext = temp;
+ } else {
+ modName = temp;
+ }
+ }
+
+ return {
+ moduleName: modName,
+ ext: ext,
+ strip: strip
+ };
+ },
+
+ xdRegExp: /^((\w+)\:)?\/\/([^\/\\]+)/,
+
+ /**
+ * Is an URL on another domain. Only works for browser use, returns
+ * false in non-browser environments. Only used to know if an
+ * optimized .js version of a text resource should be loaded
+ * instead.
+ * @param {String} url
+ * @returns Boolean
+ */
+ useXhr: function (url, protocol, hostname, port) {
+ var uProtocol, uHostName, uPort,
+ match = text.xdRegExp.exec(url);
+ if (!match) {
+ return true;
+ }
+ uProtocol = match[2];
+ uHostName = match[3];
+
+ uHostName = uHostName.split(':');
+ uPort = uHostName[1];
+ uHostName = uHostName[0];
+
+ return (!uProtocol || uProtocol === protocol) &&
+ (!uHostName || uHostName.toLowerCase() === hostname.toLowerCase()) &&
+ ((!uPort && !uHostName) || uPort === port);
+ },
+
+ finishLoad: function (name, strip, content, onLoad) {
+ content = strip ? text.strip(content) : content;
+ if (masterConfig.isBuild) {
+ buildMap[name] = content;
+ }
+ onLoad(content);
+ },
+
+ load: function (name, req, onLoad, config) {
+ //Name has format: some.module.filext!strip
+ //The strip part is optional.
+ //if strip is present, then that means only get the string contents
+ //inside a body tag in an HTML string. For XML/SVG content it means
+ //removing the <?xml ...?> declarations so the content can be inserted
+ //into the current doc without problems.
+
+ // Do not bother with the work if a build and text will
+ // not be inlined.
+ if (config && config.isBuild && !config.inlineText) {
+ onLoad();
+ return;
+ }
+
+ masterConfig.isBuild = config && config.isBuild;
+
+ var parsed = text.parseName(name),
+ nonStripName = parsed.moduleName +
+ (parsed.ext ? '.' + parsed.ext : ''),
+ url = req.toUrl(nonStripName),
+ useXhr = (masterConfig.useXhr) ||
+ text.useXhr;
+
+ // Do not load if it is an empty: url
+ if (url.indexOf('empty:') === 0) {
+ onLoad();
+ return;
+ }
+
+ //Load the text. Use XHR if possible and in a browser.
+ if (!hasLocation || useXhr(url, defaultProtocol, defaultHostName, defaultPort)) {
+ text.get(url, function (content) {
+ text.finishLoad(name, parsed.strip, content, onLoad);
+ }, function (err) {
+ if (onLoad.error) {
+ onLoad.error(err);
+ }
+ });
+ } else {
+ //Need to fetch the resource across domains. Assume
+ //the resource has been optimized into a JS module. Fetch
+ //by the module name + extension, but do not include the
+ //!strip part to avoid file system issues.
+ req([nonStripName], function (content) {
+ text.finishLoad(parsed.moduleName + '.' + parsed.ext,
+ parsed.strip, content, onLoad);
+ });
+ }
+ },
+
+ write: function (pluginName, moduleName, write, config) {
+ if (buildMap.hasOwnProperty(moduleName)) {
+ var content = text.jsEscape(buildMap[moduleName]);
+ write.asModule(pluginName + "!" + moduleName,
+ "define(function () { return '" +
+ content +
+ "';});\n");
+ }
+ },
+
+ writeFile: function (pluginName, moduleName, req, write, config) {
+ var parsed = text.parseName(moduleName),
+ extPart = parsed.ext ? '.' + parsed.ext : '',
+ nonStripName = parsed.moduleName + extPart,
+ //Use a '.js' file name so that it indicates it is a
+ //script that can be loaded across domains.
+ fileName = req.toUrl(parsed.moduleName + extPart) + '.js';
+
+ //Leverage own load() method to load plugin value, but only
+ //write out values that do not have the strip argument,
+ //to avoid any potential issues with ! in file names.
+ text.load(nonStripName, req, function (value) {
+ //Use own write() method to construct full module value.
+ //But need to create shell that translates writeFile's
+ //write() to the right interface.
+ var textWrite = function (contents) {
+ return write(fileName, contents);
+ };
+ textWrite.asModule = function (moduleName, contents) {
+ return write.asModule(moduleName, fileName, contents);
+ };
+
+ text.write(pluginName, nonStripName, textWrite, config);
+ }, config);
+ }
+ };
+
+ if (masterConfig.env === 'node' || (!masterConfig.env &&
+ typeof process !== "undefined" &&
+ process.versions &&
+ !!process.versions.node &&
+ !process.versions['node-webkit'])) {
+ //Using special require.nodeRequire, something added by r.js.
+ fs = require.nodeRequire('fs');
+
+ text.get = function (url, callback, errback) {
+ try {
+ var file = fs.readFileSync(url, 'utf8');
+ //Remove BOM (Byte Mark Order) from utf8 files if it is there.
+ if (file.indexOf('\uFEFF') === 0) {
+ file = file.substring(1);
+ }
+ callback(file);
+ } catch (e) {
+ if (errback) {
+ errback(e);
+ }
+ }
+ };
+ } else if (masterConfig.env === 'xhr' || (!masterConfig.env &&
+ text.createXhr())) {
+ text.get = function (url, callback, errback, headers) {
+ var xhr = text.createXhr(), header;
+ xhr.open('GET', url, true);
+
+ //Allow plugins direct access to xhr headers
+ if (headers) {
+ for (header in headers) {
+ if (headers.hasOwnProperty(header)) {
+ xhr.setRequestHeader(header.toLowerCase(), headers[header]);
+ }
+ }
+ }
+
+ //Allow overrides specified in config
+ if (masterConfig.onXhr) {
+ masterConfig.onXhr(xhr, url);
+ }
+
+ xhr.onreadystatechange = function (evt) {
+ var status, err;
+ //Do not explicitly handle errors, those should be
+ //visible via console output in the browser.
+ if (xhr.readyState === 4) {
+ status = xhr.status || 0;
+ if (status > 399 && status < 600) {
+ //An http 4xx or 5xx error. Signal an error.
+ err = new Error(url + ' HTTP status: ' + status);
+ err.xhr = xhr;
+ if (errback) {
+ errback(err);
+ }
+ } else {
+ callback(xhr.responseText);
+ }
+
+ if (masterConfig.onXhrComplete) {
+ masterConfig.onXhrComplete(xhr, url);
+ }
+ }
+ };
+ xhr.send(null);
+ };
+ } else if (masterConfig.env === 'rhino' || (!masterConfig.env &&
+ typeof Packages !== 'undefined' && typeof java !== 'undefined')) {
+ //Why Java, why is this so awkward?
+ text.get = function (url, callback) {
+ var stringBuffer, line,
+ encoding = "utf-8",
+ file = new java.io.File(url),
+ lineSeparator = java.lang.System.getProperty("line.separator"),
+ input = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(file), encoding)),
+ content = '';
+ try {
+ stringBuffer = new java.lang.StringBuffer();
+ line = input.readLine();
+
+ // Byte Order Mark (BOM) - The Unicode Standard, version 3.0, page 324
+ // http://www.unicode.org/faq/utf_bom.html
+
+ // Note that when we use utf-8, the BOM should appear as "EF BB BF", but it doesn't due to this bug in the JDK:
+ // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508058
+ if (line && line.length() && line.charAt(0) === 0xfeff) {
+ // Eat the BOM, since we've already found the encoding on this file,
+ // and we plan to concatenating this buffer with others; the BOM should
+ // only appear at the top of a file.
+ line = line.substring(1);
+ }
+
+ if (line !== null) {
+ stringBuffer.append(line);
+ }
+
+ while ((line = input.readLine()) !== null) {
+ stringBuffer.append(lineSeparator);
+ stringBuffer.append(line);
+ }
+ //Make sure we return a JavaScript string and not a Java string.
+ content = String(stringBuffer.toString()); //String
+ } finally {
+ input.close();
+ }
+ callback(content);
+ };
+ } else if (masterConfig.env === 'xpconnect' || (!masterConfig.env &&
+ typeof Components !== 'undefined' && Components.classes &&
+ Components.interfaces)) {
+ //Avert your gaze!
+ Cc = Components.classes;
+ Ci = Components.interfaces;
+ Components.utils['import']('resource://gre/modules/FileUtils.jsm');
+ xpcIsWindows = ('@mozilla.org/windows-registry-key;1' in Cc);
+
+ text.get = function (url, callback) {
+ var inStream, convertStream, fileObj,
+ readData = {};
+
+ if (xpcIsWindows) {
+ url = url.replace(/\//g, '\\');
+ }
+
+ fileObj = new FileUtils.File(url);
+
+ //XPCOM, you so crazy
+ try {
+ inStream = Cc['@mozilla.org/network/file-input-stream;1']
+ .createInstance(Ci.nsIFileInputStream);
+ inStream.init(fileObj, 1, 0, false);
+
+ convertStream = Cc['@mozilla.org/intl/converter-input-stream;1']
+ .createInstance(Ci.nsIConverterInputStream);
+ convertStream.init(inStream, "utf-8", inStream.available(),
+ Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER);
+
+ convertStream.readString(inStream.available(), readData);
+ convertStream.close();
+ inStream.close();
+ callback(readData.value);
+ } catch (e) {
+ throw new Error((fileObj && fileObj.path || '') + ': ' + e);
+ }
+ };
+ }
+ return text;
+});
diff --git a/docs/build/mkdocs/search_index.json b/docs/build/mkdocs/search_index.json
new file mode 100644
index 0000000..b9dca9c
--- /dev/null
+++ b/docs/build/mkdocs/search_index.json
@@ -0,0 +1,1104 @@
+{
+ "docs": [
+ {
+ "location": "/",
+ "text": "Ponzu CMS + Server Framework Docs\n\n\n\n\nWhat is Ponzu?\n\n\n\n\nWatch the \nvideo introduction\n\n\n\n\nPonzu is a powerful and efficient open-source HTTP server framework and CMS. It \nprovides automatic, free, and secure HTTP/2 over TLS (certificates obtained via \n\nLet's Encrypt\n), a useful CMS and scaffolding to generate \ncontent editors, and a fast HTTP API on which to build modern applications.\n\n\nWant to jump in right away? Try the \nQuickstart\n\n\nTable of Contents\n\n\n\n\nCLI\n\n\nContent\n\n\nForm Fields\n\n\nHTTP API - Content\n\n\nHTTP API - File Metadata\n\n\nHTTP API - Search\n\n\nInterfaces - API\n\n\nInterfaces - Editor\n\n\nInterfaces - Item\n\n\nInterfaces - Search\n\n\nCreating Ponzu Addons\n\n\nUsing Ponzu Addons\n\n\nQuickstart\n\n\nBackups\n\n\nSystem Configuration\n\n\n\n\nNeed help? Get in touch\n\n\n\n\nChat: \n#ponzu on Slack\n\n\nReach out on Twitter: \n@ponzu_cms\n\n\nFile an \nissue\n\n\n\n\n\n\ncurrent version: \nv0.9.2\n @ ponzu:master",
+ "title": "Home"
+ },
+ {
+ "location": "/#ponzu-cms-server-framework-docs",
+ "text": "",
+ "title": "Ponzu CMS + Server Framework Docs"
+ },
+ {
+ "location": "/#what-is-ponzu",
+ "text": "Watch the video introduction Ponzu is a powerful and efficient open-source HTTP server framework and CMS. It \nprovides automatic, free, and secure HTTP/2 over TLS (certificates obtained via Let's Encrypt ), a useful CMS and scaffolding to generate \ncontent editors, and a fast HTTP API on which to build modern applications. Want to jump in right away? Try the Quickstart",
+ "title": "What is Ponzu?"
+ },
+ {
+ "location": "/#table-of-contents",
+ "text": "CLI Content Form Fields HTTP API - Content HTTP API - File Metadata HTTP API - Search Interfaces - API Interfaces - Editor Interfaces - Item Interfaces - Search Creating Ponzu Addons Using Ponzu Addons Quickstart Backups System Configuration",
+ "title": "Table of Contents"
+ },
+ {
+ "location": "/#need-help-get-in-touch",
+ "text": "Chat: #ponzu on Slack Reach out on Twitter: @ponzu_cms File an issue current version: v0.9.2 @ ponzu:master",
+ "title": "Need help? Get in touch"
+ },
+ {
+ "location": "/CLI/General-Usage/",
+ "text": "$ ponzu \n[\nflags\n]\n \ncommand\n \nparams\n\n\n\n\n\n\nCommands\n\n\nnew\n\n\nCreates a project directory of the name supplied as a parameter immediately\nfollowing the 'new' option in the $GOPATH/src directory. Note: 'new' depends on \nthe program 'git' and possibly a network connection. If there is no local \nrepository to clone from at the local machine's $GOPATH, 'new' will attempt to \nclone the 'github.com/ponzu-cms/ponzu' package from over the network.\n\n\nExample:\n\n\n$ ponzu new github.com/nilslice/proj\n\n New ponzu project created at \n$GOPATH\n/src/github.com/nilslice/proj\n\n\n\n\n\n\n\ngenerate, gen, g\n\n\nGenerate boilerplate code for various Ponzu components, such as \ncontent\n.\n\n\nExample:\n\n\n generator struct fields and built-in types...\n \n|\n \n|\n\n v v \n$ ponzu gen content review title:\nstring\n body:\nstring\n:richtext rating:\nint\n\n ^ ^\n \n|\n \n|\n\n struct \ntype\n \n(\noptional\n)\n input view specifier\n\n\n\n\n\nThe command above will generate the file \ncontent/review.go\n with boilerplate\nmethods, as well as struct definition, and corresponding field tags like:\n\n\ntype\n \nReview\n \nstruct\n \n{\n\n \nitem\n.\nItem\n\n\n \nTitle\n \nstring\n \n`json:\ntitle\n`\n\n \nBody\n \nstring\n \n`json:\nbody\n`\n\n \nRating\n \nint\n \n`json:\nrating\n`\n\n \nTags\n \n[]\nstring\n \n`json:\ntags\n`\n\n\n}\n\n\n\n\n\n\nThe generate command will intelligently parse more sophisticated field names\nsuch as 'field_name' and convert it to 'FieldName' and vice versa, only where \nappropriate as per common Go idioms. Errors will be reported, but successful \ngenerate commands return nothing.\n\n\nInput View Specifiers\n \n(optional)\n\n\nThe CLI can optionally parse a third parameter on the fields provided to generate \nthe type of HTML view an editor field is presented within. If no third parameter\nis added, a plain text HTML input will be generated. In the example above, the \nargument shown as \nbody:string:richtext\n would show the Richtext input instead\nof a plain text HTML input (as shown in the screenshot). The following input\nview specifiers are implemented:\n\n\n\n\n\n\n\n\nCLI parameter\n\n\nGenerates\n\n\n\n\n\n\n\n\n\n\ncheckbox\n\n\neditor.Checkbox()\n\n\n\n\n\n\ncustom\n\n\ngenerates a pre-styled empty div to fill with HTML\n\n\n\n\n\n\nfile\n\n\neditor.File()\n\n\n\n\n\n\nhidden\n\n\neditor.Input()\n + uses type=hidden\n\n\n\n\n\n\ninput, text\n\n\neditor.Input()\n\n\n\n\n\n\nrichtext\n\n\neditor.Richtext()\n\n\n\n\n\n\nselect\n\n\neditor.Select()\n\n\n\n\n\n\ntextarea\n\n\neditor.Textarea()\n\n\n\n\n\n\ntags\n\n\neditor.Tags()\n\n\n\n\n\n\n\n\nGenerate Content References\n\n\nIt's also possible to generate all of the code needed to create references between\nyour content types. The syntax to do so is below, but refer to the \ndocumentation\n\nfor more details:\n\n\n$ ponzu gen c author name:string genre:string:select\n$ ponzu gen c book title:string author:@author,name,genre \n\n\n\n\n\nThe commands above will generate a \nBook\n Content type with a reference to an\n\nAuthor\n item, by also generating a \nreference.Select\n\nas the view for the \nauthor\n field.\n\n\n\n\nbuild\n\n\nFrom within your Ponzu project directory, running build will copy and move \nthe necessary files from your workspace into the vendored directory, and \nwill build/compile the project to then be run. \n\n\nOptional flags:\n- \n--gocmd\n sets the binary used when executing \ngo build\n within \nponzu\n build step\n\n\nExample:\n\n\n$ ponzu build\n\n(\nor\n)\n\n$ ponzu build --gocmd\n=\ngo1.8rc1 \n# useful for testing\n\n\n\n\n\n\nErrors will be reported, but successful build commands return nothing.\n\n\n\n\nrun\n\n\nStarts the HTTP server for the JSON API, Admin System, or both.\nThe segments, separated by a comma, describe which services to start, either \n'admin' (Admin System / CMS backend) or 'api' (JSON API), and, optionally, \nif the server should utilize TLS encryption - served over HTTPS, which is\nautomatically managed using Let's Encrypt (https://letsencrypt.org) \n\n\nOptional flags:\n- \n--port\n sets the port on which the server listens for HTTP requests [defaults to 8080]\n- \n--https-port\n sets the port on which the server listens for HTTPS requests [defaults to 443]\n- \n--https\n enables auto HTTPS management via Let's Encrypt (port is always 443)\n- \n--dev-https\n generates self-signed SSL certificates for development-only (port is 10443)\n\n\nExample: \n\n\n$ ponzu run\n\n(\nor\n)\n\n$ ponzu run --port\n=\n8080\n --https admin,api\n\n(\nor\n)\n \n$ ponzu run admin\n\n(\nor\n)\n\n$ ponzu run --port\n=\n8888\n api\n\n(\nor\n)\n\n$ ponzu --dev-https run\n\n\n\n\n\nDefaults to \n$ ponzu run --port=8080 admin,api\n (running Admin \n API on port 8080, without TLS)\n\n\nNote:\n \nAdmin and API cannot run on separate processes unless you use a copy of the\ndatabase, since the first process to open it receives a lock. If you intend\nto run the Admin and API on separate processes, you must call them with the\n'ponzu' command independently.\n\n\n\n\nupgrade\n\n\nWill backup your own custom project code (like content, addons, uploads, etc) so\nwe can safely re-clone Ponzu from the latest version you have or from the network \nif necessary. Before running \n$ ponzu upgrade\n, you should update the \nponzu\n\npackage by running \n$ go get -u github.com/ponzu-cms/ponzu/...\n \n\n\nExample:\n\n\n$ ponzu upgrade\n\n\n\n\n\n\n\nadd, a\n\n\nDownloads an addon to GOPATH/src and copies it to the current Ponzu project's\n\n/addons\n directory.\n\n\nExample:\n\n\n$ ponzu add github.com/bosssauce/fbscheduler\n\n\n\n\n\nErrors will be reported, but successful add commands return nothing.\n\n\n\n\nversion, v\n\n\nPrints the version of Ponzu your project is using. Must be called from within a \nPonzu project directory. By passing the \n--cli\n flag, the \nversion\n command will \nprint the version of the Ponzu CLI you have installed.\n\n\nExample:\n\n\n$ ponzu version\nPonzu v0.8.2\n\n# (or)\n\n$ ponzu version --cli\nPonzu v0.9.2\n\n\n\n\n\n\n\nContributing\n\n\n\n\nCheckout branch ponzu-dev\n\n\nMake code changes\n\n\nTest changes to ponzu-dev branch\n\n\nmake a commit to ponzu-dev\n\n\nto manually test, you will need to use a new copy (ponzu new path/to/code), \nbut pass the \n--dev\n flag so that ponzu generates a new copy from the \nponzu-dev\n \nbranch, not master by default (i.e. \n$ponzu new --dev /path/to/code\n)\n\n\nbuild and run with \n$ ponzu build\n and \n$ ponzu run\n\n\n\n\n\n\nTo add back to master: \n\n\nfirst push to origin ponzu-dev\n\n\ncreate a pull request \n\n\nwill then be merged into master\n\n\n\n\n\n\n\n\nA typical contribution workflow might look like:\n\n\n# clone the repository and checkout ponzu-dev\n\n$ git clone https://github.com/ponzu-cms/ponzu path/to/local/ponzu \n# (or your fork)\n\n$ git checkout ponzu-dev\n\n\n# install ponzu with go get or from your own local path\n\n$ go get github.com/ponzu-cms/ponzu/...\n\n# or\n\n$ \ncd\n /path/to/local/ponzu \n$ go install ./...\n\n\n# edit files, add features, etc\n\n$ git add -A\n$ git commit -m \nedited files, added features, etc\n\n\n\n# now you need to test the feature.. make a new ponzu project, but pass --dev flag\n\n$ ponzu --dev new /path/to/new/project \n# will create $GOPATH/src/path/to/new/project\n\n\n\n# build \n run ponzu from the new project directory\n\n$ \ncd\n /path/to/new/project\n$ ponzu build \n ponzu run\n\n\n# push to your origin:ponzu-dev branch and create a PR at ponzu-cms/ponzu\n\n$ git push origin ponzu-dev\n\n# ... go to https://github.com/ponzu-cms/ponzu and create a PR\n\n\n\n\n\n\nNote:\n if you intend to work on your own fork and contribute from it, you will\nneed to also pass \n--fork=path/to/your/fork\n (using OS-standard filepath structure),\nwhere \npath/to/your/fork\n \nmust\n be within \n$GOPATH/src\n, and you are working from a branch\ncalled \nponzu-dev\n. \n\n\nFor example: \n\n\n# ($GOPATH/src is implied in the fork path, do not add it yourself)\n\n$ ponzu new --dev --fork\n=\ngithub.com/nilslice/ponzu /path/to/new/project",
+ "title": "General Usage"
+ },
+ {
+ "location": "/CLI/General-Usage/#commands",
+ "text": "",
+ "title": "Commands"
+ },
+ {
+ "location": "/CLI/General-Usage/#new",
+ "text": "Creates a project directory of the name supplied as a parameter immediately\nfollowing the 'new' option in the $GOPATH/src directory. Note: 'new' depends on \nthe program 'git' and possibly a network connection. If there is no local \nrepository to clone from at the local machine's $GOPATH, 'new' will attempt to \nclone the 'github.com/ponzu-cms/ponzu' package from over the network. Example: $ ponzu new github.com/nilslice/proj New ponzu project created at $GOPATH /src/github.com/nilslice/proj",
+ "title": "new"
+ },
+ {
+ "location": "/CLI/General-Usage/#generate-gen-g",
+ "text": "Generate boilerplate code for various Ponzu components, such as content . Example: generator struct fields and built-in types...\n | | \n v v \n$ ponzu gen content review title: string body: string :richtext rating: int \n ^ ^\n | | \n struct type ( optional ) input view specifier The command above will generate the file content/review.go with boilerplate\nmethods, as well as struct definition, and corresponding field tags like: type Review struct { \n item . Item \n\n Title string `json: title ` \n Body string `json: body ` \n Rating int `json: rating ` \n Tags [] string `json: tags ` } The generate command will intelligently parse more sophisticated field names\nsuch as 'field_name' and convert it to 'FieldName' and vice versa, only where \nappropriate as per common Go idioms. Errors will be reported, but successful \ngenerate commands return nothing. Input View Specifiers (optional) The CLI can optionally parse a third parameter on the fields provided to generate \nthe type of HTML view an editor field is presented within. If no third parameter\nis added, a plain text HTML input will be generated. In the example above, the \nargument shown as body:string:richtext would show the Richtext input instead\nof a plain text HTML input (as shown in the screenshot). The following input\nview specifiers are implemented: CLI parameter Generates checkbox editor.Checkbox() custom generates a pre-styled empty div to fill with HTML file editor.File() hidden editor.Input() + uses type=hidden input, text editor.Input() richtext editor.Richtext() select editor.Select() textarea editor.Textarea() tags editor.Tags() Generate Content References It's also possible to generate all of the code needed to create references between\nyour content types. The syntax to do so is below, but refer to the documentation \nfor more details: $ ponzu gen c author name:string genre:string:select\n$ ponzu gen c book title:string author:@author,name,genre The commands above will generate a Book Content type with a reference to an Author item, by also generating a reference.Select \nas the view for the author field.",
+ "title": "generate, gen, g"
+ },
+ {
+ "location": "/CLI/General-Usage/#build",
+ "text": "From within your Ponzu project directory, running build will copy and move \nthe necessary files from your workspace into the vendored directory, and \nwill build/compile the project to then be run. Optional flags:\n- --gocmd sets the binary used when executing go build within ponzu build step Example: $ ponzu build ( or ) \n$ ponzu build --gocmd = go1.8rc1 # useful for testing Errors will be reported, but successful build commands return nothing.",
+ "title": "build"
+ },
+ {
+ "location": "/CLI/General-Usage/#run",
+ "text": "Starts the HTTP server for the JSON API, Admin System, or both.\nThe segments, separated by a comma, describe which services to start, either \n'admin' (Admin System / CMS backend) or 'api' (JSON API), and, optionally, \nif the server should utilize TLS encryption - served over HTTPS, which is\nautomatically managed using Let's Encrypt (https://letsencrypt.org) Optional flags:\n- --port sets the port on which the server listens for HTTP requests [defaults to 8080]\n- --https-port sets the port on which the server listens for HTTPS requests [defaults to 443]\n- --https enables auto HTTPS management via Let's Encrypt (port is always 443)\n- --dev-https generates self-signed SSL certificates for development-only (port is 10443) Example: $ ponzu run ( or ) \n$ ponzu run --port = 8080 --https admin,api ( or ) \n$ ponzu run admin ( or ) \n$ ponzu run --port = 8888 api ( or ) \n$ ponzu --dev-https run Defaults to $ ponzu run --port=8080 admin,api (running Admin API on port 8080, without TLS) Note: \nAdmin and API cannot run on separate processes unless you use a copy of the\ndatabase, since the first process to open it receives a lock. If you intend\nto run the Admin and API on separate processes, you must call them with the\n'ponzu' command independently.",
+ "title": "run"
+ },
+ {
+ "location": "/CLI/General-Usage/#upgrade",
+ "text": "Will backup your own custom project code (like content, addons, uploads, etc) so\nwe can safely re-clone Ponzu from the latest version you have or from the network \nif necessary. Before running $ ponzu upgrade , you should update the ponzu \npackage by running $ go get -u github.com/ponzu-cms/ponzu/... Example: $ ponzu upgrade",
+ "title": "upgrade"
+ },
+ {
+ "location": "/CLI/General-Usage/#add-a",
+ "text": "Downloads an addon to GOPATH/src and copies it to the current Ponzu project's /addons directory. Example: $ ponzu add github.com/bosssauce/fbscheduler Errors will be reported, but successful add commands return nothing.",
+ "title": "add, a"
+ },
+ {
+ "location": "/CLI/General-Usage/#version-v",
+ "text": "Prints the version of Ponzu your project is using. Must be called from within a \nPonzu project directory. By passing the --cli flag, the version command will \nprint the version of the Ponzu CLI you have installed. Example: $ ponzu version\nPonzu v0.8.2 # (or) \n$ ponzu version --cli\nPonzu v0.9.2",
+ "title": "version, v"
+ },
+ {
+ "location": "/CLI/General-Usage/#contributing",
+ "text": "Checkout branch ponzu-dev Make code changes Test changes to ponzu-dev branch make a commit to ponzu-dev to manually test, you will need to use a new copy (ponzu new path/to/code), \nbut pass the --dev flag so that ponzu generates a new copy from the ponzu-dev \nbranch, not master by default (i.e. $ponzu new --dev /path/to/code ) build and run with $ ponzu build and $ ponzu run To add back to master: first push to origin ponzu-dev create a pull request will then be merged into master A typical contribution workflow might look like: # clone the repository and checkout ponzu-dev \n$ git clone https://github.com/ponzu-cms/ponzu path/to/local/ponzu # (or your fork) \n$ git checkout ponzu-dev # install ponzu with go get or from your own local path \n$ go get github.com/ponzu-cms/ponzu/... # or \n$ cd /path/to/local/ponzu \n$ go install ./... # edit files, add features, etc \n$ git add -A\n$ git commit -m edited files, added features, etc # now you need to test the feature.. make a new ponzu project, but pass --dev flag \n$ ponzu --dev new /path/to/new/project # will create $GOPATH/src/path/to/new/project # build run ponzu from the new project directory \n$ cd /path/to/new/project\n$ ponzu build ponzu run # push to your origin:ponzu-dev branch and create a PR at ponzu-cms/ponzu \n$ git push origin ponzu-dev # ... go to https://github.com/ponzu-cms/ponzu and create a PR Note: if you intend to work on your own fork and contribute from it, you will\nneed to also pass --fork=path/to/your/fork (using OS-standard filepath structure),\nwhere path/to/your/fork must be within $GOPATH/src , and you are working from a branch\ncalled ponzu-dev . For example: # ($GOPATH/src is implied in the fork path, do not add it yourself) \n$ ponzu new --dev --fork = github.com/nilslice/ponzu /path/to/new/project",
+ "title": "Contributing"
+ },
+ {
+ "location": "/CLI/Generating-References/",
+ "text": "In Ponzu, users make connections between Content types using references. In order \nto use the CLI to generate these references, a slightly different syntax is required. \nIn all cases, the Content type you wish to reference does not need to exist prior\nto the \"parent\" type referencing it at generate-time, but in the following examples,\nthe referenced \"child\" type will be shown before the parent type for clarity.\n\n\nSyntax\n\n\n@\n\n\nThe \n@\n symbol is used to declare that the following name is a reference. The \nCLI will take care to parse the name and treat it as a Content type to which the \ncurrent type refers.\n\n\n[]\n\n\nThe \n[]\n, which if used, is always in front of the \n@\n symbol. It signifies \nthat the reference type is a slice or a collection of references. When \n[]\n\nis used, the CLI will automatically generate a \nreference.SelectRepeater()\n view \nfor you.\n\n\n,arg1,arg2,argN\n\n\nImmediately following the reference name (after the @ symbol), users may optionally\npass arguments to specify how the reference is displayed in the parent type's\neditor. References are included in the parent types editor as a dropdown menu, with\neach possible reference as an option. These arguments define what goes inside the\n\noption\n/option\n text node, as would be seen by an Admin.\n\n\nThe arguments must be valid JSON struct tag names from the reference type's fields. \nNotice in the example below, the \ntitle\n and \nprice\n are formatted exactly as they \nwere in the generate command for the \nproduct\n type.\n\n\n\n\n\n\nExample\n\n\n$ ponzu gen content product title:string price:int description:string:textarea\n$ ponzu gen content catalog year:int products:\n[]@product\n,title,price\n\n\n\n\n\nThe commands above output the following. For demonstration, we will omit the full\ncode generated for the \nProduct\n, since the reference is in the \nCatalog\n type.\n\n\n// content/product.go\n\n\npackage\n \ncontent\n\n\n...\n\n\n\ntype\n \nProduct\n \nstruct\n \n{\n\n \nitem\n.\nItem\n\n\n \nTitle\n \nstring\n \n`json:\ntitle\n`\n\n \nPrice\n \nint\n \n`json:\nprice\n`\n\n \nDescription\n \nstring\n \n`json:\ndescription\n`\n\n\n}\n\n\n\n...\n\n\n\n\n\n\npackage\n \ncontent\n\n\n\nimport\n \n(\n\n \nfmt\n\n\n \ngithub.com/bosssauce/reference\n\n\n \ngithub.com/ponzu-cms/ponzu/management/editor\n\n \ngithub.com/ponzu-cms/ponzu/system/item\n\n\n)\n\n\n\ntype\n \nCatalog\n \nstruct\n \n{\n\n \nitem\n.\nItem\n\n\n \nYear\n \nint\n \n`json:\nyear\n`\n\n \n// all references are stored as []string or string types\n\n \nProducts\n \n[]\nstring\n \n`json:\nproducts\n`\n \n\n}\n\n\n\nfunc\n \n(\nc\n \n*\nCatalog\n)\n \nMarshalEditor\n()\n \n([]\nbyte\n,\n \nerror\n)\n \n{\n\n \nview\n,\n \nerr\n \n:=\n \neditor\n.\nForm\n(\nc\n,\n\n \neditor\n.\nField\n{\n\n \nView\n:\n \neditor\n.\nInput\n(\nYear\n,\n \nc\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nYear\n,\n\n \ntype\n:\n \ntext\n,\n\n \nplaceholder\n:\n \nEnter the Year here\n,\n\n \n}),\n\n \n},\n\n \neditor\n.\nField\n{\n\n \n// reference.SelectRepeater since []@product was used\n\n \nView\n:\n \nreference\n.\nSelectRepeater\n(\nProducts\n,\n \nc\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nProducts\n,\n\n \n},\n\n \nProduct\n,\n \n// generated from @product\n\n \n`{{ .title }} {{ .price }} `\n,\n \n// generated from ,title,price args\n\n \n),\n\n \n},\n\n \n)\n\n\n \nif\n \nerr\n \n!=\n \nnil\n \n{\n\n \nreturn\n \nnil\n,\n \nfmt\n.\nErrorf\n(\nFailed to render Catalog editor view: %s\n,\n \nerr\n.\nError\n())\n\n \n}\n\n\n \nreturn\n \nview\n,\n \nnil\n\n\n}\n\n\n\nfunc\n \ninit\n()\n \n{\n\n \nitem\n.\nTypes\n[\nCatalog\n]\n \n=\n \nfunc\n()\n \ninterface\n{}\n \n{\n \nreturn\n \nnew\n(\nCatalog\n)\n \n}\n\n\n}\n\n\n\n\n\n\nNote:\n\nIf the reference should be only a single item, rather than a slice (or collection)\nof items, omit the \n[]\n, changing the command to:\n\n\n$ ponzu gen content catalog year:int product:@product,title,price",
+ "title": "Generating References"
+ },
+ {
+ "location": "/CLI/Generating-References/#syntax",
+ "text": "",
+ "title": "Syntax"
+ },
+ {
+ "location": "/CLI/Generating-References/#_1",
+ "text": "The @ symbol is used to declare that the following name is a reference. The \nCLI will take care to parse the name and treat it as a Content type to which the \ncurrent type refers.",
+ "title": "@"
+ },
+ {
+ "location": "/CLI/Generating-References/#_2",
+ "text": "The [] , which if used, is always in front of the @ symbol. It signifies \nthat the reference type is a slice or a collection of references. When [] \nis used, the CLI will automatically generate a reference.SelectRepeater() view \nfor you.",
+ "title": "[]"
+ },
+ {
+ "location": "/CLI/Generating-References/#arg1arg2argn",
+ "text": "Immediately following the reference name (after the @ symbol), users may optionally\npass arguments to specify how the reference is displayed in the parent type's\neditor. References are included in the parent types editor as a dropdown menu, with\neach possible reference as an option. These arguments define what goes inside the option /option text node, as would be seen by an Admin. The arguments must be valid JSON struct tag names from the reference type's fields. \nNotice in the example below, the title and price are formatted exactly as they \nwere in the generate command for the product type.",
+ "title": ",arg1,arg2,argN"
+ },
+ {
+ "location": "/CLI/Generating-References/#example",
+ "text": "$ ponzu gen content product title:string price:int description:string:textarea\n$ ponzu gen content catalog year:int products: []@product ,title,price The commands above output the following. For demonstration, we will omit the full\ncode generated for the Product , since the reference is in the Catalog type. // content/product.go package content ... type Product struct { \n item . Item \n\n Title string `json: title ` \n Price int `json: price ` \n Description string `json: description ` } ... package content import ( \n fmt \n\n github.com/bosssauce/reference \n\n github.com/ponzu-cms/ponzu/management/editor \n github.com/ponzu-cms/ponzu/system/item ) type Catalog struct { \n item . Item \n\n Year int `json: year ` \n // all references are stored as []string or string types \n Products [] string `json: products ` } func ( c * Catalog ) MarshalEditor () ([] byte , error ) { \n view , err := editor . Form ( c , \n editor . Field { \n View : editor . Input ( Year , c , map [ string ] string { \n label : Year , \n type : text , \n placeholder : Enter the Year here , \n }), \n }, \n editor . Field { \n // reference.SelectRepeater since []@product was used \n View : reference . SelectRepeater ( Products , c , map [ string ] string { \n label : Products , \n }, \n Product , // generated from @product \n `{{ .title }} {{ .price }} ` , // generated from ,title,price args \n ), \n }, \n ) \n\n if err != nil { \n return nil , fmt . Errorf ( Failed to render Catalog editor view: %s , err . Error ()) \n } \n\n return view , nil } func init () { \n item . Types [ Catalog ] = func () interface {} { return new ( Catalog ) } } Note: \nIf the reference should be only a single item, rather than a slice (or collection)\nof items, omit the [] , changing the command to: $ ponzu gen content catalog year:int product:@product,title,price",
+ "title": "Example"
+ },
+ {
+ "location": "/Content/An-Overview/",
+ "text": "Nearly everything you work on in Ponzu is inside content files on the content types you create. These types must all reside in the \ncontent\n package and are the fundamental core of your CMS. In order for Content types to be rendered and managed by the CMS, they must implement the \neditor.Editable\n interface, and add their own \ninterface{}\n container to the global \nitem.Types\n map. \n\n\nSound like a lot? Don't worry, all of this can be done for you by using the code-generating command line tools that come with Ponzu.\n\n\nIt is rare to hand-write a new Content type, and should be generated instead!\n\n\nGenerating Content types\n\n\nTo generate content types and boilerplate code, use the Ponzu CLI \ngenerate\n command as such:\n\n\n$ ponzu generate content post title:string body:string:richtext author:string\n\n\n\n\n\nThe command above will create a file at \ncontent/post.go\n and will generate the following code:\n\n\npackage\n \ncontent\n\n\n\nimport\n \n(\n\n \nfmt\n\n\n \ngithub.com/ponzu-cms/ponzu/management/editor\n\n \ngithub.com/ponzu-cms/ponzu/system/item\n\n\n)\n\n\n\ntype\n \nPost\n \nstruct\n \n{\n\n \nitem\n.\nItem\n\n\n \nTitle\n \nstring\n \n`json:\ntitle\n`\n\n \nBody\n \nstring\n \n`json:\nbody\n`\n\n \nAuthor\n \nstring\n \n`json:\nauthor\n`\n\n\n}\n\n\n\n// MarshalEditor writes a buffer of html to edit a Post within the CMS\n\n\n// and implements editor.Editable\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nMarshalEditor\n()\n \n([]\nbyte\n,\n \nerror\n)\n \n{\n\n \nview\n,\n \nerr\n \n:=\n \neditor\n.\nForm\n(\np\n,\n\n \n// Take note that the first argument to these Input-like functions\n\n \n// is the string version of each Post field, and must follow\n\n \n// this pattern for auto-decoding and auto-encoding reasons:\n\n \neditor\n.\nField\n{\n\n \nView\n:\n \neditor\n.\nInput\n(\nTitle\n,\n \np\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nTitle\n,\n\n \ntype\n:\n \ntext\n,\n\n \nplaceholder\n:\n \nEnter the Title here\n,\n\n \n}),\n\n \n},\n\n \neditor\n.\nField\n{\n\n \nView\n:\n \neditor\n.\nRichtext\n(\nBody\n,\n \np\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nBody\n,\n\n \nplaceholder\n:\n \nEnter the Body here\n,\n\n \n}),\n\n \n},\n\n \neditor\n.\nField\n{\n\n \nView\n:\n \neditor\n.\nInput\n(\nAuthor\n,\n \np\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nAuthor\n,\n\n \ntype\n:\n \ntext\n,\n\n \nplaceholder\n:\n \nEnter the Author here\n,\n\n \n}),\n\n \n},\n\n \n)\n\n\n \nif\n \nerr\n \n!=\n \nnil\n \n{\n\n \nreturn\n \nnil\n,\n \nfmt\n.\nErrorf\n(\nFailed to render Post editor view: %s\n,\n \nerr\n.\nError\n())\n\n \n}\n\n\n \nreturn\n \nview\n,\n \nnil\n\n\n}\n\n\n\nfunc\n \ninit\n()\n \n{\n\n \nitem\n.\nTypes\n[\nPost\n]\n \n=\n \nfunc\n()\n \ninterface\n{}\n \n{\n \nreturn\n \nnew\n(\nPost\n)\n \n}\n\n\n}\n\n\n\n\n\n\nThe code above is the baseline amount required to manage content for the \nPost\n type from within the CMS. See \nExtending Content\n for information about how to add more functionality to your Content types. \n\n\nAll content managed by the CMS and exposed via the API is considered an \"item\", and thus should embed the \nitem.Item\n type. There are many benefits to this, such as becoming automatically sortable by time, and being given default methods that are useful inside and out of the CMS. All content types that are created by the \ngenerate\n command via Ponzu CLI will embed Item. \n\n\nRelated packages\n\n\nThe \nitem\n package has a number of useful interfaces, which make it simple to add functionality to all content types and other types that embed Item. \n\n\nThe \neditor\n package has the Editable interface, which allows types to create an editor for their fields within the CMS. Additionally, there is a helper function \neditor.Form\n which simplifies defining the editor's input layout and input types using \neditor.Input\n and various other functions to make HTML input elements like Select, Checkbox, Richtext, Textarea and more.\n\n\nThe \napi\n package has interfaces including \napi.Createable\n and \napi.Mergeable\n which make it trivial to accept and approve or reject content submitted from 3rd parties (POST from HTML forms, mobile clients, etc).",
+ "title": "An Overview"
+ },
+ {
+ "location": "/Content/An-Overview/#generating-content-types",
+ "text": "To generate content types and boilerplate code, use the Ponzu CLI generate command as such: $ ponzu generate content post title:string body:string:richtext author:string The command above will create a file at content/post.go and will generate the following code: package content import ( \n fmt \n\n github.com/ponzu-cms/ponzu/management/editor \n github.com/ponzu-cms/ponzu/system/item ) type Post struct { \n item . Item \n\n Title string `json: title ` \n Body string `json: body ` \n Author string `json: author ` } // MarshalEditor writes a buffer of html to edit a Post within the CMS // and implements editor.Editable func ( p * Post ) MarshalEditor () ([] byte , error ) { \n view , err := editor . Form ( p , \n // Take note that the first argument to these Input-like functions \n // is the string version of each Post field, and must follow \n // this pattern for auto-decoding and auto-encoding reasons: \n editor . Field { \n View : editor . Input ( Title , p , map [ string ] string { \n label : Title , \n type : text , \n placeholder : Enter the Title here , \n }), \n }, \n editor . Field { \n View : editor . Richtext ( Body , p , map [ string ] string { \n label : Body , \n placeholder : Enter the Body here , \n }), \n }, \n editor . Field { \n View : editor . Input ( Author , p , map [ string ] string { \n label : Author , \n type : text , \n placeholder : Enter the Author here , \n }), \n }, \n ) \n\n if err != nil { \n return nil , fmt . Errorf ( Failed to render Post editor view: %s , err . Error ()) \n } \n\n return view , nil } func init () { \n item . Types [ Post ] = func () interface {} { return new ( Post ) } } The code above is the baseline amount required to manage content for the Post type from within the CMS. See Extending Content for information about how to add more functionality to your Content types. All content managed by the CMS and exposed via the API is considered an \"item\", and thus should embed the item.Item type. There are many benefits to this, such as becoming automatically sortable by time, and being given default methods that are useful inside and out of the CMS. All content types that are created by the generate command via Ponzu CLI will embed Item.",
+ "title": "Generating Content types"
+ },
+ {
+ "location": "/Content/An-Overview/#related-packages",
+ "text": "The item package has a number of useful interfaces, which make it simple to add functionality to all content types and other types that embed Item. The editor package has the Editable interface, which allows types to create an editor for their fields within the CMS. Additionally, there is a helper function editor.Form which simplifies defining the editor's input layout and input types using editor.Input and various other functions to make HTML input elements like Select, Checkbox, Richtext, Textarea and more. The api package has interfaces including api.Createable and api.Mergeable which make it trivial to accept and approve or reject content submitted from 3rd parties (POST from HTML forms, mobile clients, etc).",
+ "title": "Related packages"
+ },
+ {
+ "location": "/Content/Extending-Content/",
+ "text": "Extending your Content types with more features and functionality within the system\nis done by implementing the various built-in interfaces provided by Ponzu. To learn \nmore about interfaces, see \nA Tour of Go - Interfaces\n.\n\n\nIt is also common to add more advanced functionality to Content types using Addons. Refer to the \nAddon documentation\n for more information about how to use and create Ponzu Addons.\n\n\nItem Interfaces\n\n\nAll Content types which embed an \nitem.Item\n will implicitly \nimplement\n its many\ninterfaces. In Ponzu, the following interfaces are exported from the \nsystem/item\n\npackage and have a default implementation which can be overridden to change your\ncontent types' functionality within the system.\n\n\n\n\nitem.Pushable\n\n\nitem.Hideable\n\n\nitem.Omittable\n\n\nitem.Hookable\n\n\nitem.Identifiable\n\n\nitem.Sortable\n\n\nitem.Sluggable\n\n\n\n\nAPI Interfaces\n\n\nTo enable 3rd-party clients to interact with your Content types, you can extend your types with the API interfaces:\n\n\n\n\napi.Createable\n\n\napi.Updateable\n\n\napi.Deleteable\n\n\napi.Trustable\n\n\n\n\nEditor Interfaces\n\n\nTo manage how content is edited and handled in the CMS, use the following Editor interfaces:\n\n\n\n\neditor.Editable\n\n\neditor.Mergeable\n\n\n\n\nSearch Interfaces\n\n\nTo enable and customize full-text search on your content types, use the following interfaces:\n\n\n\n\nsearch.Searchable",
+ "title": "Extending Content"
+ },
+ {
+ "location": "/Content/Extending-Content/#item-interfaces",
+ "text": "All Content types which embed an item.Item will implicitly implement its many\ninterfaces. In Ponzu, the following interfaces are exported from the system/item \npackage and have a default implementation which can be overridden to change your\ncontent types' functionality within the system. item.Pushable item.Hideable item.Omittable item.Hookable item.Identifiable item.Sortable item.Sluggable",
+ "title": "Item Interfaces"
+ },
+ {
+ "location": "/Content/Extending-Content/#api-interfaces",
+ "text": "To enable 3rd-party clients to interact with your Content types, you can extend your types with the API interfaces: api.Createable api.Updateable api.Deleteable api.Trustable",
+ "title": "API Interfaces"
+ },
+ {
+ "location": "/Content/Extending-Content/#editor-interfaces",
+ "text": "To manage how content is edited and handled in the CMS, use the following Editor interfaces: editor.Editable editor.Mergeable",
+ "title": "Editor Interfaces"
+ },
+ {
+ "location": "/Content/Extending-Content/#search-interfaces",
+ "text": "To enable and customize full-text search on your content types, use the following interfaces: search.Searchable",
+ "title": "Search Interfaces"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/",
+ "text": "Ponzu provides a number of helpful HTML Inputs to create forms which CMS admins\nuse to manage content. The input functions are typically used inside a Content\ntype's \nMarshalEditor()\n func from within an \neditor.Form()\n - for example:\n\n\n// MarshalEditor writes a buffer of html to edit a Post within the CMS\n\n\n// and implements editor.Editable\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nMarshalEditor\n()\n \n([]\nbyte\n,\n \nerror\n)\n \n{\n\n \nview\n,\n \nerr\n \n:=\n \neditor\n.\nForm\n(\np\n,\n\n \neditor\n.\nField\n{\n \n// \n- editor.Fields contain input-like funcs\n\n \nView\n:\n \neditor\n.\nInput\n(\nTitle\n,\n \np\n,\n \nmap\n[\nstring\n]\nstring\n{\n \n// \n- makes a text input\n\n \nlabel\n:\n \nTitle\n,\n\n \ntype\n:\n \ntext\n,\n\n \nplaceholder\n:\n \nEnter the Title here\n,\n\n \n}),\n\n \n},\n\n \neditor\n.\nField\n{\n\n \nView\n:\n \neditor\n.\nRichtext\n(\nBody\n,\n \np\n,\n \nmap\n[\nstring\n]\nstring\n{\n \n// \n- makes a WYSIWIG editor\n\n \nlabel\n:\n \nBody\n,\n\n \nplaceholder\n:\n \nEnter the Body here\n,\n\n \n}),\n\n \n},\n\n \neditor\n.\nField\n{\n\n \nView\n:\n \neditor\n.\nInput\n(\nAuthor\n,\n \np\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nAuthor\n,\n\n \ntype\n:\n \ntext\n,\n\n \nplaceholder\n:\n \nEnter the Author here\n,\n\n \n}),\n\n \n},\n\n \n)\n\n\n \nif\n \nerr\n \n!=\n \nnil\n \n{\n\n \nreturn\n \nnil\n,\n \nfmt\n.\nErrorf\n(\nFailed to render Post editor view: %s\n,\n \nerr\n.\nError\n())\n\n \n}\n\n\n \nreturn\n \nview\n,\n \nnil\n\n\n}\n\n\n\n\n\n\n\n\nField Input Functions\n\n\nThere are many of these input-like HTML view funcs exported from Ponzu's\n\nmanagement/editor\n package. Below is a list of the built-in options:\n\n\neditor.Input\n\n\nThe \neditor.Input\n function produces a standard text input.\n\n\nScreenshot\n\n\n\n\nFunction Signature\n\n\nInput\n(\nfieldName\n \nstring\n,\n \np\n \ninterface\n{},\n \nattrs\n,\n \noptions\n \nmap\n[\nstring\n]\nstring\n)\n \n[]\nbyte\n\n\n\n\n\n\nExample\n\n\n...\n\n\neditor\n.\nField\n{\n\n \nView\n:\n \neditor\n.\nInput\n(\nTitle\n,\n \ns\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nTitle\n,\n\n \ntype\n:\n \ntext\n,\n\n \nplaceholder\n:\n \nEnter the Title here\n,\n\n \n}),\n\n\n},\n\n\n...\n\n\n\n\n\n\n\n\neditor.InputRepeater\n\n\nThe \neditor.InputRepeater\n function applies a controller UI to the \neditor.Input\n \nview so any arbitrary number of inputs can be added for your field.\n\n\n\n\nUsing Repeaters\n\n\nWhen using the \neditor.InputRepeater\n make sure it's corresponding field is a \nslice \n[]T\n\ntype. You will experience errors if it is not.\n\n\n\n\nScreenshot\n\n\n\n\nFunction Signature\n\n\nInputRepeater\n(\nfieldName\n \nstring\n,\n \np\n \ninterface\n{},\n \nattrs\n,\n \noptions\n \nmap\n[\nstring\n]\nstring\n)\n \n[]\nbyte\n\n\n\n\n\n\nExample\n\n\n...\n\n\neditor\n.\nField\n{\n\n \nView\n:\n \neditor\n.\nInputRepeater\n(\nTitle\n,\n \ns\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nTitles\n,\n\n \ntype\n:\n \ntext\n,\n\n \nplaceholder\n:\n \nEnter the Title here\n,\n\n \n}),\n\n\n},\n\n\n...\n\n\n\n\n\n\n\n\neditor.Checkbox\n\n\nThe \neditor.Checkbox\n function returns any number of checkboxes in a collection,\ndefined by the value:name map of options.\n\n\nScreenshot\n\n\n\n\nFunction Signature\n\n\nCheckbox\n(\nfieldName\n \nstring\n,\n \np\n \ninterface\n{},\n \nattrs\n,\n \noptions\n \nmap\n[\nstring\n]\nstring\n)\n \n[]\nbyte\n\n\n\n\n\n\nExample\n\n\n...\n\n\neditor\n.\nField\n{\n\n \nView\n:\n \neditor\n.\nCheckbox\n(\nOptions\n,\n \ns\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nOptions\n,\n\n \n},\n \nmap\n[\nstring\n]\nstring\n{\n\n \n// \nvalue\n: \nDisplay Name\n,\n\n \n1\n:\n \nFirst\n,\n\n \n2\n:\n \nSecond\n,\n\n \n3\n:\n \nThird\n,\n\n \n}),\n\n\n},\n\n\n...\n\n\n\n\n\n\n\n\neditor.Richtext\n\n\nThe \neditor.Richetext\n function displays an HTML5 rich text / WYSYWIG editor which\nsupports text formatting and styling, images, quotes, arbitrary HTML, and more. \n\n\nThe rich text editor is a modified version of \nSummernote\n \nusing a theme called \nMaterialNote\n\n\nScreenshot\n\n\n\n\nFunction Signature\n\n\nRichtext\n(\nfieldName\n \nstring\n,\n \np\n \ninterface\n{},\n \nattrs\n \nmap\n[\nstring\n]\nstring\n)\n \n[]\nbyte\n\n\n\n\n\n\nExample\n\n\n...\n\n\neditor\n.\nField\n{\n\n \nView\n:\n \neditor\n.\nRichtext\n(\nOpinion\n,\n \ns\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nRich Text Editor\n,\n\n \nplaceholder\n:\n \nEnter the Opinion here\n,\n\n \n}),\n\n\n},\n\n\n...\n\n\n\n\n\n\n\n\neditor.Tags\n\n\nThe \neditor.Tags\n function returns a container input element for lists of arbitrary\nbits of information.\n\n\nScreenshot\n\n\n\n\nFunction Signature\n\n\nTags\n(\nfieldName\n \nstring\n,\n \np\n \ninterface\n{},\n \nattrs\n \nmap\n[\nstring\n]\nstring\n)\n \n[]\nbyte\n\n\n\n\n\n\nExample\n\n\n...\n\n\neditor\n.\nField\n{\n\n \nView\n:\n \neditor\n.\nTags\n(\nCategory\n,\n \ns\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nTags\n,\n\n \nplaceholder\n:\n \n+Category\n,\n\n \n}),\n\n\n},\n\n\n...\n\n\n\n\n\n\n\n\neditor.File\n\n\nThe \neditor.File\n function returns an HTML file upload element, which saves files\ninto the \n/uploads\n directory, and can be viewed from the \"Uploads\" section in the\nAdmin dashboard. See also the \nFile Metadata API\n.\n\n\n\n\nField Type\n\n\nWhen using the \neditor.File\n function, its corresponding field type must be\na \nstring\n, as files will be stored as URL paths in the database. \n\n\n\n\nScreenshot\n\n\n\n\nFunction Signature\n\n\nFile\n(\nfieldName\n \nstring\n,\n \np\n \ninterface\n{},\n \nattrs\n \nmap\n[\nstring\n]\nstring\n)\n \n[]\nbyte\n\n\n\n\n\n\nExample\n\n\n...\n\n\neditor\n.\nField\n{\n\n \nView\n:\n \neditor\n.\nFile\n(\nPhoto\n,\n \ns\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nFile Upload\n,\n\n \nplaceholder\n:\n \nUpload the Photo here\n,\n\n \n}),\n\n\n},\n\n\n...\n\n\n\n\n\n\n\n\neditor.FileRepeater\n\n\nThe \neditor.FileRepeater\n function applies a controller UI to the \neditor.File\n \nview so any arbitrary number of uploads can be added for your field.\n\n\n\n\nUsing Repeaters\n\n\nWhen using the \neditor.FileRepeater\n make sure it's corresponding field is a \nslice \n[]string\n\ntype. You will experience errors if it is not.\n\n\n\n\nScreenshot\n\n\n\n\nFunction Signature\n\n\nFileRepeater\n(\nfieldName\n \nstring\n,\n \np\n \ninterface\n{},\n \nattrs\n \nmap\n[\nstring\n]\nstring\n)\n \n[]\nbyte\n\n\n\n\n\n\nExample\n\n\n...\n\n\neditor\n.\nField\n{\n\n \nView\n:\n \neditor\n.\nFileRepeater\n(\nPhoto\n,\n \ns\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nFile Upload Repeater\n,\n\n \nplaceholder\n:\n \nUpload the Photo here\n,\n\n \n}),\n\n\n},\n\n\n...\n\n\n\n\n\n\n\n\neditor.Select\n\n\nThe \neditor.Select\n function returns a single HTML select input with options\nas defined in the \noptions map[string]string\n parameter of the function call.\n\n\nScreenshot\n\n\n\n\nFunction Signature\n\n\nfunc\n \nSelect\n(\nfieldName\n \nstring\n,\n \np\n \ninterface\n{},\n \nattrs\n,\n \noptions\n \nmap\n[\nstring\n]\nstring\n)\n \n[]\nbyte\n\n\n\n\n\n\nExample\n\n\n...\n\n\neditor\n.\nField\n{\n\n \nView\n:\n \neditor\n.\nSelect\n(\nRating\n,\n \ns\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nSelect Dropdown\n,\n\n \n},\n \nmap\n[\nstring\n]\nstring\n{\n\n \n// \nvalue\n: \nDisplay Name\n,\n\n \nG\n:\n \nG\n,\n\n \nPG\n:\n \nPG\n,\n\n \nPG-13\n:\n \nPG-13\n,\n\n \nR\n:\n \nR\n,\n\n \n}),\n\n\n},\n\n\n...\n\n\n\n\n\n\n\n\neditor.SelectRepeater\n\n\nThe \neditor.SelectRepeater\n function applies a controller UI to the \neditor.Select\n \nview so any arbitrary number of dropdowns can be added for your field.\n\n\nScreenshot\n\n\n\n\nFunction Signature\n\n\nfunc\n \nSelectRepeater\n(\nfieldName\n \nstring\n,\n \np\n \ninterface\n{},\n \nattrs\n,\n \noptions\n \nmap\n[\nstring\n]\nstring\n)\n \n[]\nbyte\n\n\n\n\n\n\nExample\n\n\n...\n\n\neditor\n.\nField\n{\n\n \nView\n:\n \neditor\n.\nSelectRepeater\n(\nRating\n,\n \ns\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nSelect Dropdown Repeater\n,\n\n \n},\n \nmap\n[\nstring\n]\nstring\n{\n\n \n// \nvalue\n: \nDisplay Name\n,\n\n \nG\n:\n \nG\n,\n\n \nPG\n:\n \nPG\n,\n\n \nPG-13\n:\n \nPG-13\n,\n\n \nR\n:\n \nR\n,\n\n \n}),\n\n\n},\n\n\n...\n\n\n\n\n\n\n\n\neditor.Textarea\n\n\nThe \neditor.Textarea\n function returns an HTML textarea input to add unstyled text\nblocks. Newlines in the textarea are preserved.\n\n\nScreenshot\n\n\n\n\nFunction Signature\n\n\nTextarea\n(\nfieldName\n \nstring\n,\n \np\n \ninterface\n{},\n \nattrs\n \nmap\n[\nstring\n]\nstring\n)\n \n[]\nbyte\n\n\n\n\n\n\nExample\n\n\n...\n\n\neditor\n.\nField\n{\n\n \nView\n:\n \neditor\n.\nTextarea\n(\nReadme\n,\n \ns\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nTextarea\n,\n\n \nplaceholder\n:\n \nEnter the Readme here\n,\n\n \n}),\n\n\n},\n\n\n...\n\n\n\n\n\n\n\n\nData References\n\n\nIt is common to want to keep a reference from one Content type to another. To do\nthis in Ponzu, use the \nbosssauce/reference\n \npackage. It comes pre-installed with Ponzu as an \n\"Addon\"\n.\n\n\nreference.Select\n\n\nScreenshot\n\n\n\n\nFunction Signature\n\n\nfunc\n \nSelect\n(\nfieldName\n \nstring\n,\n \np\n \ninterface\n{},\n \nattrs\n \nmap\n[\nstring\n]\nstring\n,\n \ncontentType\n,\n \ntmplString\n \nstring\n)\n \n[]\nbyte\n\n\n\n\n\n\nExample\n\n\n...\n\n\neditor\n.\nField\n{\n\n \nView\n:\n \nreference\n.\nSelect\n(\nDirectedBy\n,\n \ns\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nSelect Dropdown\n,\n\n \n},\n \nDirector\n,\n \n`{{.last-name}}, {{.first_name}}`\n),\n\n\n},\n\n\n...\n\n\n\n\n\n\n\n\nreference.SelectRepeater\n\n\nScreenshot\n\n\n\n\nFunction Signature\n\n\nfunc\n \nSelectRepeater\n(\nfieldName\n \nstring\n,\n \np\n \ninterface\n{},\n \nattrs\n \nmap\n[\nstring\n]\nstring\n,\n \ncontentType\n,\n \ntmplString\n \nstring\n)\n \n[]\nbyte\n\n\n\n\n\n\nExample\n\n\n...\n\n\neditor\n.\nField\n{\n\n \nView\n:\n \nreference\n.\nSelectRepeater\n(\nPlacesFilmed\n,\n \ns\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nSelect Dropdown Repeater\n,\n\n \n},\n \nLocation\n,\n \n`{{.name}}, {{.region}}`\n),\n\n\n},\n\n\n...",
+ "title": "HTML Inputs"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#field-input-functions",
+ "text": "There are many of these input-like HTML view funcs exported from Ponzu's management/editor package. Below is a list of the built-in options:",
+ "title": "Field Input Functions"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#editorinput",
+ "text": "The editor.Input function produces a standard text input.",
+ "title": "editor.Input"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#screenshot",
+ "text": "",
+ "title": "Screenshot"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#function-signature",
+ "text": "Input ( fieldName string , p interface {}, attrs , options map [ string ] string ) [] byte",
+ "title": "Function Signature"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#example",
+ "text": "... editor . Field { \n View : editor . Input ( Title , s , map [ string ] string { \n label : Title , \n type : text , \n placeholder : Enter the Title here , \n }), }, ...",
+ "title": "Example"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#editorinputrepeater",
+ "text": "The editor.InputRepeater function applies a controller UI to the editor.Input \nview so any arbitrary number of inputs can be added for your field. Using Repeaters When using the editor.InputRepeater make sure it's corresponding field is a slice []T \ntype. You will experience errors if it is not.",
+ "title": "editor.InputRepeater"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#screenshot_1",
+ "text": "",
+ "title": "Screenshot"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#function-signature_1",
+ "text": "InputRepeater ( fieldName string , p interface {}, attrs , options map [ string ] string ) [] byte",
+ "title": "Function Signature"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#example_1",
+ "text": "... editor . Field { \n View : editor . InputRepeater ( Title , s , map [ string ] string { \n label : Titles , \n type : text , \n placeholder : Enter the Title here , \n }), }, ...",
+ "title": "Example"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#editorcheckbox",
+ "text": "The editor.Checkbox function returns any number of checkboxes in a collection,\ndefined by the value:name map of options.",
+ "title": "editor.Checkbox"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#screenshot_2",
+ "text": "",
+ "title": "Screenshot"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#function-signature_2",
+ "text": "Checkbox ( fieldName string , p interface {}, attrs , options map [ string ] string ) [] byte",
+ "title": "Function Signature"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#example_2",
+ "text": "... editor . Field { \n View : editor . Checkbox ( Options , s , map [ string ] string { \n label : Options , \n }, map [ string ] string { \n // value : Display Name , \n 1 : First , \n 2 : Second , \n 3 : Third , \n }), }, ...",
+ "title": "Example"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#editorrichtext",
+ "text": "The editor.Richetext function displays an HTML5 rich text / WYSYWIG editor which\nsupports text formatting and styling, images, quotes, arbitrary HTML, and more. The rich text editor is a modified version of Summernote \nusing a theme called MaterialNote",
+ "title": "editor.Richtext"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#screenshot_3",
+ "text": "",
+ "title": "Screenshot"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#function-signature_3",
+ "text": "Richtext ( fieldName string , p interface {}, attrs map [ string ] string ) [] byte",
+ "title": "Function Signature"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#example_3",
+ "text": "... editor . Field { \n View : editor . Richtext ( Opinion , s , map [ string ] string { \n label : Rich Text Editor , \n placeholder : Enter the Opinion here , \n }), }, ...",
+ "title": "Example"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#editortags",
+ "text": "The editor.Tags function returns a container input element for lists of arbitrary\nbits of information.",
+ "title": "editor.Tags"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#screenshot_4",
+ "text": "",
+ "title": "Screenshot"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#function-signature_4",
+ "text": "Tags ( fieldName string , p interface {}, attrs map [ string ] string ) [] byte",
+ "title": "Function Signature"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#example_4",
+ "text": "... editor . Field { \n View : editor . Tags ( Category , s , map [ string ] string { \n label : Tags , \n placeholder : +Category , \n }), }, ...",
+ "title": "Example"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#editorfile",
+ "text": "The editor.File function returns an HTML file upload element, which saves files\ninto the /uploads directory, and can be viewed from the \"Uploads\" section in the\nAdmin dashboard. See also the File Metadata API . Field Type When using the editor.File function, its corresponding field type must be\na string , as files will be stored as URL paths in the database.",
+ "title": "editor.File"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#screenshot_5",
+ "text": "",
+ "title": "Screenshot"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#function-signature_5",
+ "text": "File ( fieldName string , p interface {}, attrs map [ string ] string ) [] byte",
+ "title": "Function Signature"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#example_5",
+ "text": "... editor . Field { \n View : editor . File ( Photo , s , map [ string ] string { \n label : File Upload , \n placeholder : Upload the Photo here , \n }), }, ...",
+ "title": "Example"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#editorfilerepeater",
+ "text": "The editor.FileRepeater function applies a controller UI to the editor.File \nview so any arbitrary number of uploads can be added for your field. Using Repeaters When using the editor.FileRepeater make sure it's corresponding field is a slice []string \ntype. You will experience errors if it is not.",
+ "title": "editor.FileRepeater"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#screenshot_6",
+ "text": "",
+ "title": "Screenshot"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#function-signature_6",
+ "text": "FileRepeater ( fieldName string , p interface {}, attrs map [ string ] string ) [] byte",
+ "title": "Function Signature"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#example_6",
+ "text": "... editor . Field { \n View : editor . FileRepeater ( Photo , s , map [ string ] string { \n label : File Upload Repeater , \n placeholder : Upload the Photo here , \n }), }, ...",
+ "title": "Example"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#editorselect",
+ "text": "The editor.Select function returns a single HTML select input with options\nas defined in the options map[string]string parameter of the function call.",
+ "title": "editor.Select"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#screenshot_7",
+ "text": "",
+ "title": "Screenshot"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#function-signature_7",
+ "text": "func Select ( fieldName string , p interface {}, attrs , options map [ string ] string ) [] byte",
+ "title": "Function Signature"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#example_7",
+ "text": "... editor . Field { \n View : editor . Select ( Rating , s , map [ string ] string { \n label : Select Dropdown , \n }, map [ string ] string { \n // value : Display Name , \n G : G , \n PG : PG , \n PG-13 : PG-13 , \n R : R , \n }), }, ...",
+ "title": "Example"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#editorselectrepeater",
+ "text": "The editor.SelectRepeater function applies a controller UI to the editor.Select \nview so any arbitrary number of dropdowns can be added for your field.",
+ "title": "editor.SelectRepeater"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#screenshot_8",
+ "text": "",
+ "title": "Screenshot"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#function-signature_8",
+ "text": "func SelectRepeater ( fieldName string , p interface {}, attrs , options map [ string ] string ) [] byte",
+ "title": "Function Signature"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#example_8",
+ "text": "... editor . Field { \n View : editor . SelectRepeater ( Rating , s , map [ string ] string { \n label : Select Dropdown Repeater , \n }, map [ string ] string { \n // value : Display Name , \n G : G , \n PG : PG , \n PG-13 : PG-13 , \n R : R , \n }), }, ...",
+ "title": "Example"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#editortextarea",
+ "text": "The editor.Textarea function returns an HTML textarea input to add unstyled text\nblocks. Newlines in the textarea are preserved.",
+ "title": "editor.Textarea"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#screenshot_9",
+ "text": "",
+ "title": "Screenshot"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#function-signature_9",
+ "text": "Textarea ( fieldName string , p interface {}, attrs map [ string ] string ) [] byte",
+ "title": "Function Signature"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#example_9",
+ "text": "... editor . Field { \n View : editor . Textarea ( Readme , s , map [ string ] string { \n label : Textarea , \n placeholder : Enter the Readme here , \n }), }, ...",
+ "title": "Example"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#data-references",
+ "text": "It is common to want to keep a reference from one Content type to another. To do\nthis in Ponzu, use the bosssauce/reference \npackage. It comes pre-installed with Ponzu as an \"Addon\" .",
+ "title": "Data References"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#referenceselect",
+ "text": "",
+ "title": "reference.Select"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#screenshot_10",
+ "text": "",
+ "title": "Screenshot"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#function-signature_10",
+ "text": "func Select ( fieldName string , p interface {}, attrs map [ string ] string , contentType , tmplString string ) [] byte",
+ "title": "Function Signature"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#example_10",
+ "text": "... editor . Field { \n View : reference . Select ( DirectedBy , s , map [ string ] string { \n label : Select Dropdown , \n }, Director , `{{.last-name}}, {{.first_name}}` ), }, ...",
+ "title": "Example"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#referenceselectrepeater",
+ "text": "",
+ "title": "reference.SelectRepeater"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#screenshot_11",
+ "text": "",
+ "title": "Screenshot"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#function-signature_11",
+ "text": "func SelectRepeater ( fieldName string , p interface {}, attrs map [ string ] string , contentType , tmplString string ) [] byte",
+ "title": "Function Signature"
+ },
+ {
+ "location": "/Form-Fields/HTML-Inputs/#example_11",
+ "text": "... editor . Field { \n View : reference . SelectRepeater ( PlacesFilmed , s , map [ string ] string { \n label : Select Dropdown Repeater , \n }, Location , `{{.name}}, {{.region}}` ), }, ...",
+ "title": "Example"
+ },
+ {
+ "location": "/HTTP-APIs/Content/",
+ "text": "Ponzu provides a read \n write HTTP API to access and interact with content on a\nsystem. By default, write access (including create, update and delete) and search \nare disabled. See the section on Ponzu's \nAPI Interfaces\n to learn\nmore about how to enable these endpoints.\n\n\n\n\nEndpoints\n\n\nGet Content by Type\n\n\nGET\n \n/api/content?type=\nType\nid=\nID\n\n\nSample Response\n\n\n{\n\n \ndata\n:\n \n[\n\n \n{\n\n \nuuid\n:\n \n024a5797-e064-4ee0-abe3-415cb6d3ed18\n,\n\n \nid\n:\n \n6\n,\n\n \nslug\n:\n \nitem-id-024a5797-e064-4ee0-abe3-415cb6d3ed18\n \n// customizable\n\n \ntimestamp\n:\n \n1493926453826\n,\n \n// milliseconds since Unix epoch\n\n \nupdated\n:\n \n1493926453826\n,\n\n \n// your content data...,\n\n \n}\n\n \n]\n\n\n}\n\n\n\n\n\n\n\n\nGet Contents by Type\n\n\nGET\n \n/api/contents?type=\nType\n\n\n\n\noptional params:\n\n\norder\n (string: ASC / DESC, default: DESC)\n\n\ncount\n (int: -1 - N, default: 10, -1 returns all)\n\n\noffset\n (int: 0 - N, default: 0)\n\n\n\n\n\n\n\n\nSample Response\n\n\n{\n\n \ndata\n:\n \n[\n\n \n{\n\n \nuuid\n:\n \n024a5797-e064-4ee0-abe3-415cb6d3ed18\n,\n\n \nid\n:\n \n6\n,\n\n \nslug\n:\n \nitem-id-024a5797-e064-4ee0-abe3-415cb6d3ed18\n,\n \n// customizable\n\n \ntimestamp\n:\n \n1493926453826\n,\n \n// milliseconds since Unix epoch\n\n \nupdated\n:\n \n1493926453826\n,\n\n \n// your content data...,\n\n \n},\n\n \n{\n\n \nuuid\n:\n \n5a9177c7-634d-4fb1-88a6-ef6c45de797c\n,\n\n \nid\n:\n \n7\n,\n\n \nslug\n:\n \nitem-id-5a9177c7-634d-4fb1-88a6-ef6c45de797c\n,\n \n// customizable\n\n \ntimestamp\n:\n \n1493926453826\n,\n \n// milliseconds since Unix epoch\n\n \nupdated\n:\n \n1493926453826\n,\n\n \n// your content data...,\n\n \n},\n\n \n// more objects...\n\n \n]\n\n\n}\n\n\n\n\n\n\n\n\nGet Content by Slug\n\n\nGET\n \n/api/content?slug=\nSlug\n\n\nSample Response\n\n\n{\n\n \ndata\n:\n \n[\n\n \n{\n\n \nuuid\n:\n \n024a5797-e064-4ee0-abe3-415cb6d3ed18\n,\n\n \nid\n:\n \n6\n,\n\n \nslug\n:\n \nitem-id-024a5797-e064-4ee0-abe3-415cb6d3ed18\n,\n \n// customizable\n\n \ntimestamp\n:\n \n1493926453826\n,\n \n// milliseconds since Unix epoch\n\n \nupdated\n:\n \n1493926453826\n,\n\n \n// your content data...,\n\n \n}\n\n \n]\n\n\n}\n\n\n\n\n\n\n\n\nNew Content\n\n\nPOST\n \n/api/content/create?type=\nType\n\n\n\n\nRequest Data Encoding\n\n\nRequest must be \nmultipart/form-data\n encoded. If not, a \n400 Bad Request\n \nResponse will be returned.\n\n\n\n\nSample Response\n\n\n{\n\n \ndata\n:\n \n[\n\n \n{\n\n \nid\n:\n \n6\n,\n \n// will be omitted if status is pending\n\n \ntype\n:\n \nReview\n,\n\n \nstatus\n:\n \npublic\n\n \n}\n\n \n]\n\n\n}\n\n\n\n\n\n\n\n\nUpdate Content\n\n\nPOST\n \n/api/content/update?type=\nType\nid=\nid\n\n\n\n\nRequest Data Encoding\n\n\nRequest must be \nmultipart/form-data\n encoded. If not, a \n400 Bad Request\n \nResponse will be returned.\n\n\n\n\nSample Response\n\n\n{\n\n \ndata\n:\n \n[\n\n \n{\n\n \nid\n:\n \n6\n,\n\n \ntype\n:\n \nReview\n,\n\n \nstatus\n:\n \npublic\n\n \n}\n\n \n]\n\n\n}\n\n\n\n\n\n\n\n\nDelete Content\n\n\nPOST\n \n/api/content/delete?type=\nType\nid=\nid\n\n\n\n\nRequest Data Encoding\n\n\nRequest must be \nmultipart/form-data\n encoded. If not, a \n400 Bad Request\n \nResponse will be returned.\n\n\n\n\nSample Response\n\n\n{\n\n \ndata\n:\n \n[\n\n \n{\n\n \nid\n:\n \n6\n,\n\n \ntype\n:\n \nReview\n,\n\n \nstatus\n:\n \ndeleted\n\n \n}\n\n \n]\n\n\n}\n\n\n\n\n\n\n\n\nAdditional Information\n\n\nAll API endpoints are CORS-enabled (can be disabled in configuration at run-time) and API requests are recorded by your system to generate graphs of total requests and unique client requests within the Admin dashboard.\n\n\nResponse Headers\n\n\nThe following headers are common across all Ponzu API responses. Some of them can be modified\nin the \nsystem configuration\n while your system is running.\n\n\nHTTP/1.1\n\n\nHTTP/1.1 200 OK\nAccess-Control-Allow-Headers: Accept, Authorization, Content-Type\nAccess-Control-Allow-Origin: *\nCache-Control: max-age=2592000, public\nContent-Encoding: gzip\nContent-Type: application/json\nEtag: MTQ5Mzk0NTYzNQ==\nVary: Accept-Encoding\nDate: Fri, 05 May 2017 01:15:49 GMT\nContent-Length: 199\n\n\n\n\n\nHTTP/2\n\n\naccess-control-allow-headers: Accept, Authorization, Content-Type\naccess-control-allow-origin: *\ncache-control: max-age=2592000, public\ncontent-encoding: gzip\ncontent-length: 199\ncontent-type: application/json\ndate: Fri, 05 May 2017 01:38:11 GMT\netag: MTQ5Mzk0ODI4MA==\nstatus: 200\nvary: Accept-Encoding\n\n\n\n\n\nHelpful links\n\n\nTypewriter\n\nGenerate \n sync front-end data structures from Ponzu content types. (\nPonzu example\n)",
+ "title": "Content"
+ },
+ {
+ "location": "/HTTP-APIs/Content/#endpoints",
+ "text": "",
+ "title": "Endpoints"
+ },
+ {
+ "location": "/HTTP-APIs/Content/#get-content-by-type",
+ "text": "GET /api/content?type= Type id= ID",
+ "title": "Get Content by Type"
+ },
+ {
+ "location": "/HTTP-APIs/Content/#sample-response",
+ "text": "{ \n data : [ \n { \n uuid : 024a5797-e064-4ee0-abe3-415cb6d3ed18 , \n id : 6 , \n slug : item-id-024a5797-e064-4ee0-abe3-415cb6d3ed18 // customizable \n timestamp : 1493926453826 , // milliseconds since Unix epoch \n updated : 1493926453826 , \n // your content data..., \n } \n ] }",
+ "title": "Sample Response"
+ },
+ {
+ "location": "/HTTP-APIs/Content/#get-contents-by-type",
+ "text": "GET /api/contents?type= Type optional params: order (string: ASC / DESC, default: DESC) count (int: -1 - N, default: 10, -1 returns all) offset (int: 0 - N, default: 0)",
+ "title": "Get Contents by Type"
+ },
+ {
+ "location": "/HTTP-APIs/Content/#sample-response_1",
+ "text": "{ \n data : [ \n { \n uuid : 024a5797-e064-4ee0-abe3-415cb6d3ed18 , \n id : 6 , \n slug : item-id-024a5797-e064-4ee0-abe3-415cb6d3ed18 , // customizable \n timestamp : 1493926453826 , // milliseconds since Unix epoch \n updated : 1493926453826 , \n // your content data..., \n }, \n { \n uuid : 5a9177c7-634d-4fb1-88a6-ef6c45de797c , \n id : 7 , \n slug : item-id-5a9177c7-634d-4fb1-88a6-ef6c45de797c , // customizable \n timestamp : 1493926453826 , // milliseconds since Unix epoch \n updated : 1493926453826 , \n // your content data..., \n }, \n // more objects... \n ] }",
+ "title": "Sample Response"
+ },
+ {
+ "location": "/HTTP-APIs/Content/#get-content-by-slug",
+ "text": "GET /api/content?slug= Slug",
+ "title": "Get Content by Slug"
+ },
+ {
+ "location": "/HTTP-APIs/Content/#sample-response_2",
+ "text": "{ \n data : [ \n { \n uuid : 024a5797-e064-4ee0-abe3-415cb6d3ed18 , \n id : 6 , \n slug : item-id-024a5797-e064-4ee0-abe3-415cb6d3ed18 , // customizable \n timestamp : 1493926453826 , // milliseconds since Unix epoch \n updated : 1493926453826 , \n // your content data..., \n } \n ] }",
+ "title": "Sample Response"
+ },
+ {
+ "location": "/HTTP-APIs/Content/#new-content",
+ "text": "POST /api/content/create?type= Type Request Data Encoding Request must be multipart/form-data encoded. If not, a 400 Bad Request \nResponse will be returned.",
+ "title": "New Content"
+ },
+ {
+ "location": "/HTTP-APIs/Content/#sample-response_3",
+ "text": "{ \n data : [ \n { \n id : 6 , // will be omitted if status is pending \n type : Review , \n status : public \n } \n ] }",
+ "title": "Sample Response"
+ },
+ {
+ "location": "/HTTP-APIs/Content/#update-content",
+ "text": "POST /api/content/update?type= Type id= id Request Data Encoding Request must be multipart/form-data encoded. If not, a 400 Bad Request \nResponse will be returned.",
+ "title": "Update Content"
+ },
+ {
+ "location": "/HTTP-APIs/Content/#sample-response_4",
+ "text": "{ \n data : [ \n { \n id : 6 , \n type : Review , \n status : public \n } \n ] }",
+ "title": "Sample Response"
+ },
+ {
+ "location": "/HTTP-APIs/Content/#delete-content",
+ "text": "POST /api/content/delete?type= Type id= id Request Data Encoding Request must be multipart/form-data encoded. If not, a 400 Bad Request \nResponse will be returned.",
+ "title": "Delete Content"
+ },
+ {
+ "location": "/HTTP-APIs/Content/#sample-response_5",
+ "text": "{ \n data : [ \n { \n id : 6 , \n type : Review , \n status : deleted \n } \n ] }",
+ "title": "Sample Response"
+ },
+ {
+ "location": "/HTTP-APIs/Content/#additional-information",
+ "text": "All API endpoints are CORS-enabled (can be disabled in configuration at run-time) and API requests are recorded by your system to generate graphs of total requests and unique client requests within the Admin dashboard.",
+ "title": "Additional Information"
+ },
+ {
+ "location": "/HTTP-APIs/Content/#response-headers",
+ "text": "The following headers are common across all Ponzu API responses. Some of them can be modified\nin the system configuration while your system is running.",
+ "title": "Response Headers"
+ },
+ {
+ "location": "/HTTP-APIs/Content/#http11",
+ "text": "HTTP/1.1 200 OK\nAccess-Control-Allow-Headers: Accept, Authorization, Content-Type\nAccess-Control-Allow-Origin: *\nCache-Control: max-age=2592000, public\nContent-Encoding: gzip\nContent-Type: application/json\nEtag: MTQ5Mzk0NTYzNQ==\nVary: Accept-Encoding\nDate: Fri, 05 May 2017 01:15:49 GMT\nContent-Length: 199",
+ "title": "HTTP/1.1"
+ },
+ {
+ "location": "/HTTP-APIs/Content/#http2",
+ "text": "access-control-allow-headers: Accept, Authorization, Content-Type\naccess-control-allow-origin: *\ncache-control: max-age=2592000, public\ncontent-encoding: gzip\ncontent-length: 199\ncontent-type: application/json\ndate: Fri, 05 May 2017 01:38:11 GMT\netag: MTQ5Mzk0ODI4MA==\nstatus: 200\nvary: Accept-Encoding",
+ "title": "HTTP/2"
+ },
+ {
+ "location": "/HTTP-APIs/Content/#helpful-links",
+ "text": "Typewriter \nGenerate sync front-end data structures from Ponzu content types. ( Ponzu example )",
+ "title": "Helpful links"
+ },
+ {
+ "location": "/HTTP-APIs/File-Metadata/",
+ "text": "Ponzu provides a read-only HTTP API to get metadata about the files that have been uploaded to your system. As a security and bandwidth abuse precaution, the API is only queryable by \"slug\" which is the normalized filename of the uploaded file. \n\n\n\n\nEndpoints\n\n\nGet File by Slug (single item)\n\n\nGET\n \n/api/uploads?slug=\nSlug\n\n\nSample Response\n\n\n{\n\n \ndata\n:\n \n[\n\n \n{\n\n \nuuid\n:\n \n024a5797-e064-4ee0-abe3-415cb6d3ed18\n,\n\n \nid\n:\n \n6\n,\n\n \nslug\n:\n \nfilename.jpg\n,\n\n \ntimestamp\n:\n \n1493926453826\n,\n \n// milliseconds since Unix epoch\n\n \nupdated\n:\n \n1493926453826\n,\n\n \nname\n:\n \nfilename.jpg\n,\n\n \npath\n:\n \n/api/uploads/2017/05/filename.jpg\n,\n\n \ncontent_length\n:\n \n357557\n,\n\n \ncontent_type\n:\n \nimage/jpeg\n,\n\n \n}\n\n \n]\n\n\n}",
+ "title": "File Metadata"
+ },
+ {
+ "location": "/HTTP-APIs/File-Metadata/#endpoints",
+ "text": "",
+ "title": "Endpoints"
+ },
+ {
+ "location": "/HTTP-APIs/File-Metadata/#get-file-by-slug-single-item",
+ "text": "GET /api/uploads?slug= Slug",
+ "title": "Get File by Slug (single item)"
+ },
+ {
+ "location": "/HTTP-APIs/File-Metadata/#sample-response",
+ "text": "{ \n data : [ \n { \n uuid : 024a5797-e064-4ee0-abe3-415cb6d3ed18 , \n id : 6 , \n slug : filename.jpg , \n timestamp : 1493926453826 , // milliseconds since Unix epoch \n updated : 1493926453826 , \n name : filename.jpg , \n path : /api/uploads/2017/05/filename.jpg , \n content_length : 357557 , \n content_type : image/jpeg , \n } \n ] }",
+ "title": "Sample Response"
+ },
+ {
+ "location": "/HTTP-APIs/Search/",
+ "text": "Ponzu provides a read-only HTTP API to search the contents of your system's database. \nFull-text search is made possible by the use of \nBleve\n, \nwhich handles the indexing and querying. \n\n\n\n\nEndpoints\n\n\nSearch Content\n\n\nGET\n \n/api/search?type=\nType\nq=\nQuery String\n\n\n\n\nSearch must be enabled individually for each Content type\n\n\n\n\nSearch is not on by default to protect your data in case it shouldn't be indexed and published via the API.\n\n\nSearchMapping()\n is implemented with default mapping (ideal for 99% of use cases). \n\n\nTo enable search, add a \nIndexContent() bool\n method to your content type and return \ntrue\n (default implementation returns false).\n\n\n\n\n\n\n\n\n\n\nType\n must implement \ndb.Searchable\n\n\n\n\n\n\nSearch is currently limited to single \nType\n per request\n\n\n\n\n\n\nQuery String\n documentation here: \nBleve Docs - Query String\n\n\n\n\n\n\nSearch results are formatted exactly the same as standard Content API calls, so you don't need to change your client data model \n\n\n\n\n\n\nSearch handler will respect other interface implementations on your content, including: \n\n\n\n\nitem.Hideable\n\n\nitem.Omittable\n \n\n\nitem.Pushable\n \n(Note: only the first search result will be pushed)\n\n\n\n\n\n\n\n\nSample Response\n\n\n{\n\n \ndata\n:\n \n[\n\n \n{\n\n \nuuid\n:\n \n024a5797-e064-4ee0-abe3-415cb6d3ed18\n,\n\n \nid\n:\n \n6\n,\n\n \nslug\n:\n \nitem-id-024a5797-e064-4ee0-abe3-415cb6d3ed18\n,\n \n// customizable\n\n \ntimestamp\n:\n \n1493926453826\n,\n \n// milliseconds since Unix epoch\n\n \nupdated\n:\n \n1493926453826\n,\n\n \n// your content data...,\n\n \n}\n\n \n]\n\n\n}",
+ "title": "Search"
+ },
+ {
+ "location": "/HTTP-APIs/Search/#endpoints",
+ "text": "",
+ "title": "Endpoints"
+ },
+ {
+ "location": "/HTTP-APIs/Search/#search-content",
+ "text": "GET /api/search?type= Type q= Query String Search must be enabled individually for each Content type Search is not on by default to protect your data in case it shouldn't be indexed and published via the API. SearchMapping() is implemented with default mapping (ideal for 99% of use cases). To enable search, add a IndexContent() bool method to your content type and return true (default implementation returns false). Type must implement db.Searchable Search is currently limited to single Type per request Query String documentation here: Bleve Docs - Query String Search results are formatted exactly the same as standard Content API calls, so you don't need to change your client data model Search handler will respect other interface implementations on your content, including: item.Hideable item.Omittable item.Pushable (Note: only the first search result will be pushed)",
+ "title": "Search Content"
+ },
+ {
+ "location": "/HTTP-APIs/Search/#sample-response",
+ "text": "{ \n data : [ \n { \n uuid : 024a5797-e064-4ee0-abe3-415cb6d3ed18 , \n id : 6 , \n slug : item-id-024a5797-e064-4ee0-abe3-415cb6d3ed18 , // customizable \n timestamp : 1493926453826 , // milliseconds since Unix epoch \n updated : 1493926453826 , \n // your content data..., \n } \n ] }",
+ "title": "Sample Response"
+ },
+ {
+ "location": "/Interfaces/API/",
+ "text": "Ponzu provides a set of interfaces from the \nsystem/api\n package which enable \nricher interaction with your system from external clients. If you need to allow \n3rd-party apps to manage content, use the following interfaces.\n\n\nThe API interfaces adhere to a common function signature, expecting an \n\nhttp.ResponseWriter\n and \n*http.Request\n as arguments and returning an \nerror\n.\nThis provides Ponzu developers with full control over the request/response \nlife-cycle.\n\n\n\n\nInterfaces\n\n\napi.Createable\n\n\nExternalable enables 3rd-party clients (outside the CMS) to send content via a \n\nmultipart/form-data\n encoded \nPOST\n request to a specific endpoint: \n\n/api/content/create?type=\nType\n. When \napi.Createable\n is implemented, content \nwill be saved from the request in a \"Pending\" section which will is visible only \nwithin the CMS.\n\n\nTo work with \"Pending\" data, implement the \neditor.Mergeable\n\ninterface, which will add \"Approve\" and \"Reject\" buttons to your Content types'\neditor -- or implement \napi.Trustable\n to bypass \nthe \"Pending\" section altogether and become \"Public\" immediately. \n\n\nMethod Set\n\n\ntype\n \nCreateable\n \ninterface\n \n{\n\n \nCreate\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n\n}\n\n\n\n\n\n\nImplementation\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nCreate\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\n\n\napi.Updateable\n\n\nUpdateable enables 3rd-party clients (outside the CMS) to update existing content \nvia a \nmultipart/form-data\n encoded \nPOST\n request to a specific endpoint: \n\n/api/content/update?type=\nType\nid=\nid\n. Request validation should be employed \notherwise any client could change data in your database.\n\n\nMethod Set\n\n\ntype\n \nUpdateable\n \ninterface\n \n{\n\n \nUpdate\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n\n}\n\n\n\n\n\n\nImplementation\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nUpdate\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\n\n\napi.Deleteable\n\n\nUpdateable enables 3rd-party clients (outside the CMS) to delete existing content \nvia a \nmultipart/form-data\n encoded \nPOST\n request to a specific endpoint: \n\n/api/content/delete?type=\nType\nid=\nid\n. Request validation should be employed \notherwise any client could delete data from your database.\n\n\nMethod Set\n\n\ntype\n \nDeleteable\n \ninterface\n \n{\n\n \nDelete\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n\n}\n\n\n\n\n\n\nImplementation\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nDelete\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\n\n\napi.Trustable\n\n\nTrustable provides a way for submitted content (via \napi.Createable\n) to bypass \nthe \neditor.Mergeable\n step in which CMS end-users must manually click the \n\"Approve\" button in order for content to be put in the \"Public\" section and access \nvia the content API endpoints. \napi.Trustable\n has a single method: \nAutoApprove\n \nwhich will automatically approve content, bypassing the \"Pending\" section \naltogether.\n\n\ntype\n \nTrustable\n \ninterface\n \n{\n\n \nAutoApprove\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n\n}\n\n\n\n\n\n\nImplementation\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nAutoApprove\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}",
+ "title": "API"
+ },
+ {
+ "location": "/Interfaces/API/#interfaces",
+ "text": "",
+ "title": "Interfaces"
+ },
+ {
+ "location": "/Interfaces/API/#apicreateable",
+ "text": "Externalable enables 3rd-party clients (outside the CMS) to send content via a multipart/form-data encoded POST request to a specific endpoint: /api/content/create?type= Type . When api.Createable is implemented, content \nwill be saved from the request in a \"Pending\" section which will is visible only \nwithin the CMS. To work with \"Pending\" data, implement the editor.Mergeable \ninterface, which will add \"Approve\" and \"Reject\" buttons to your Content types'\neditor -- or implement api.Trustable to bypass \nthe \"Pending\" section altogether and become \"Public\" immediately.",
+ "title": "api.Createable"
+ },
+ {
+ "location": "/Interfaces/API/#method-set",
+ "text": "type Createable interface { \n Create ( http . ResponseWriter , * http . Request ) error }",
+ "title": "Method Set"
+ },
+ {
+ "location": "/Interfaces/API/#implementation",
+ "text": "func ( p * Post ) Create ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "Implementation"
+ },
+ {
+ "location": "/Interfaces/API/#apiupdateable",
+ "text": "Updateable enables 3rd-party clients (outside the CMS) to update existing content \nvia a multipart/form-data encoded POST request to a specific endpoint: /api/content/update?type= Type id= id . Request validation should be employed \notherwise any client could change data in your database.",
+ "title": "api.Updateable"
+ },
+ {
+ "location": "/Interfaces/API/#method-set_1",
+ "text": "type Updateable interface { \n Update ( http . ResponseWriter , * http . Request ) error }",
+ "title": "Method Set"
+ },
+ {
+ "location": "/Interfaces/API/#implementation_1",
+ "text": "func ( p * Post ) Update ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "Implementation"
+ },
+ {
+ "location": "/Interfaces/API/#apideleteable",
+ "text": "Updateable enables 3rd-party clients (outside the CMS) to delete existing content \nvia a multipart/form-data encoded POST request to a specific endpoint: /api/content/delete?type= Type id= id . Request validation should be employed \notherwise any client could delete data from your database.",
+ "title": "api.Deleteable"
+ },
+ {
+ "location": "/Interfaces/API/#method-set_2",
+ "text": "type Deleteable interface { \n Delete ( http . ResponseWriter , * http . Request ) error }",
+ "title": "Method Set"
+ },
+ {
+ "location": "/Interfaces/API/#implementation_2",
+ "text": "func ( p * Post ) Delete ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "Implementation"
+ },
+ {
+ "location": "/Interfaces/API/#apitrustable",
+ "text": "Trustable provides a way for submitted content (via api.Createable ) to bypass \nthe editor.Mergeable step in which CMS end-users must manually click the \n\"Approve\" button in order for content to be put in the \"Public\" section and access \nvia the content API endpoints. api.Trustable has a single method: AutoApprove \nwhich will automatically approve content, bypassing the \"Pending\" section \naltogether. type Trustable interface { \n AutoApprove ( http . ResponseWriter , * http . Request ) error }",
+ "title": "api.Trustable"
+ },
+ {
+ "location": "/Interfaces/API/#implementation_3",
+ "text": "func ( p * Post ) AutoApprove ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "Implementation"
+ },
+ {
+ "location": "/Interfaces/Editor/",
+ "text": "Ponzu provides a set of interfaces from the \nmanagement/editor\n package which \nextend the system's functionality and determine how content editors are rendered \nwithin the CMS.\n\n\n\n\nInterfaces\n\n\neditor.Editable\n\n\nEditable determines what \n[]bytes\n are rendered inside the editor page. Use \nEdtiable on anything inside your CMS that you want to provide configuration, editable \nfields, or any HTML/markup to display to an end-user.\n\n\n\n\nImplementing \neditor.Editable\n\n\nMost of the time, Ponzu developers generate the majority of this code using \nthe Ponzu CLI \ngenerate\n command\n.\n\n\n\n\nMethod Set\n\n\ntype\n \nEditable\n \ninterface\n \n{\n\n \nMarshalEditor\n()\n \n([]\nbyte\n,\n \nerror\n)\n\n\n}\n\n\n\n\n\n\nImplementation\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nMarshalEditor\n()\n \n([]\nbyte\n,\n \nerror\n)\n \n{\n\n \n// The editor.Form func sets up a structured UI with default styles and form\n\n \n// elements based on the fields provided. Most often, Ponzu developers will\n\n \n// have the `$ ponzu generate` command generate the MarshalEditor func and \n\n \n// its internal form fields\n\n \nview\n,\n \nerr\n \n:=\n \neditor\n.\nForm\n(\np\n,\n\n \neditor\n.\nField\n{\n\n \nView\n:\n \neditor\n.\nInput\n(\nName\n,\n \np\n,\n \nmap\n[\nstring\n]\nstring\n{\n\n \nlabel\n:\n \nName\n,\n\n \ntype\n:\n \ntext\n,\n\n \nplaceholder\n:\n \nEnter the Name here\n,\n\n \n}),\n\n \n},\n\n \n)\n\n\n}\n\n\n\n\n\n\n\n\nMarshalEditor() \n View Rendering\n\n\nAlthough it is common to use the \neditor.Form\n and \neditor.Fields\n to structure your content editor inside \nMarshalEditor()\n, the method signature defines that its return value needs only to be \n[]byte, error\n. Keep in mind that you can return a \n[]byte\n of any raw HTML or other markup to be rendered in the editor view.\n\n\n\n\n\n\neditor.Mergeable\n\n\nMergable enables a CMS end-user to merge the \"Pending\" content from an outside source into the \"Public\" section, and thus making it visible via the public content API. It also allows the end-user to reject content. \"Approve\" and \"Reject\" buttons will be visible on the edit page for content submitted.\n\n\nMethod Set\n\n\ntype\n \nMergeable\n \ninterface\n \n{\n\n \nApprove\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n\n}\n\n\n\n\n\n\nExample\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nApprove\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}",
+ "title": "Editor"
+ },
+ {
+ "location": "/Interfaces/Editor/#interfaces",
+ "text": "",
+ "title": "Interfaces"
+ },
+ {
+ "location": "/Interfaces/Editor/#editoreditable",
+ "text": "Editable determines what []bytes are rendered inside the editor page. Use \nEdtiable on anything inside your CMS that you want to provide configuration, editable \nfields, or any HTML/markup to display to an end-user. Implementing editor.Editable Most of the time, Ponzu developers generate the majority of this code using \nthe Ponzu CLI generate command .",
+ "title": "editor.Editable"
+ },
+ {
+ "location": "/Interfaces/Editor/#method-set",
+ "text": "type Editable interface { \n MarshalEditor () ([] byte , error ) }",
+ "title": "Method Set"
+ },
+ {
+ "location": "/Interfaces/Editor/#implementation",
+ "text": "func ( p * Post ) MarshalEditor () ([] byte , error ) { \n // The editor.Form func sets up a structured UI with default styles and form \n // elements based on the fields provided. Most often, Ponzu developers will \n // have the `$ ponzu generate` command generate the MarshalEditor func and \n // its internal form fields \n view , err := editor . Form ( p , \n editor . Field { \n View : editor . Input ( Name , p , map [ string ] string { \n label : Name , \n type : text , \n placeholder : Enter the Name here , \n }), \n }, \n ) } MarshalEditor() View Rendering Although it is common to use the editor.Form and editor.Fields to structure your content editor inside MarshalEditor() , the method signature defines that its return value needs only to be []byte, error . Keep in mind that you can return a []byte of any raw HTML or other markup to be rendered in the editor view.",
+ "title": "Implementation"
+ },
+ {
+ "location": "/Interfaces/Editor/#editormergeable",
+ "text": "Mergable enables a CMS end-user to merge the \"Pending\" content from an outside source into the \"Public\" section, and thus making it visible via the public content API. It also allows the end-user to reject content. \"Approve\" and \"Reject\" buttons will be visible on the edit page for content submitted.",
+ "title": "editor.Mergeable"
+ },
+ {
+ "location": "/Interfaces/Editor/#method-set_1",
+ "text": "type Mergeable interface { \n Approve ( http . ResponseWriter , * http . Request ) error }",
+ "title": "Method Set"
+ },
+ {
+ "location": "/Interfaces/Editor/#example",
+ "text": "func ( p * Post ) Approve ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "Example"
+ },
+ {
+ "location": "/Interfaces/Format/",
+ "text": "Ponzu provides a set of interfaces from the \nmanagement/format\n package which \ndetermine how content data should be converted and formatted for exporting via\nthe Admin interface.\n\n\n\n\nInterfaces\n\n\nformat.CSVFormattable\n\n\nCSVFormattable controls if an \"Export\" button is added to the contents view for \na Content type in the CMS to export the data to CSV. If it is implemented, a\nbutton will be present beneath the \"New\" button per Content type. \n\n\nMethod Set\n\n\ntype\n \nCSVFormattable\n \ninterface\n \n{\n\n \nFormatCSV\n()\n \n[]\nstring\n\n\n}\n\n\n\n\n\n\nImplementation\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nFormatCSV\n()\n \n[]\nstring\n \n{\n\n \n// []string contains the JSON struct tags generated for your Content type \n\n \n// implementing the interface\n\n \nreturn\n \n[]\nstring\n{\n\n \nid\n,\n\n \ntimestamp\n,\n\n \nslug\n,\n\n \ntitle\n,\n\n \nphotos\n,\n\n \nbody\n,\n\n \nwritten_by\n,\n\n \n}\n\n\n}\n\n\n\n\n\n\n\n\nFormatCSV() []string\n\n\nJust like other Ponzu content extension interfaces, like \nPush()\n, you will \nreturn the JSON struct tags for the fields you want exported to the CSV file. \nThese will also be the \"header\" row in the CSV file to give titles to the file\ncolumns. Keep in mind that all of item.Item's fields are available here as well.",
+ "title": "Format"
+ },
+ {
+ "location": "/Interfaces/Format/#interfaces",
+ "text": "",
+ "title": "Interfaces"
+ },
+ {
+ "location": "/Interfaces/Format/#formatcsvformattable",
+ "text": "CSVFormattable controls if an \"Export\" button is added to the contents view for \na Content type in the CMS to export the data to CSV. If it is implemented, a\nbutton will be present beneath the \"New\" button per Content type.",
+ "title": "format.CSVFormattable"
+ },
+ {
+ "location": "/Interfaces/Format/#method-set",
+ "text": "type CSVFormattable interface { \n FormatCSV () [] string }",
+ "title": "Method Set"
+ },
+ {
+ "location": "/Interfaces/Format/#implementation",
+ "text": "func ( p * Post ) FormatCSV () [] string { \n // []string contains the JSON struct tags generated for your Content type \n // implementing the interface \n return [] string { \n id , \n timestamp , \n slug , \n title , \n photos , \n body , \n written_by , \n } } FormatCSV() []string Just like other Ponzu content extension interfaces, like Push() , you will \nreturn the JSON struct tags for the fields you want exported to the CSV file. \nThese will also be the \"header\" row in the CSV file to give titles to the file\ncolumns. Keep in mind that all of item.Item's fields are available here as well.",
+ "title": "Implementation"
+ },
+ {
+ "location": "/Interfaces/Item/",
+ "text": "Ponzu provides a set of interfaces from the \nsystem/item\n package which extend \nthe functionality of the content in your system and how it interacts with other \ncomponents inside and outside of Ponzu. \n\n\n\n\nInterfaces\n\n\nitem.Pushable\n\n\nPushable, if \nHTTP/2 Server Push\n \nis supported by the client, can tell a handler which resources it would like to \nhave \"pushed\" preemptively to the client. This saves follow-on roundtrip requests \nfor other items which are referenced by the Pushable item. The \nPush\n method, the \nonly method in Pushable, must return a \n[]string\n containing the \njson\n field tags \nof the referenced items within the type.\n\n\nMethod Set\n\n\ntype\n \nPushable\n \ninterface\n \n{\n\n \n// the values contained in fields returned by Push must be URL paths\n\n \nPush\n()\n \n[]\nstring\n\n\n}\n\n\n\n\n\n\nImplementation\n\n\nThe \nPush\n method returns a \n[]string\n containing the \njson\n tag field names for\nwhich you want to have pushed to a supported client. The values for the field\nnames \nmust\n be URL paths, and cannot be from another origin.\n\n\ntype\n \nPost\n \nstruct\n \n{\n\n \nitem\n.\nItem\n\n\n \nHeaderPhoto\n \nstring\n \n`json:\nheader_photo\n`\n\n \nAuthor\n \nstring\n \n`json:\nauthor\n`\n \n// reference `/api/content/?type=Author\nid=2`\n\n \n// ...\n\n\n}\n\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nPush\n()\n \n[]\nstring\n \n{\n\n \nreturn\n \n[]\nstring\n{\n\n \nheader_photo\n,\n\n \nauthor\n,\n\n \n}\n\n\n}\n\n\n\n\n\n\n\n\nitem.Hideable\n\n\nHideable tells an API handler that data of this type shouldn\u2019t be exposed outside \nthe system. Hideable types cannot be used as references (relations in Content types).\nThe \nHide\n method, the only method in Hideable, takes an \nhttp.ResponseWriter, *http.Request\n \nand returns an \nerror\n. A special error in the \nitems\n package, \nErrAllowHiddenItem\n \ncan be returned as the error from Hide to instruct handlers to show hidden \ncontent in specific cases.\n\n\nMethod Set\n\n\ntype\n \nHideable\n \ninterface\n \n{\n\n \nHide\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n\n}\n\n\n\n\n\n\nImplementation\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nHide\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\n\n\nitem.Omittable\n\n\nOmittable tells a content API handler to keep certain fields from being exposed \nthrough the JSON response. It's single method, \nOmit\n takes no arguments and \nreturns a \n[]string\n which must be made up of the JSON struct tags for the type \ncontaining fields to be omitted.\n\n\nMethod Set\n\n\ntype\n \nOmittable\n \ninterface\n \n{\n\n \nOmit\n()\n \n[]\nstring\n\n\n}\n\n\n\n\n\n\nImplementation\n\n\ntype\n \nPost\n \nstruct\n \n{\n\n \nitem\n.\nItem\n\n\n \nHeaderPhoto\n \nstring\n \n`json:\nheader_photo\n`\n\n \nAuthor\n \nstring\n \n`json:\nauthor\n`\n\n \n// ...\n\n\n}\n\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nOmit\n()\n \n[]\nstring\n \n{\n\n \nreturn\n \n[]\nstring\n{\n\n \nheader_photo\n,\n\n \nauthor\n,\n\n \n}\n\n\n}\n\n\n\n\n\n\n\n\nitem.Hookable\n\n\nHookable provides lifecycle hooks into the http handlers which manage Save, Delete,\nApprove, and Reject routines. All methods in its set take an \n\nhttp.ResponseWriter, *http.Request\n and return an \nerror\n.\n\n\nMethod Set\n\n\ntype\n \nHookable\n \ninterface\n \n{\n\n \nBeforeAPICreate\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n \nAfterAPICreate\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n\n \nBeforeAPIUpdate\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n \nAfterAPIUpdate\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n\n \nBeforeAPIDelete\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n \nAfterAPIDelete\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n\n \nBeforeAdminCreate\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n \nAfterAdminCreate\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n\n \nBeforeAdminUpdate\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n \nAfterAdminUpdate\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n\n \nBeforeAdminDelete\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n \nAfterAdminDelete\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n\n \nBeforeSave\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n \nAfterSave\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n\n \nBeforeDelete\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n \nAfterDelete\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n\n \nBeforeApprove\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n \nAfterApprove\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n\n \nBeforeReject\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n \nAfterReject\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n\n \n// Enable/Disable used exclusively for addons\n\n \nBeforeEnable\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n \nAfterEnable\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n\n \nBeforeDisable\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n \nAfterDisable\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n\n\n}\n\n\n\n\n\n\nImplementations\n\n\nBeforeAPICreate\n\n\nBeforeAPICreate is called before an item is created via a 3rd-party client. If a \nnon-nil \nerror\n value is returned, the item will not be created/saved.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nBeforeAPICreate\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nAfterAPICreate\n\n\nAfterAPICreate is called after an item has been created via a 3rd-party client.\nAt this point, the item has been saved to the database. If a non-nil \nerror\n is\nreturned, it will respond to the client with an empty response, so be sure to \nuse the \nhttp.ResponseWriter\n from within your hook appropriately.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nAfterAPICreate\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nBeforeApprove\n\n\nBeforeApprove is called before an item is merged as \"Public\" from its prior \nstatus as \"Pending\". If a non-nil \nerror\n value is returned, the item will not be\nappproved, and an error message is displayed to the Admin. \n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nBeforeApprove\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nAfterApprove\n\n\nAfterApprove is called after an item has been merged as \"Public\" from its prior\nstatus as \"Pending\". If a non-nil \nerror\n is returned, an error message is \ndisplayed to the Admin, however the item will already be irreversibly merged.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nAfterApprove\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nBeforeReject\n\n\nBeforeReject is called before an item is rejected and deleted by default. To reject\nan item, but not delete it, return a non-nil \nerror\n from this hook - doing so \nwill allow the hook to do what you want it to do prior to the return, but the item\nwill remain in the \"Pending\" section.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nBeforeReject\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nAfterReject\n\n\nAfterReject is called after an item is rejected and has been deleted.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nAfterReject\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nBeforeSave\n\n\nBeforeSave is called before any CMS Admin or 3rd-party client triggers a save to \nthe database. This could be done by clicking the 'Save' button on a Content editor, \nor by a API call to Create or Update the Content item. By returning a non-nil \n\nerror\n value, the item will not be saved.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nBeforeSave\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nAfterSave\n\n\nAfterSave is called after any CMS Admin or 3rd-party client triggers a save to \nthe database. This could be done by clicking the 'Save' button on a Content editor, \nor by a API call to Create or Update the Content item.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nAfterSave\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nBeforeDelete\n\n\nBeforeDelete is called before any CMS Admin or 3rd-party client triggers a delete to \nthe database. This could be done by clicking the 'Delete' button on a Content editor, \nor by a API call to Delete the Content item. By returning a non-nil \nerror\n value,\nthe item will not be deleted.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nBeforeDelete\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nAfterDelete\n\n\nAfterSave is called after any CMS Admin or 3rd-party client triggers a delete to \nthe database. This could be done by clicking the 'Delete' button on a Content editor, \nor by a API call to Delete the Content item.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nAfterDelete\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nBeforeAPIDelete\n\n\nBeforeDelete is only called before a 3rd-party client triggers a delete to the \ndatabase. By returning a non-nil \nerror\n value, the item will not be deleted.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nBeforeAPIDelete\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nAfterAPIDelete\n\n\nAfterAPIDelete is only called after a 3rd-party client triggers a delete to the \ndatabase.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nAfterAPIDelete\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nBeforeAPIUpdate\n\n\nBeforeAPIUpdate is only called before a 3rd-party client triggers an update to \nthe database. By returning a non-nil \nerror\n value, the item will not be updated.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nBeforeAPIUpdate\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nAfterAPIUpdate\n\n\nAfterAPIUpdate is only called after a 3rd-party client triggers an update to \nthe database.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nAfterAPIUpdate\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nBeforeAdminCreate\n\n\nBeforeAdminCreate is only called before a CMS Admin creates a new Content item.\nIt is not called for subsequent saves to the item once it has been created and \nassigned an ID. By returning a non-nil \nerror\n value, the item will not be created.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nBeforeAdminCreate\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nAfterAdminCreate\n\n\nAfterAdminCreate is only called after a CMS Admin creates a new Content item.\nIt is not called for subsequent saves to the item once it has been created and \nassigned an ID.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nAfterAdminCreate\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nBeforeAdminUpdate\n\n\nBeforeAdminUpdate is only called before a CMS Admin updates a Content item. By \nreturning a non-nil \nerror\n, the item will not be updated.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nBeforeAdminUpdate\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nAfterAdminUpdate\n\n\nAfterAdminUpdate is only called after a CMS Admin updates a Content item.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nAfterAdminUpdate\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nBeforeAdminDelete\n\n\nBeforeAdminDelete is only called before a CMS Admin deletes a Content item. By\nreturning a non-nil \nerror\n value, the item will not be deleted.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nBeforeAdminDelete\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nAfterAdminDelete\n\n\nAfterAdminDelete is only called after a CMS Admin deletes a Content item.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nAfterAdminDelete\n(\nres\n \nhttp\n.\nResponseWriter\n,\n \nreq\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nBeforeEnable\n\n\nBeforeEnable is only applicable to Addon items, and is called before the addon\nchanges status to \"Enabled\". By returning a non-nil \nerror\n value, the addon\nwill not become enabled.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nBeforeEnable\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nAfterEnable\n\n\nAfterEnable is only applicable to Addon items, and is called after the addon \nchanges status to \"Enabled\".\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nAfterEnable\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nBeforeDisable\n\n\nBeforeDisable is only applicable to Addon items, and is called before the addon\nchanges status to \"Disabled\". By returning a non-nil \nerror\n value, the addon\nwill not become disabled.\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nBeforeDisable\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nAfterDisable\n\n\nAfterDisable is only applicable to Addon items, and is called after the addon \nchanges status to \"Disabled\".\n\n\nfunc\n \n(\np\n \n*\nPost\n)\n \nAfterDisable\n(\nhttp\n.\nResponseWriter\n,\n \n*\nhttp\n.\nRequest\n)\n \nerror\n \n{\n\n \nreturn\n \nnil\n\n\n}\n\n\n\n\n\n\nHookable is implemented by Item by default as no-ops which are expected to be overridden. \n\n\n\n\nNote\n\n\nreturning an error from any of these \nHookable\n methods will end the request, \ncausing it to halt immediately after the hook. For example, returning an \nerror\n \nfrom \nBeforeDelete\n will result in the content being kept in the database. \nThe same logic applies to all of these interface methods that return an error \n- \nthe error defines the behavior\n.\n\n\n\n\n\n\nitem.Identifiable\n\n\nIdentifiable enables a struct to have its ID set/get. Typically this is done to set an ID to -1 indicating it is new for DB inserts, since by default a newly initialized struct would have an ID of 0, the int zero-value, and BoltDB's starting key per bucket is 0, thus overwriting the first record.\nMost notable, Identifiable\u2019s \nString\n method is used to set a meaningful display name for an Item. \nString\n is called by default in the Admin dashboard to show the Items of certain types, and in the default creation of an Item\u2019s slug.\nIdentifiable is implemented by Item by default.\n\n\nMethod Set\n\n\ntype\n \nIdentifiable\n \ninterface\n \n{\n\n \nItemID\n()\n \nint\n\n \nSetItemID\n(\nint\n)\n\n \nUniqueID\n()\n \nuuid\n.\nUUID\n\n \nString\n()\n \nstring\n\n\n}\n\n\n\n\n\n\nImplementation\n\n\nitem.Identifiable\n has a default implementation in the \nsystem/item\n package. \nIt is not advised to override these methods, with the exception of \nString()\n, \nwhich is commonly used to set the display name of Content items when listed in \nthe CMS, and to customize slugs.\n\n\nfunc\n \n(\ni\n \nItem\n)\n \nItemID\n()\n \nint\n \n{\n\n \nreturn\n \ni\n.\nID\n\n\n}\n\n\n\nfunc\n \n(\ni\n \n*\nItem\n)\n \nSetItemID\n(\nid\n \nint\n)\n \n{\n\n \ni\n.\nID\n \n=\n \nid\n\n\n}\n\n\n\nfunc\n \n(\ni\n \nItem\n)\n \nUniqueID\n()\n \nuuid\n.\nUUID\n \n{\n\n \nreturn\n \ni\n.\nUUID\n\n\n}\n\n\n\nfunc\n \n(\ni\n \nItem\n)\n \nString\n()\n \nstring\n \n{\n\n \nreturn\n \nfmt\n.\nSprintf\n(\nItem ID: %s\n,\n \ni\n.\nUniqueID\n())\n\n\n}\n\n\n\n\n\n\n\n\nitem.Sluggable\n\n\nSluggable makes a struct locatable by URL with it's own path. As an Item implementing Sluggable, slugs may overlap. If this is an issue, make your content struct (or one which embeds Item) implement Sluggable and it will override the slug created by Item's \nSetSlug\n method with your own.\nIt is not recommended to override \nSetSlug\n, but rather the \nString\n method on your content struct, which will have a similar, more predictable effect.\nSluggable is implemented by Item by default.\n\n\nMethod Set\n\n\ntype\n \nSluggable\n \ninterface\n \n{\n\n \nSetSlug\n(\nstring\n)\n\n \nItemSlug\n()\n \nstring\n\n\n}\n\n\n\n\n\n\nImplementation\n\n\nitem.Sluggable\n has a default implementation in the \nsystem/item\n package. It is\npossible to override these methods on your own Content types, but beware, behavior\nis undefined. It is tempting to override the \nSetSlug()\n method to customize your\nContent item slug, but try first to override the \nString()\n method found in the\n\nitem.Identifiable\n interface instead. If you don't get the desired results, try\n\nSetSlug()\n.\n\n\nfunc\n \n(\ni\n \n*\nItem\n)\n \nSetSlug\n(\nslug\n \nstring\n)\n \n{\n\n \ni\n.\nSlug\n \n=\n \nslug\n\n\n}\n\n\n\nfunc\n \n(\ni\n \n*\nItem\n)\n \nItemSlug\n()\n \nstring\n \n{\n\n \nreturn\n \ni\n.\nSlug\n\n\n}\n\n\n\n\n\n\n\n\nitem.Sortable\n\n\nSortable enables items to be sorted by time, as per the sort.Interface interface. Sortable is implemented by Item by default.\n\n\nMethod Set\n\n\ntype\n \nSortable\n \ninterface\n \n{\n\n \nTime\n()\n \nint64\n\n \nTouch\n()\n \nint64\n\n\n}\n\n\n\n\n\n\nImplementation\n\n\nitem.Sortable\n has a default implementation in the \nsystem/item\n package. It is\npossible to override these methods on your own Content type, but beware, behavior \nis undefined.\n\n\nfunc\n \n(\ni\n \nItem\n)\n \nTime\n()\n \nint64\n \n{\n\n \nreturn\n \ni\n.\nTimestamp\n\n\n}\n\n\n\nfunc\n \n(\ni\n \nItem\n)\n \nTouch\n()\n \nint64\n \n{\n\n \nreturn\n \ni\n.\nUpdated\n\n\n}",
+ "title": "Item"
+ },
+ {
+ "location": "/Interfaces/Item/#interfaces",
+ "text": "",
+ "title": "Interfaces"
+ },
+ {
+ "location": "/Interfaces/Item/#itempushable",
+ "text": "Pushable, if HTTP/2 Server Push \nis supported by the client, can tell a handler which resources it would like to \nhave \"pushed\" preemptively to the client. This saves follow-on roundtrip requests \nfor other items which are referenced by the Pushable item. The Push method, the \nonly method in Pushable, must return a []string containing the json field tags \nof the referenced items within the type.",
+ "title": "item.Pushable"
+ },
+ {
+ "location": "/Interfaces/Item/#method-set",
+ "text": "type Pushable interface { \n // the values contained in fields returned by Push must be URL paths \n Push () [] string }",
+ "title": "Method Set"
+ },
+ {
+ "location": "/Interfaces/Item/#implementation",
+ "text": "The Push method returns a []string containing the json tag field names for\nwhich you want to have pushed to a supported client. The values for the field\nnames must be URL paths, and cannot be from another origin. type Post struct { \n item . Item \n\n HeaderPhoto string `json: header_photo ` \n Author string `json: author ` // reference `/api/content/?type=Author id=2` \n // ... } func ( p * Post ) Push () [] string { \n return [] string { \n header_photo , \n author , \n } }",
+ "title": "Implementation"
+ },
+ {
+ "location": "/Interfaces/Item/#itemhideable",
+ "text": "Hideable tells an API handler that data of this type shouldn\u2019t be exposed outside \nthe system. Hideable types cannot be used as references (relations in Content types).\nThe Hide method, the only method in Hideable, takes an http.ResponseWriter, *http.Request \nand returns an error . A special error in the items package, ErrAllowHiddenItem \ncan be returned as the error from Hide to instruct handlers to show hidden \ncontent in specific cases.",
+ "title": "item.Hideable"
+ },
+ {
+ "location": "/Interfaces/Item/#method-set_1",
+ "text": "type Hideable interface { \n Hide ( http . ResponseWriter , * http . Request ) error }",
+ "title": "Method Set"
+ },
+ {
+ "location": "/Interfaces/Item/#implementation_1",
+ "text": "func ( p * Post ) Hide ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "Implementation"
+ },
+ {
+ "location": "/Interfaces/Item/#itemomittable",
+ "text": "Omittable tells a content API handler to keep certain fields from being exposed \nthrough the JSON response. It's single method, Omit takes no arguments and \nreturns a []string which must be made up of the JSON struct tags for the type \ncontaining fields to be omitted.",
+ "title": "item.Omittable"
+ },
+ {
+ "location": "/Interfaces/Item/#method-set_2",
+ "text": "type Omittable interface { \n Omit () [] string }",
+ "title": "Method Set"
+ },
+ {
+ "location": "/Interfaces/Item/#implementation_2",
+ "text": "type Post struct { \n item . Item \n\n HeaderPhoto string `json: header_photo ` \n Author string `json: author ` \n // ... } func ( p * Post ) Omit () [] string { \n return [] string { \n header_photo , \n author , \n } }",
+ "title": "Implementation"
+ },
+ {
+ "location": "/Interfaces/Item/#itemhookable",
+ "text": "Hookable provides lifecycle hooks into the http handlers which manage Save, Delete,\nApprove, and Reject routines. All methods in its set take an http.ResponseWriter, *http.Request and return an error .",
+ "title": "item.Hookable"
+ },
+ {
+ "location": "/Interfaces/Item/#method-set_3",
+ "text": "type Hookable interface { \n BeforeAPICreate ( http . ResponseWriter , * http . Request ) error \n AfterAPICreate ( http . ResponseWriter , * http . Request ) error \n\n BeforeAPIUpdate ( http . ResponseWriter , * http . Request ) error \n AfterAPIUpdate ( http . ResponseWriter , * http . Request ) error \n\n BeforeAPIDelete ( http . ResponseWriter , * http . Request ) error \n AfterAPIDelete ( http . ResponseWriter , * http . Request ) error \n\n BeforeAdminCreate ( http . ResponseWriter , * http . Request ) error \n AfterAdminCreate ( http . ResponseWriter , * http . Request ) error \n\n BeforeAdminUpdate ( http . ResponseWriter , * http . Request ) error \n AfterAdminUpdate ( http . ResponseWriter , * http . Request ) error \n\n BeforeAdminDelete ( http . ResponseWriter , * http . Request ) error \n AfterAdminDelete ( http . ResponseWriter , * http . Request ) error \n\n BeforeSave ( http . ResponseWriter , * http . Request ) error \n AfterSave ( http . ResponseWriter , * http . Request ) error \n\n BeforeDelete ( http . ResponseWriter , * http . Request ) error \n AfterDelete ( http . ResponseWriter , * http . Request ) error \n\n BeforeApprove ( http . ResponseWriter , * http . Request ) error \n AfterApprove ( http . ResponseWriter , * http . Request ) error \n\n BeforeReject ( http . ResponseWriter , * http . Request ) error \n AfterReject ( http . ResponseWriter , * http . Request ) error \n\n // Enable/Disable used exclusively for addons \n BeforeEnable ( http . ResponseWriter , * http . Request ) error \n AfterEnable ( http . ResponseWriter , * http . Request ) error \n\n BeforeDisable ( http . ResponseWriter , * http . Request ) error \n AfterDisable ( http . ResponseWriter , * http . Request ) error }",
+ "title": "Method Set"
+ },
+ {
+ "location": "/Interfaces/Item/#implementations",
+ "text": "",
+ "title": "Implementations"
+ },
+ {
+ "location": "/Interfaces/Item/#beforeapicreate",
+ "text": "BeforeAPICreate is called before an item is created via a 3rd-party client. If a \nnon-nil error value is returned, the item will not be created/saved. func ( p * Post ) BeforeAPICreate ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "BeforeAPICreate"
+ },
+ {
+ "location": "/Interfaces/Item/#afterapicreate",
+ "text": "AfterAPICreate is called after an item has been created via a 3rd-party client.\nAt this point, the item has been saved to the database. If a non-nil error is\nreturned, it will respond to the client with an empty response, so be sure to \nuse the http.ResponseWriter from within your hook appropriately. func ( p * Post ) AfterAPICreate ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "AfterAPICreate"
+ },
+ {
+ "location": "/Interfaces/Item/#beforeapprove",
+ "text": "BeforeApprove is called before an item is merged as \"Public\" from its prior \nstatus as \"Pending\". If a non-nil error value is returned, the item will not be\nappproved, and an error message is displayed to the Admin. func ( p * Post ) BeforeApprove ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "BeforeApprove"
+ },
+ {
+ "location": "/Interfaces/Item/#afterapprove",
+ "text": "AfterApprove is called after an item has been merged as \"Public\" from its prior\nstatus as \"Pending\". If a non-nil error is returned, an error message is \ndisplayed to the Admin, however the item will already be irreversibly merged. func ( p * Post ) AfterApprove ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "AfterApprove"
+ },
+ {
+ "location": "/Interfaces/Item/#beforereject",
+ "text": "BeforeReject is called before an item is rejected and deleted by default. To reject\nan item, but not delete it, return a non-nil error from this hook - doing so \nwill allow the hook to do what you want it to do prior to the return, but the item\nwill remain in the \"Pending\" section. func ( p * Post ) BeforeReject ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "BeforeReject"
+ },
+ {
+ "location": "/Interfaces/Item/#afterreject",
+ "text": "AfterReject is called after an item is rejected and has been deleted. func ( p * Post ) AfterReject ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "AfterReject"
+ },
+ {
+ "location": "/Interfaces/Item/#beforesave",
+ "text": "BeforeSave is called before any CMS Admin or 3rd-party client triggers a save to \nthe database. This could be done by clicking the 'Save' button on a Content editor, \nor by a API call to Create or Update the Content item. By returning a non-nil error value, the item will not be saved. func ( p * Post ) BeforeSave ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "BeforeSave"
+ },
+ {
+ "location": "/Interfaces/Item/#aftersave",
+ "text": "AfterSave is called after any CMS Admin or 3rd-party client triggers a save to \nthe database. This could be done by clicking the 'Save' button on a Content editor, \nor by a API call to Create or Update the Content item. func ( p * Post ) AfterSave ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "AfterSave"
+ },
+ {
+ "location": "/Interfaces/Item/#beforedelete",
+ "text": "BeforeDelete is called before any CMS Admin or 3rd-party client triggers a delete to \nthe database. This could be done by clicking the 'Delete' button on a Content editor, \nor by a API call to Delete the Content item. By returning a non-nil error value,\nthe item will not be deleted. func ( p * Post ) BeforeDelete ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "BeforeDelete"
+ },
+ {
+ "location": "/Interfaces/Item/#afterdelete",
+ "text": "AfterSave is called after any CMS Admin or 3rd-party client triggers a delete to \nthe database. This could be done by clicking the 'Delete' button on a Content editor, \nor by a API call to Delete the Content item. func ( p * Post ) AfterDelete ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "AfterDelete"
+ },
+ {
+ "location": "/Interfaces/Item/#beforeapidelete",
+ "text": "BeforeDelete is only called before a 3rd-party client triggers a delete to the \ndatabase. By returning a non-nil error value, the item will not be deleted. func ( p * Post ) BeforeAPIDelete ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "BeforeAPIDelete"
+ },
+ {
+ "location": "/Interfaces/Item/#afterapidelete",
+ "text": "AfterAPIDelete is only called after a 3rd-party client triggers a delete to the \ndatabase. func ( p * Post ) AfterAPIDelete ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "AfterAPIDelete"
+ },
+ {
+ "location": "/Interfaces/Item/#beforeapiupdate",
+ "text": "BeforeAPIUpdate is only called before a 3rd-party client triggers an update to \nthe database. By returning a non-nil error value, the item will not be updated. func ( p * Post ) BeforeAPIUpdate ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "BeforeAPIUpdate"
+ },
+ {
+ "location": "/Interfaces/Item/#afterapiupdate",
+ "text": "AfterAPIUpdate is only called after a 3rd-party client triggers an update to \nthe database. func ( p * Post ) AfterAPIUpdate ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "AfterAPIUpdate"
+ },
+ {
+ "location": "/Interfaces/Item/#beforeadmincreate",
+ "text": "BeforeAdminCreate is only called before a CMS Admin creates a new Content item.\nIt is not called for subsequent saves to the item once it has been created and \nassigned an ID. By returning a non-nil error value, the item will not be created. func ( p * Post ) BeforeAdminCreate ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "BeforeAdminCreate"
+ },
+ {
+ "location": "/Interfaces/Item/#afteradmincreate",
+ "text": "AfterAdminCreate is only called after a CMS Admin creates a new Content item.\nIt is not called for subsequent saves to the item once it has been created and \nassigned an ID. func ( p * Post ) AfterAdminCreate ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "AfterAdminCreate"
+ },
+ {
+ "location": "/Interfaces/Item/#beforeadminupdate",
+ "text": "BeforeAdminUpdate is only called before a CMS Admin updates a Content item. By \nreturning a non-nil error , the item will not be updated. func ( p * Post ) BeforeAdminUpdate ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "BeforeAdminUpdate"
+ },
+ {
+ "location": "/Interfaces/Item/#afteradminupdate",
+ "text": "AfterAdminUpdate is only called after a CMS Admin updates a Content item. func ( p * Post ) AfterAdminUpdate ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "AfterAdminUpdate"
+ },
+ {
+ "location": "/Interfaces/Item/#beforeadmindelete",
+ "text": "BeforeAdminDelete is only called before a CMS Admin deletes a Content item. By\nreturning a non-nil error value, the item will not be deleted. func ( p * Post ) BeforeAdminDelete ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "BeforeAdminDelete"
+ },
+ {
+ "location": "/Interfaces/Item/#afteradmindelete",
+ "text": "AfterAdminDelete is only called after a CMS Admin deletes a Content item. func ( p * Post ) AfterAdminDelete ( res http . ResponseWriter , req * http . Request ) error { \n return nil }",
+ "title": "AfterAdminDelete"
+ },
+ {
+ "location": "/Interfaces/Item/#beforeenable",
+ "text": "BeforeEnable is only applicable to Addon items, and is called before the addon\nchanges status to \"Enabled\". By returning a non-nil error value, the addon\nwill not become enabled. func ( p * Post ) BeforeEnable ( http . ResponseWriter , * http . Request ) error { \n return nil }",
+ "title": "BeforeEnable"
+ },
+ {
+ "location": "/Interfaces/Item/#afterenable",
+ "text": "AfterEnable is only applicable to Addon items, and is called after the addon \nchanges status to \"Enabled\". func ( p * Post ) AfterEnable ( http . ResponseWriter , * http . Request ) error { \n return nil }",
+ "title": "AfterEnable"
+ },
+ {
+ "location": "/Interfaces/Item/#beforedisable",
+ "text": "BeforeDisable is only applicable to Addon items, and is called before the addon\nchanges status to \"Disabled\". By returning a non-nil error value, the addon\nwill not become disabled. func ( p * Post ) BeforeDisable ( http . ResponseWriter , * http . Request ) error { \n return nil }",
+ "title": "BeforeDisable"
+ },
+ {
+ "location": "/Interfaces/Item/#afterdisable",
+ "text": "AfterDisable is only applicable to Addon items, and is called after the addon \nchanges status to \"Disabled\". func ( p * Post ) AfterDisable ( http . ResponseWriter , * http . Request ) error { \n return nil } Hookable is implemented by Item by default as no-ops which are expected to be overridden. Note returning an error from any of these Hookable methods will end the request, \ncausing it to halt immediately after the hook. For example, returning an error \nfrom BeforeDelete will result in the content being kept in the database. \nThe same logic applies to all of these interface methods that return an error \n- the error defines the behavior .",
+ "title": "AfterDisable"
+ },
+ {
+ "location": "/Interfaces/Item/#itemidentifiable",
+ "text": "Identifiable enables a struct to have its ID set/get. Typically this is done to set an ID to -1 indicating it is new for DB inserts, since by default a newly initialized struct would have an ID of 0, the int zero-value, and BoltDB's starting key per bucket is 0, thus overwriting the first record.\nMost notable, Identifiable\u2019s String method is used to set a meaningful display name for an Item. String is called by default in the Admin dashboard to show the Items of certain types, and in the default creation of an Item\u2019s slug.\nIdentifiable is implemented by Item by default.",
+ "title": "item.Identifiable"
+ },
+ {
+ "location": "/Interfaces/Item/#method-set_4",
+ "text": "type Identifiable interface { \n ItemID () int \n SetItemID ( int ) \n UniqueID () uuid . UUID \n String () string }",
+ "title": "Method Set"
+ },
+ {
+ "location": "/Interfaces/Item/#implementation_3",
+ "text": "item.Identifiable has a default implementation in the system/item package. \nIt is not advised to override these methods, with the exception of String() , \nwhich is commonly used to set the display name of Content items when listed in \nthe CMS, and to customize slugs. func ( i Item ) ItemID () int { \n return i . ID } func ( i * Item ) SetItemID ( id int ) { \n i . ID = id } func ( i Item ) UniqueID () uuid . UUID { \n return i . UUID } func ( i Item ) String () string { \n return fmt . Sprintf ( Item ID: %s , i . UniqueID ()) }",
+ "title": "Implementation"
+ },
+ {
+ "location": "/Interfaces/Item/#itemsluggable",
+ "text": "Sluggable makes a struct locatable by URL with it's own path. As an Item implementing Sluggable, slugs may overlap. If this is an issue, make your content struct (or one which embeds Item) implement Sluggable and it will override the slug created by Item's SetSlug method with your own.\nIt is not recommended to override SetSlug , but rather the String method on your content struct, which will have a similar, more predictable effect.\nSluggable is implemented by Item by default.",
+ "title": "item.Sluggable"
+ },
+ {
+ "location": "/Interfaces/Item/#method-set_5",
+ "text": "type Sluggable interface { \n SetSlug ( string ) \n ItemSlug () string }",
+ "title": "Method Set"
+ },
+ {
+ "location": "/Interfaces/Item/#implementation_4",
+ "text": "item.Sluggable has a default implementation in the system/item package. It is\npossible to override these methods on your own Content types, but beware, behavior\nis undefined. It is tempting to override the SetSlug() method to customize your\nContent item slug, but try first to override the String() method found in the item.Identifiable interface instead. If you don't get the desired results, try SetSlug() . func ( i * Item ) SetSlug ( slug string ) { \n i . Slug = slug } func ( i * Item ) ItemSlug () string { \n return i . Slug }",
+ "title": "Implementation"
+ },
+ {
+ "location": "/Interfaces/Item/#itemsortable",
+ "text": "Sortable enables items to be sorted by time, as per the sort.Interface interface. Sortable is implemented by Item by default.",
+ "title": "item.Sortable"
+ },
+ {
+ "location": "/Interfaces/Item/#method-set_6",
+ "text": "type Sortable interface { \n Time () int64 \n Touch () int64 }",
+ "title": "Method Set"
+ },
+ {
+ "location": "/Interfaces/Item/#implementation_5",
+ "text": "item.Sortable has a default implementation in the system/item package. It is\npossible to override these methods on your own Content type, but beware, behavior \nis undefined. func ( i Item ) Time () int64 { \n return i . Timestamp } func ( i Item ) Touch () int64 { \n return i . Updated }",
+ "title": "Implementation"
+ },
+ {
+ "location": "/Interfaces/Search/",
+ "text": "Ponzu provides a set of interfaces from the \nsystem/search\n package to enable and customize full-text search access to content in your system. \nSearch is not enabled by default\n, and must be enabled per Content type individually.\n\n\nInterfaces\n\n\nsearch.Searchable\n\n\nSearchable determines how content is indexed and whether the system should index the content when it is created and updated or be removed from the index when content is deleted.\n\n\n\n\nSearch is \ndisabled\n for all Content items by default. Each Content item that should be indexed and searchable must implement the \nsearch.Searchable\n interface.\n\n\n\n\nMethod Set\n\n\ntype\n \nSearchable\n \ninterface\n \n{\n\n \nSearchMapping\n()\n \n(\n*\nmapping\n.\nIndexMappingImpl\n,\n \nerror\n)\n\n \nIndexContent\n()\n \nbool\n\n\n}\n\n\n\n\n\n\nBy default, Ponzu sets up the \nBleve's\n \"default mapping\", which is typically what you want for most content-based systems. This can be overridden by implementing your own \nSearchMapping() (*mapping.IndexMappingImpl, error)\n method on your Content type. \n\n\nThis way, all you need to do to get full-text search is to add the \nIndexContent() bool\n method to each Content type you want search enabled. Return \ntrue\n from this method to enable search. \n\n\nExample\n\n\n// ...\n\n\n\ntype\n \nSong\n \nstruct\n \n{\n\n \nitem\n.\nItem\n\n\n \nName\n \nstring\n \n`json:\nname\n`\n\n \n// ...\n\n\n}\n\n\n\nfunc\n \n(\ns\n \n*\nSong\n)\n \nIndexContent\n()\n \nbool\n \n{\n\n \nreturn\n \ntrue\n\n\n}\n\n\n\n\n\n\n\n\nIndexing Existing Content\n\n\nIf you previously had search disabled and had already added content to your system, you will need to re-index old content items in your CMS. Otherwise, they will not show up in search queries.. This requires you to manually open each item and click 'Save'. This could be scripted and Ponzu \nmight\n ship with a re-indexing function at some point in the fututre.",
+ "title": "Search"
+ },
+ {
+ "location": "/Interfaces/Search/#interfaces",
+ "text": "",
+ "title": "Interfaces"
+ },
+ {
+ "location": "/Interfaces/Search/#searchsearchable",
+ "text": "Searchable determines how content is indexed and whether the system should index the content when it is created and updated or be removed from the index when content is deleted. Search is disabled for all Content items by default. Each Content item that should be indexed and searchable must implement the search.Searchable interface.",
+ "title": "search.Searchable"
+ },
+ {
+ "location": "/Interfaces/Search/#method-set",
+ "text": "type Searchable interface { \n SearchMapping () ( * mapping . IndexMappingImpl , error ) \n IndexContent () bool } By default, Ponzu sets up the Bleve's \"default mapping\", which is typically what you want for most content-based systems. This can be overridden by implementing your own SearchMapping() (*mapping.IndexMappingImpl, error) method on your Content type. This way, all you need to do to get full-text search is to add the IndexContent() bool method to each Content type you want search enabled. Return true from this method to enable search.",
+ "title": "Method Set"
+ },
+ {
+ "location": "/Interfaces/Search/#example",
+ "text": "// ... type Song struct { \n item . Item \n\n Name string `json: name ` \n // ... } func ( s * Song ) IndexContent () bool { \n return true } Indexing Existing Content If you previously had search disabled and had already added content to your system, you will need to re-index old content items in your CMS. Otherwise, they will not show up in search queries.. This requires you to manually open each item and click 'Save'. This could be scripted and Ponzu might ship with a re-indexing function at some point in the fututre.",
+ "title": "Example"
+ },
+ {
+ "location": "/Ponzu-Addons/Creating-Addons/",
+ "text": "Coming soon\n\n\nFor a reference to creating your own addons, see:\n\nhttps://github.com/bosssauce/fbscheduler",
+ "title": "Creating Addons"
+ },
+ {
+ "location": "/Ponzu-Addons/Creating-Addons/#coming-soon",
+ "text": "For a reference to creating your own addons, see: https://github.com/bosssauce/fbscheduler",
+ "title": "Coming soon"
+ },
+ {
+ "location": "/Ponzu-Addons/Using-Addons/",
+ "text": "Coming soon\n\n\nFor a reference to creating your own addons, see:\n\nhttps://github.com/bosssauce/fbscheduler",
+ "title": "Using Addons"
+ },
+ {
+ "location": "/Ponzu-Addons/Using-Addons/#coming-soon",
+ "text": "For a reference to creating your own addons, see: https://github.com/bosssauce/fbscheduler",
+ "title": "Coming soon"
+ },
+ {
+ "location": "/Quickstart/Overview/",
+ "text": "Quickstart Steps\n\n\n1) Install \nGo 1.8+\n\n\n2) Install Ponzu CLI:\n\n\n$ go get github.com/ponzu-cms/ponzu/\u2026\n\n\n\n\n\n3) Create a new project (path is created in your GOPATH):\n\n\n$ ponzu new github.com/nilslice/reviews\n\n\n\n\n\n4) Enter your new project directory:\n\n\n$ \ncd\n \n$GOPATH\n/src/github.com/nilslice/reviews\n\n\n\n\n\n5) Generate content type file and boilerplate code (creates \ncontent/review.go\n):\n\n\n$ ponzu generate content review title:\nstring\n author:\nstring\n rating:\nfloat64\n body:\nstring\n:richtext website_url:\nstring\n items:\n[]string\n photo:string:file\n`\n\n\n\n\n\n\n6) Build your project:\n\n\n$ ponzu build\n\n\n\n\n\n7) Run your project with defaults:\n\n\n$ ponzu run\n\n\n\n\n\n8) Open browser to \nhttp://localhost:8080/admin\n\n\nNotes\n\n\n\n\nOne-time initialization to set configuration\n\n\nAll fields can be changed in Configuration afterward",
+ "title": "Overview"
+ },
+ {
+ "location": "/Quickstart/Overview/#quickstart-steps",
+ "text": "1) Install Go 1.8+ 2) Install Ponzu CLI: $ go get github.com/ponzu-cms/ponzu/\u2026 3) Create a new project (path is created in your GOPATH): $ ponzu new github.com/nilslice/reviews 4) Enter your new project directory: $ cd $GOPATH /src/github.com/nilslice/reviews 5) Generate content type file and boilerplate code (creates content/review.go ): $ ponzu generate content review title: string author: string rating: float64 body: string :richtext website_url: string items: []string photo:string:file ` 6) Build your project: $ ponzu build 7) Run your project with defaults: $ ponzu run 8) Open browser to http://localhost:8080/admin",
+ "title": "Quickstart Steps"
+ },
+ {
+ "location": "/Quickstart/Overview/#notes",
+ "text": "One-time initialization to set configuration All fields can be changed in Configuration afterward",
+ "title": "Notes"
+ },
+ {
+ "location": "/References/Overview/",
+ "text": "References in Ponzu allow you to create relationships between your Content types.\nPonzu uses an embedded database, rather than a more traditional relational database \nwith SQL support. This may seem unnatural since there is no native concept of\n\"foreign keys\" or \"joins\" like you may be used to. Instead, Ponzu wires up your\ndata using references, which are simply URL paths, like \n/api/content?type=Post\nid=1\n\n\nA foreign key as a URL path?! Am I crazy? No! For the purpose Ponzu serves, \nthis structure works quite well, especially given its creation was specifically \ntuned for HTTP/2 features such as \"Request/Response Multiplexing\" and \"Server Push.\" \n\n\nThere is a deeper dive into the HTTP/2 concepts \nbelow\n, but first we'll walk through\na quick tutorial on Ponzu's references. \n\n\nTo generate references from the CLI, please \nread through the documentation\n. \nThe example below assumes you understand the syntax. \n\n\n\n\nCreate Your Content Types\n\n\nHere we are creating two Content types, \nAuthor\n and \nBook\n. A \nBook\n will keep\na reference to an \nAuthor\n in the sense that an author wrote the book.\n\n\n$ ponzu gen c author name:string photo:string:file bio:string:textarea\n$ ponzu gen c book title:string author:@author,name pages:int year:int\n\n\n\n\n\nThe structs generated for each look like:\n\n\ncontent/author.go\n\n\ntype\n \nAuthor\n \nstruct\n \n{\n\n \nitem\n.\nItem\n\n\n \nName\n \nstring\n \n`json:\nname\n`\n\n \nPhoto\n \nstring\n \n`json:\nphoto\n`\n\n \nBio\n \nstring\n \n`json:\nbio\n`\n\n\n}\n\n\n\n\n\n\ncontent/book.go\n\n\ntype\n \nBook\n \nstruct\n \n{\n\n \nitem\n.\nItem\n\n\n \nTitle\n \nstring\n \n`json:\ntitle\n`\n\n \nAuthor\n \nstring\n \n`json:\nauthor\n`\n\n \nPages\n \nint\n \n`json:\npages\n`\n\n \nYear\n \nint\n \n`json:\nyear\n`\n\n\n}\n\n\n\n\n\n\nNotice how the \nAuthor\n field within the \nBook\n struct is a \nstring\n type, not\nan \nAuthor\n type. This is because the \nAuthor\n is stored as a \nstring\n in our\ndatabase, as a reference to the \nAuthor\n, instead of embedding the \nAuthor\n data \ninside the \nBook\n. \n\n\nSome example JSON data for the two structs looks like:\n\n\nGET\n \n/api/content?type=Author\nid=1\n (\nAuthor\n)\n\n\n{\n\n \ndata\n:\n \n[\n\n \n{\n\n \nuuid\n:\n \n024a5797-e064-4ee0-abe3-415cb6d3ed18\n,\n\n \nid\n:\n \n1\n,\n\n \nslug\n:\n \nitem-id-024a5797-e064-4ee0-abe3-415cb6d3ed18\n,\n\n \ntimestamp\n:\n \n1493926453826\n,\n\n \nupdated\n:\n \n1493926453826\n,\n\n \nname\n:\n \nShel Silverstein\n,\n\n \nphoto\n:\n \n/api/uploads/2017/05/shel-silverstein.jpg\n,\n\n \nbio\n:\n \nSheldon Allan Silverstein was an American poet...\n\n \n}\n\n \n]\n\n\n}\n\n\n\n\n\n\nGET\n \n/api/content?type=Book\nid=1\n (\nBook\n)\n\n\n{\n\n \ndata\n:\n \n[\n\n \n{\n\n \nuuid\n:\n \n024a5797-e064-4ee0-abe3-415cb6d3ed18\n,\n\n \nid\n:\n \n1\n,\n\n \nslug\n:\n \nitem-id-024a5797-e064-4ee0-abe3-415cb6d3ed18\n,\n\n \ntimestamp\n:\n \n1493926453826\n,\n\n \nupdated\n:\n \n1493926453826\n,\n\n \ntitle\n:\n \nThe Giving Tree\n,\n\n \nauthor\n:\n \n/api/content?type=Author\nid=1\n,\n\n \npages\n:\n \n57\n,\n\n \nyear\n:\n \n1964\n\n \n}\n\n \n]\n\n\n}\n\n\n\n\n\n\nAs you can see, the \nAuthor\n is a reference as the \nauthor\n field in the JSON\nresponse for a \nBook\n. When you're building your client, you need to make a second\nrequest for the \nAuthor\n, to the URL path found in the \nauthor\n field of the \nBook\n\nresponse. \n\n\nFor example, in pseudo-code: \n\n\n# Request 1: \n\n\n$book\n \n=\n GET /api/content?type\n=\nBook\nid\n=\n1\n\n\n\n# Request 2: \n\n\n$author\n \n=\n GET \n$book\n.author \n# where author = /api/content?type=Author\nid=1\n\n\n\n\n\n\nUntil recently, this would be considered bad practice and would be costly to do\nover HTTP. However, with the wide availability of HTTP/2 clients, including all\nmodern web browsers, mobile devices, and HTTP/2 libraries in practically every \nprogramming language, this pattern is fast and scalable. \n\n\n\n\nDesigned For HTTP/2\n\n\nAt this point, you've likely noticed that you're still making two independent \nHTTP requests to your Ponzu server. Further, if there are multiple references or more\nthan one item, you'll be making many requests -- \nhow can that be efficient?\n \n\n\nThere are two main concepts at play: Request/Response Multiplexing and Server Push.\n\n\nRequest/Response Multiplexing\n\n\nWith HTTP/2, a client and server (peers) transfer data over a single TCP connection, \nand can send data back and forth at the same time. No longer does a request need\nto wait to be sent until after an expected response is read. This means that HTTP \nrequests can be sent much faster and at the \nsame time\n on a single connection. \nWhere previously, a client would open up several TCP connections, the re-use of a \nsingle connection reduces CPU overhead and makes the server more efficient.\n\n\nThis feature is automatically provided to you when using HTTP/2 - the only \nrequirement is that you connect via HTTPS and have active TLS certificates, which \nyou can get for free by running Ponzu with the \n--https\n flag and configuring it \nwith a properly set, active domain name of your own. \n\n\nServer Push\n\n\nAnother impactful feature of HTTP/2 is \"Server Push\": the ability to preemptively\nsend a response from the server to a client without waiting for a request. This\nis where Ponzu's reference design really shows it's power. Let's revisit the\nexample from above:\n\n\n# Request 1: \n\n\n$book\n \n=\n GET /api/content?type\n=\nBook\nid\n=\n1\n\n\n\n# Request 2: \n\n\n$author\n \n=\n GET \n$book\n.author \n# where author = /api/content?type=Author\nid=1\n\n\n\n\n\n\nInstead of waiting for the server to respond with the data for \n$book.author\n, \nthe response data is already in the client's cache before we even make the request!\nNow there is no round-trip made to the server and back, and the client reads the \npushed response from cache in fractions of a millisecond. \n\n\nBut, how does the server know which response to push and when? You'll need to \nspecify which fields of the type you've requested should be pushed. This is done\nby implementing the \nitem.Pushable\n interface\n. \nSee the example below which demonstrates a complete implementation on the \nBook\n\nstruct, which has a reference to an \nAuthor\n.\n\n\nExample\n\n\ncontent/book.go\n\n\n...\n\n\ntype\n \nBook\n \nstruct\n \n{\n\n \nitem\n.\nItem\n\n\n \nTitle\n \nstring\n \n`json:\ntitle\n`\n\n \nAuthor\n \nstring\n \n`json:\nauthor\n`\n\n \nPages\n \nint\n \n`json:\npages\n`\n\n \nYear\n \nint\n \n`json:\nyear\n`\n\n\n}\n\n\n\n\nfunc\n \n(\nb\n \n*\nBook\n)\n \nPush\n()\n \n[]\nstring\n \n{\n\n \nreturn\n \n[]\nstring\n{\n\n \n// the json struct tag is used to tell the server which\n\n \n// field(s) it should push - only URL paths originating\n\n \n// from your server can be pushed!\n\n \nauthor\n,\n \n \n}\n\n\n}\n\n\n...\n\n\n\n\n\n\nNow, whenever a single \nBook\n is requested, the server will preemptively push the\n\nAuthor\n referenced by the book. The response for the \nAuthor\n will \nalready be\non the client\n and will remain there until a request for the referenced \nAuthor\n \nhas been made.\n\n\n\n\nWhat else can I Push?\n\n\nOnly fields that are URL paths originating from your server can be pushed. \nThis means that you could also implement \nitem.Pushable\n on the \nAuthor\n\ntype, and return \n[]string{\"photo\"}\n to push the Author's image!\n\n\n\n\n\n\nOther Considerations\n\n\nHTTP/2 Server Push is a powerful feature, but it can be abused just like anything\nelse. To try and help mitigate potential issues, Ponzu has put some \"stop-gaps\"\nin place. Server Push is only activated on \nsingle item\n API responses, so you\nshouldn't expect to see references or files pushed from the \n/api/contents\n endpoint.\nAn exception to this is the \n/api/search\n endpoint, which only the \nfirst\n \nresult is pushed (if applicable) no matter how many items are in the response. \n\n\nYou should take advantage of HTTP/2 in Ponzu and get the most out of the system. \nWith the automatic HTTPS feature, there is no reason not to and you gain the \nadditional benefit of encrypting your traffic - which your users will appreciate!",
+ "title": "Overview"
+ },
+ {
+ "location": "/References/Overview/#create-your-content-types",
+ "text": "Here we are creating two Content types, Author and Book . A Book will keep\na reference to an Author in the sense that an author wrote the book. $ ponzu gen c author name:string photo:string:file bio:string:textarea\n$ ponzu gen c book title:string author:@author,name pages:int year:int The structs generated for each look like: content/author.go type Author struct { \n item . Item \n\n Name string `json: name ` \n Photo string `json: photo ` \n Bio string `json: bio ` } content/book.go type Book struct { \n item . Item \n\n Title string `json: title ` \n Author string `json: author ` \n Pages int `json: pages ` \n Year int `json: year ` } Notice how the Author field within the Book struct is a string type, not\nan Author type. This is because the Author is stored as a string in our\ndatabase, as a reference to the Author , instead of embedding the Author data \ninside the Book . Some example JSON data for the two structs looks like: GET /api/content?type=Author id=1 ( Author ) { \n data : [ \n { \n uuid : 024a5797-e064-4ee0-abe3-415cb6d3ed18 , \n id : 1 , \n slug : item-id-024a5797-e064-4ee0-abe3-415cb6d3ed18 , \n timestamp : 1493926453826 , \n updated : 1493926453826 , \n name : Shel Silverstein , \n photo : /api/uploads/2017/05/shel-silverstein.jpg , \n bio : Sheldon Allan Silverstein was an American poet... \n } \n ] } GET /api/content?type=Book id=1 ( Book ) { \n data : [ \n { \n uuid : 024a5797-e064-4ee0-abe3-415cb6d3ed18 , \n id : 1 , \n slug : item-id-024a5797-e064-4ee0-abe3-415cb6d3ed18 , \n timestamp : 1493926453826 , \n updated : 1493926453826 , \n title : The Giving Tree , \n author : /api/content?type=Author id=1 , \n pages : 57 , \n year : 1964 \n } \n ] } As you can see, the Author is a reference as the author field in the JSON\nresponse for a Book . When you're building your client, you need to make a second\nrequest for the Author , to the URL path found in the author field of the Book \nresponse. For example, in pseudo-code: # Request 1: $book = GET /api/content?type = Book id = 1 # Request 2: $author = GET $book .author # where author = /api/content?type=Author id=1 Until recently, this would be considered bad practice and would be costly to do\nover HTTP. However, with the wide availability of HTTP/2 clients, including all\nmodern web browsers, mobile devices, and HTTP/2 libraries in practically every \nprogramming language, this pattern is fast and scalable.",
+ "title": "Create Your Content Types"
+ },
+ {
+ "location": "/References/Overview/#designed-for-http2",
+ "text": "At this point, you've likely noticed that you're still making two independent \nHTTP requests to your Ponzu server. Further, if there are multiple references or more\nthan one item, you'll be making many requests -- how can that be efficient? There are two main concepts at play: Request/Response Multiplexing and Server Push.",
+ "title": "Designed For HTTP/2"
+ },
+ {
+ "location": "/References/Overview/#requestresponse-multiplexing",
+ "text": "With HTTP/2, a client and server (peers) transfer data over a single TCP connection, \nand can send data back and forth at the same time. No longer does a request need\nto wait to be sent until after an expected response is read. This means that HTTP \nrequests can be sent much faster and at the same time on a single connection. \nWhere previously, a client would open up several TCP connections, the re-use of a \nsingle connection reduces CPU overhead and makes the server more efficient. This feature is automatically provided to you when using HTTP/2 - the only \nrequirement is that you connect via HTTPS and have active TLS certificates, which \nyou can get for free by running Ponzu with the --https flag and configuring it \nwith a properly set, active domain name of your own.",
+ "title": "Request/Response Multiplexing"
+ },
+ {
+ "location": "/References/Overview/#server-push",
+ "text": "Another impactful feature of HTTP/2 is \"Server Push\": the ability to preemptively\nsend a response from the server to a client without waiting for a request. This\nis where Ponzu's reference design really shows it's power. Let's revisit the\nexample from above: # Request 1: $book = GET /api/content?type = Book id = 1 # Request 2: $author = GET $book .author # where author = /api/content?type=Author id=1 Instead of waiting for the server to respond with the data for $book.author , \nthe response data is already in the client's cache before we even make the request!\nNow there is no round-trip made to the server and back, and the client reads the \npushed response from cache in fractions of a millisecond. But, how does the server know which response to push and when? You'll need to \nspecify which fields of the type you've requested should be pushed. This is done\nby implementing the item.Pushable interface . \nSee the example below which demonstrates a complete implementation on the Book \nstruct, which has a reference to an Author .",
+ "title": "Server Push"
+ },
+ {
+ "location": "/References/Overview/#example",
+ "text": "content/book.go ... type Book struct { \n item . Item \n\n Title string `json: title ` \n Author string `json: author ` \n Pages int `json: pages ` \n Year int `json: year ` } func ( b * Book ) Push () [] string { \n return [] string { \n // the json struct tag is used to tell the server which \n // field(s) it should push - only URL paths originating \n // from your server can be pushed! \n author , \n } } ... Now, whenever a single Book is requested, the server will preemptively push the Author referenced by the book. The response for the Author will already be\non the client and will remain there until a request for the referenced Author \nhas been made. What else can I Push? Only fields that are URL paths originating from your server can be pushed. \nThis means that you could also implement item.Pushable on the Author \ntype, and return []string{\"photo\"} to push the Author's image!",
+ "title": "Example"
+ },
+ {
+ "location": "/References/Overview/#other-considerations",
+ "text": "HTTP/2 Server Push is a powerful feature, but it can be abused just like anything\nelse. To try and help mitigate potential issues, Ponzu has put some \"stop-gaps\"\nin place. Server Push is only activated on single item API responses, so you\nshouldn't expect to see references or files pushed from the /api/contents endpoint.\nAn exception to this is the /api/search endpoint, which only the first \nresult is pushed (if applicable) no matter how many items are in the response. You should take advantage of HTTP/2 in Ponzu and get the most out of the system. \nWith the automatic HTTPS feature, there is no reason not to and you gain the \nadditional benefit of encrypting your traffic - which your users will appreciate!",
+ "title": "Other Considerations"
+ },
+ {
+ "location": "/Running-Backups/Backups/",
+ "text": "Both the databases \nsystem.db\n \n \nanalytics.db\n, and the \n/uploads\n directory can be backed up over HTTP using \nwget\n, \ncurl\n, etc. All of which are located at the \n/admin/backup\n route and require HTTP Basic Auth. In order to enable backups, you must add a user/password pair inside the CMS Configuration at \n/admin/configure\n near the bottom of the page.\n\n\nAll backups are made using a \nGET\n request to the \n/admin/backup\n path with a query parameter of \n?source={system,analytics,uploads}\n (only one source can be included in the URL).\n\n\nHere are some full backup scripts to use or modify to fit your needs:\n\nhttps://github.com/ponzu-cms/backup-scripts\n\n\nSystem \n Analytics\n\n\nThe \nsystem.db\n \n \nanalytics.db\n data files are sent uncompressed in their original form as they exist on your server. No temporary copy is stored on the origin server, and it is possible that the backup could fail so checking for successful backups is recommended. See https://github.com/boltdb/bolt#database-backups for more information about how BoltDB handles HTTP backups.\n\n\nAn example backup request for the \nsystem.db\n data file would look like:\n\n\n$ curl --user user:pass \nhttps://example.com/admin/backup?source=system\n \n system.db.bak\n\n\n\n\n\nUploads\n\n\nThe \n/uploads\n directory is gzip compressed and archived as a tar file, stored in the temporary directory (typically \n/tmp\n on Linux) on your origin server with a timestamp in the file name. \n\n\nAn example backup request for the \n/uploads\n directory would look like:\n\n\n$ curl --user user:pass \nhttps://example.com/admin/backup?source=uploads\n \n uploads.tar.gz\n\n# unarchive the tarball with gzip \n\n$ tar xzf uploads.tar.gz",
+ "title": "Backups"
+ },
+ {
+ "location": "/Running-Backups/Backups/#system-analytics",
+ "text": "The system.db analytics.db data files are sent uncompressed in their original form as they exist on your server. No temporary copy is stored on the origin server, and it is possible that the backup could fail so checking for successful backups is recommended. See https://github.com/boltdb/bolt#database-backups for more information about how BoltDB handles HTTP backups. An example backup request for the system.db data file would look like: $ curl --user user:pass https://example.com/admin/backup?source=system system.db.bak",
+ "title": "System &amp; Analytics"
+ },
+ {
+ "location": "/Running-Backups/Backups/#uploads",
+ "text": "The /uploads directory is gzip compressed and archived as a tar file, stored in the temporary directory (typically /tmp on Linux) on your origin server with a timestamp in the file name. An example backup request for the /uploads directory would look like: $ curl --user user:pass https://example.com/admin/backup?source=uploads uploads.tar.gz # unarchive the tarball with gzip \n$ tar xzf uploads.tar.gz",
+ "title": "Uploads"
+ },
+ {
+ "location": "/System-Configuration/Settings/",
+ "text": "Ponzu has several options which can be configured at run-time. To view these\nconfiguration settings, visit the \n/admin/configure\n page of your Ponzu CMS.\n\n\n\n\nSite Name\n\n\nThe Site Name setting changes the displayed name on your admin dashboard. This is\nvisible publicly on the \n/admin/login\n page.\n\n\n\n\nDomain Name\n\n\nInternally, Ponzu needs to know where its canonical HTTP access origin is, and\nrequires you to add the qualified domain name you are using. In development, use \n\nlocalhost\n or some other name mapped to the loopback address (\n127.0.0.1\n).\n\n\nOnce you have deployed your Ponzu server to a remote host and pointed a public \ndomain at it, you need to change the Domain Name setting to match. This is \nespecially important when fetching TLS (SSL) certificates from \nLet's Encrypt\n\n- since the process requires an active, verifiable domain. To set up your server\nwith TLS over HTTPS connections, follow these steps:\n\n\n\n\nSet your Domain Name in the system configuration\n\n\nSet the Administrator Email to register with Let's Encrypt\n\n\nStop your Ponzu server\n\n\nRun your Ponzu server with the \n--https\n flag e.g. \n$ ponzu run --https\n\n\nVisit your CMS admin with \nhttps://\n prepended to your URL\n\n\n\n\n\n\nVerifying HTTPS / TLS Connections\n\n\nIf successful, your APIs and CMS will be accessible via HTTPS, and you will\nsee a green indicator near the URL bar of most browsers. This also enables \nyour server to use the HTTP/2 protocol.\n\n\n\n\nDevelopment Environment\n\n\nYou can test HTTPS \n HTTP/2 connections in your development environment on \nlocalhost\n,\nby running Ponzu with the \n--devhttps\n flag e.g. \n$ ponzu --devhttps run\n \n\n\nIf you're greeted with a warning from the browser saying the connection is not\nsecure, follow the steps outlined in the CLI message, or here:\n\n\nIf your browser rejects HTTPS requests, try allowing insecure connections on localhost.\non Chrome, visit chrome://flags/#allow-insecure-localhost\n\n\n\n\n\n\n\nAdministrator Email\n\n\nThe Administrator Email is the contact email for the person who is the main admin\nof your Ponzu CMS. This can be changed at any point, but once a Let's Encrypt\ncertificate has been fetched using an Administrator Email, it will remain the \ncontact until a new certificate is requested. \n\n\n\n\nClient Secret\n\n\nThe Client Secret is a secure value used by the server to sign tokens and authenticate requests.\n\nDo not share this\n value with any untrusted party.\n\n\n\n\nSecurity and the Client Secret\n\n\nHTTP requests with a valid token, signed with the Client Secret, can take any\naction an Admin can within the CMS. Be cautious of this when sharing account\nlogins or details with anyone.\n\n\n\n\n\n\nEtag Header\n\n\nThe Etag Header value is automatically created when content is changed and serves\nas a caching validation mechanism.\n\n\n\n\nCORS\n\n\nCORS, or \"Cross-Origin Resource Sharing\" is a security setting which defines how\nresources (or URLs) can be accessed from outside clients / domains. By default, \nPonzu HTTP APIs can be accessed from any origin, meaning a script from an unknown\nwebsite could fetch data. \n\n\nBy disabling CORS, you limit API requests to only the Domain Name you set.\n\n\n\n\nGZIP\n\n\nGZIP is a popular codec which when applied to most HTTP responses, decreases data\ntransmission size and response times. The GZIP setting on Ponzu has a minor \nside-effect of using more CPU, so you can disable it if you notice your system \nis CPU-constrained. However, traffic levels would need to be extremely demanding\nfor this to be noticeable.\n\n\n\n\nHTTP Cache\n\n\nThe HTTP Cache configuration allows a system to disable the default HTTP cache,\nwhich saves the server from repeating API queries and sending responses -- it's\ngenerally advised to keep this enabled unless you have \nfrequently\n changing data.\n\n\nThe \nMax-Age\n value setting overrides the default 2592000-second (30 day) cache\n\nmax-age\n duration set in API response headers. The \n0\n value is an alias to \n\n2592000\n, so check the \nDisable HTTP Cache\n box if you don't want any caching.\n\n\n\n\nInvalidate Cache\n\n\nIf this box is checked and then the configuration is saved, the server will \nre-generate an Etag to send in responses. By doing so, the cache becomes invalidated\nand reset so new content or assets will be included in previously cached responses.\n\n\nThe cache is invalidated when content changes, so this is typically not a widely \nused setting.\n\n\n\n\nDatabase Backup Credentials\n\n\nIn order to enable HTTP backups of the components that make up your system, you\nwill need to add an HTTP Basic Auth user and password pair. When used to \n\nrun backups\n, the \nuser:password\n pair tells your server\nthat the backup request is made from a trusted party. \n\n\n\n\nBackup Access with Credentials\n\n\nThis \nuser:password\n pair should not be shared outside of your organization as \nit allows full database downloads and archives of your system's uploads.",
+ "title": "Settings"
+ },
+ {
+ "location": "/System-Configuration/Settings/#site-name",
+ "text": "The Site Name setting changes the displayed name on your admin dashboard. This is\nvisible publicly on the /admin/login page.",
+ "title": "Site Name"
+ },
+ {
+ "location": "/System-Configuration/Settings/#domain-name",
+ "text": "Internally, Ponzu needs to know where its canonical HTTP access origin is, and\nrequires you to add the qualified domain name you are using. In development, use localhost or some other name mapped to the loopback address ( 127.0.0.1 ). Once you have deployed your Ponzu server to a remote host and pointed a public \ndomain at it, you need to change the Domain Name setting to match. This is \nespecially important when fetching TLS (SSL) certificates from Let's Encrypt \n- since the process requires an active, verifiable domain. To set up your server\nwith TLS over HTTPS connections, follow these steps: Set your Domain Name in the system configuration Set the Administrator Email to register with Let's Encrypt Stop your Ponzu server Run your Ponzu server with the --https flag e.g. $ ponzu run --https Visit your CMS admin with https:// prepended to your URL Verifying HTTPS / TLS Connections If successful, your APIs and CMS will be accessible via HTTPS, and you will\nsee a green indicator near the URL bar of most browsers. This also enables \nyour server to use the HTTP/2 protocol.",
+ "title": "Domain Name"
+ },
+ {
+ "location": "/System-Configuration/Settings/#development-environment",
+ "text": "You can test HTTPS HTTP/2 connections in your development environment on localhost ,\nby running Ponzu with the --devhttps flag e.g. $ ponzu --devhttps run If you're greeted with a warning from the browser saying the connection is not\nsecure, follow the steps outlined in the CLI message, or here: If your browser rejects HTTPS requests, try allowing insecure connections on localhost.\non Chrome, visit chrome://flags/#allow-insecure-localhost",
+ "title": "Development Environment"
+ },
+ {
+ "location": "/System-Configuration/Settings/#administrator-email",
+ "text": "The Administrator Email is the contact email for the person who is the main admin\nof your Ponzu CMS. This can be changed at any point, but once a Let's Encrypt\ncertificate has been fetched using an Administrator Email, it will remain the \ncontact until a new certificate is requested.",
+ "title": "Administrator Email"
+ },
+ {
+ "location": "/System-Configuration/Settings/#client-secret",
+ "text": "The Client Secret is a secure value used by the server to sign tokens and authenticate requests. Do not share this value with any untrusted party. Security and the Client Secret HTTP requests with a valid token, signed with the Client Secret, can take any\naction an Admin can within the CMS. Be cautious of this when sharing account\nlogins or details with anyone.",
+ "title": "Client Secret"
+ },
+ {
+ "location": "/System-Configuration/Settings/#etag-header",
+ "text": "The Etag Header value is automatically created when content is changed and serves\nas a caching validation mechanism.",
+ "title": "Etag Header"
+ },
+ {
+ "location": "/System-Configuration/Settings/#cors",
+ "text": "CORS, or \"Cross-Origin Resource Sharing\" is a security setting which defines how\nresources (or URLs) can be accessed from outside clients / domains. By default, \nPonzu HTTP APIs can be accessed from any origin, meaning a script from an unknown\nwebsite could fetch data. By disabling CORS, you limit API requests to only the Domain Name you set.",
+ "title": "CORS"
+ },
+ {
+ "location": "/System-Configuration/Settings/#gzip",
+ "text": "GZIP is a popular codec which when applied to most HTTP responses, decreases data\ntransmission size and response times. The GZIP setting on Ponzu has a minor \nside-effect of using more CPU, so you can disable it if you notice your system \nis CPU-constrained. However, traffic levels would need to be extremely demanding\nfor this to be noticeable.",
+ "title": "GZIP"
+ },
+ {
+ "location": "/System-Configuration/Settings/#http-cache",
+ "text": "The HTTP Cache configuration allows a system to disable the default HTTP cache,\nwhich saves the server from repeating API queries and sending responses -- it's\ngenerally advised to keep this enabled unless you have frequently changing data. The Max-Age value setting overrides the default 2592000-second (30 day) cache max-age duration set in API response headers. The 0 value is an alias to 2592000 , so check the Disable HTTP Cache box if you don't want any caching.",
+ "title": "HTTP Cache"
+ },
+ {
+ "location": "/System-Configuration/Settings/#invalidate-cache",
+ "text": "If this box is checked and then the configuration is saved, the server will \nre-generate an Etag to send in responses. By doing so, the cache becomes invalidated\nand reset so new content or assets will be included in previously cached responses. The cache is invalidated when content changes, so this is typically not a widely \nused setting.",
+ "title": "Invalidate Cache"
+ },
+ {
+ "location": "/System-Configuration/Settings/#database-backup-credentials",
+ "text": "In order to enable HTTP backups of the components that make up your system, you\nwill need to add an HTTP Basic Auth user and password pair. When used to run backups , the user:password pair tells your server\nthat the backup request is made from a trusted party. Backup Access with Credentials This user:password pair should not be shared outside of your organization as \nit allows full database downloads and archives of your system's uploads.",
+ "title": "Database Backup Credentials"
+ },
+ {
+ "location": "/System-Deployment/Docker/",
+ "text": "Ponzu Docker build\n\n\nPonzu is distributed as a \ndocker image\n, \nwhich aids in ponzu deployment. The Dockerfile in this directory is used by Ponzu \nto generate the docker image which contains the ponzu executable.\n\n\nIf you are deploying your own Ponzu project, you can write a new Dockerfile that\nis based from the \nponzu/ponzu\n image of your choice. For example:\n\n\nFROM\n ponzu/ponzu:latest\n\n\n\n# your project set up ...\n\n\n# ...\n\n\n# ...\n\n\n\n\n\n\nThe following are convenient commands during development of Ponzu core:\n\n\nBuild the docker image. Run from the root of the project.\n\n\n# from the root of ponzu:\n\ndocker build -t ponzu-dev\n\n\n\n\n\nStart the image, share the local directory and pseudo terminal (tty) into for debugging:\n\n\ndocker run -v \n$(\npwd\n)\n:/go/src/github.com/ponzu-cms/ponzu -it ponzu-dev\n\npwd\n \n# will output the go src directory for ponzu\n\nponzu version \n# will output the ponzu version\n\n\n# make an edit on your local and rebuild\n\ngo install ./...\n\n\n\n\n\nSpecial thanks to \n@krismeister\n for contributing this!",
+ "title": "Docker"
+ },
+ {
+ "location": "/System-Deployment/Docker/#ponzu-docker-build",
+ "text": "Ponzu is distributed as a docker image , \nwhich aids in ponzu deployment. The Dockerfile in this directory is used by Ponzu \nto generate the docker image which contains the ponzu executable. If you are deploying your own Ponzu project, you can write a new Dockerfile that\nis based from the ponzu/ponzu image of your choice. For example: FROM ponzu/ponzu:latest # your project set up ... # ... # ...",
+ "title": "Ponzu Docker build"
+ },
+ {
+ "location": "/System-Deployment/Docker/#the-following-are-convenient-commands-during-development-of-ponzu-core",
+ "text": "",
+ "title": "The following are convenient commands during development of Ponzu core:"
+ },
+ {
+ "location": "/System-Deployment/Docker/#build-the-docker-image-run-from-the-root-of-the-project",
+ "text": "# from the root of ponzu: \ndocker build -t ponzu-dev",
+ "title": "Build the docker image. Run from the root of the project."
+ },
+ {
+ "location": "/System-Deployment/Docker/#start-the-image-share-the-local-directory-and-pseudo-terminal-tty-into-for-debugging",
+ "text": "docker run -v $( pwd ) :/go/src/github.com/ponzu-cms/ponzu -it ponzu-dev pwd # will output the go src directory for ponzu \nponzu version # will output the ponzu version # make an edit on your local and rebuild \ngo install ./... Special thanks to @krismeister for contributing this!",
+ "title": "Start the image, share the local directory and pseudo terminal (tty) into for debugging:"
+ },
+ {
+ "location": "/System-Deployment/SysV-Style/",
+ "text": "For reference, here is an example init script to run Ponzu servers. You must \ndefine the \nPROJECT_DIR\n \n \nRUNAS\n variables by replacing \nPROJECT DIRECTORY\n\n\n \nUSER\n in the script below:\n\n\n#!/bin/sh\n\n\n### BEGIN INIT INFO\n\n\n# Provides: ponzu-server\n\n\n# Required-Start: $local_fs $network $named $time $syslog\n\n\n# Required-Stop: $local_fs $network $named $time $syslog\n\n\n# Default-Start: 2 3 4 5\n\n\n# Default-Stop: 0 1 6\n\n\n# Description: Ponzu API \n Admin server\n\n\n### END INIT INFO\n\n\n\nPROJECT_DIR\n=\nPROJECT DIRECTORY\n\n\nSCRIPT\n=\ncd $PROJECT_DIR \n ponzu run --port=80\n \n# add --https here to get TLS/HTTPS\n\n\nRUNAS\n=\nUSER\n\n\n\nPIDFILE\n=\n/var/run/ponzu-server.pid\n\nLOGFILE\n=\n/var/log/ponzu-server.log\n\nstart\n()\n \n{\n\n \nif\n \n[\n -f /var/run/\n$PIDNAME\n \n]\n \n \nkill\n -0 \n$(\ncat /var/run/\n$PIDNAME\n)\n;\n \nthen\n\n \necho\n \nService already running\n \n2\n\n \nreturn\n \n1\n\n \nfi\n\n \necho\n \nStarting service\u2026\n \n2\n\n \nlocal\n \nCMD\n=\n$SCRIPT\n \n \\\n$LOGFILE\n\\\n \n echo \\$!\n\n su -c \n$CMD\n \n$RUNAS\n \n \n$PIDFILE\n\n \necho\n \nService started\n \n2\n\n\n}\n\n\nstop\n()\n \n{\n\n \nif\n \n[\n ! -f \n$PIDFILE\n \n]\n \n||\n ! \nkill\n -0 \n$(\ncat \n$PIDFILE\n)\n;\n \nthen\n\n \necho\n \nService not running\n \n2\n\n \nreturn\n \n1\n\n \nfi\n\n \necho\n \nStopping service\u2026\n \n2\n\n \nkill\n -15 \n$(\ncat \n$PIDFILE\n)\n \n rm -f \n$PIDFILE\n\n \necho\n \nService stopped\n \n2\n\n\n}\n\n\nuninstall\n()\n \n{\n\n \necho\n -n \nAre you really sure you want to uninstall this service? That cannot be undone. [yes|No] \n\n \nlocal\n SURE\n \nread\n SURE\n \nif\n \n[\n \n$SURE\n \n=\n \nyes\n \n]\n;\n \nthen\n\n stop\n rm -f \n$PIDFILE\n\n \necho\n \nNotice: log file is not be removed: \n$LOGFILE\n \n2\n\n update-rc.d -f \nNAME\n remove\n rm -fv \n$0\n\n \nfi\n\n\n}\n\n\n\ncase\n \n$1\n in\n start\n)\n\n start\n \n;;\n\n stop\n)\n\n stop\n \n;;\n\n uninstall\n)\n\n uninstall\n \n;;\n\n restart\n)\n\n stop\n start\n \n;;\n\n *\n)\n\n \necho\n \nUsage: \n$0\n {start|stop|restart|uninstall}\n\n\nesac",
+ "title": "SysV Style"
+ }
+ ]
+} \ No newline at end of file
diff --git a/docs/build/sitemap.xml b/docs/build/sitemap.xml
new file mode 100644
index 0000000..b44409d
--- /dev/null
+++ b/docs/build/sitemap.xml
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
+
+
+ <url>
+ <loc>/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+
+
+
+ <url>
+ <loc>/CLI/General-Usage/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+ <url>
+ <loc>/CLI/Generating-References/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+
+
+
+
+ <url>
+ <loc>/Content/An-Overview/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+ <url>
+ <loc>/Content/Extending-Content/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+
+
+
+
+ <url>
+ <loc>/Form-Fields/HTML-Inputs/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+
+
+
+
+ <url>
+ <loc>/HTTP-APIs/Content/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+ <url>
+ <loc>/HTTP-APIs/File-Metadata/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+ <url>
+ <loc>/HTTP-APIs/Search/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+
+
+
+
+ <url>
+ <loc>/Interfaces/API/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+ <url>
+ <loc>/Interfaces/Editor/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+ <url>
+ <loc>/Interfaces/Format/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+ <url>
+ <loc>/Interfaces/Item/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+ <url>
+ <loc>/Interfaces/Search/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+
+
+
+
+ <url>
+ <loc>/Ponzu-Addons/Creating-Addons/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+ <url>
+ <loc>/Ponzu-Addons/Using-Addons/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+
+
+
+
+ <url>
+ <loc>/Quickstart/Overview/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+
+
+
+
+ <url>
+ <loc>/References/Overview/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+
+
+
+
+ <url>
+ <loc>/Running-Backups/Backups/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+
+
+
+
+ <url>
+ <loc>/System-Configuration/Settings/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+
+
+
+
+ <url>
+ <loc>/System-Deployment/Docker/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+ <url>
+ <loc>/System-Deployment/SysV-Style/</loc>
+ <lastmod>2017-05-22</lastmod>
+ <changefreq>daily</changefreq>
+ </url>
+
+
+
+</urlset> \ No newline at end of file
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
new file mode 100644
index 0000000..71f0cb5
--- /dev/null
+++ b/docs/mkdocs.yml
@@ -0,0 +1,27 @@
+theme: material
+site_name: Ponzu
+docs_dir: src
+site_dir: build
+repo_name: ponzu-cms/ponzu
+repo_url: https://github.com/ponzu-cms/ponzu
+
+markdown_extensions:
+ - codehilite(linenums=false)
+ - meta
+ - admonition
+ - toc(permalink=true)
+
+google_analytics:
+ - 'UA-98609560-1'
+ - auto
+
+extra:
+ palette:
+ primary: grey
+ accent: light-blue
+ social:
+ - type: github
+ link: https://github.com/ponzu-cms
+ - type: twitter
+ link: https://twitter.com/ponzu_cms
+ logo: images/logo.png
diff --git a/docs/release.sh b/docs/release.sh
new file mode 100644
index 0000000..b84da01
--- /dev/null
+++ b/docs/release.sh
@@ -0,0 +1,16 @@
+#! /bin/bash
+set -e
+
+echo "---- [release] Building Docs ----"
+docker run --rm -it -p 8000:8000 -v `pwd`:/docs squidfunk/mkdocs-material build
+
+cp CNAME ./build
+
+git add -A
+git commit -m "$1"
+
+echo "---- [release] Push: Master ----"
+git push origin master
+
+echo "---- [release] Push: Build ----"
+git subtree push --prefix build origin gh-pages
diff --git a/docs/src/CLI/General-Usage.md b/docs/src/CLI/General-Usage.md
new file mode 100644
index 0000000..3a4544f
--- /dev/null
+++ b/docs/src/CLI/General-Usage.md
@@ -0,0 +1,248 @@
+title: Using the Ponzu Command Line Interface (CLI)
+
+```bash
+$ ponzu [flags] command <params>
+```
+
+## Commands
+
+### new
+
+Creates a project directory of the name supplied as a parameter immediately
+following the 'new' option in the $GOPATH/src directory. Note: 'new' depends on
+the program 'git' and possibly a network connection. If there is no local
+repository to clone from at the local machine's $GOPATH, 'new' will attempt to
+clone the 'github.com/ponzu-cms/ponzu' package from over the network.
+
+Example:
+```bash
+$ ponzu new github.com/nilslice/proj
+> New ponzu project created at $GOPATH/src/github.com/nilslice/proj
+```
+---
+
+### generate, gen, g
+
+Generate boilerplate code for various Ponzu components, such as `content`.
+
+Example:
+```bash
+ generator struct fields and built-in types...
+ | |
+ v v
+$ ponzu gen content review title:"string" body:"string":richtext rating:"int"
+ ^ ^
+ | |
+ struct type (optional) input view specifier
+```
+
+The command above will generate the file `content/review.go` with boilerplate
+methods, as well as struct definition, and corresponding field tags like:
+
+```go
+type Review struct {
+ item.Item
+
+ Title string `json:"title"`
+ Body string `json:"body"`
+ Rating int `json:"rating"`
+ Tags []string `json:"tags"`
+}
+```
+
+The generate command will intelligently parse more sophisticated field names
+such as 'field_name' and convert it to 'FieldName' and vice versa, only where
+appropriate as per common Go idioms. Errors will be reported, but successful
+generate commands return nothing.
+
+**Input View Specifiers** _(optional)_
+
+The CLI can optionally parse a third parameter on the fields provided to generate
+the type of HTML view an editor field is presented within. If no third parameter
+is added, a plain text HTML input will be generated. In the example above, the
+argument shown as `body:string:richtext` would show the Richtext input instead
+of a plain text HTML input (as shown in the screenshot). The following input
+view specifiers are implemented:
+
+| CLI parameter | Generates |
+|---------------|-----------|
+| checkbox | [`editor.Checkbox()`](/Form-Fields/HTML-Inputs/#editorcheckbox) |
+| custom | generates a pre-styled empty div to fill with HTML |
+| file | [`editor.File()`](/Form-Fields/HTML-Inputs/#editorfile) |
+| hidden | [`editor.Input()`](/Form-Fields/HTML-Inputs/#editorinput) + uses type=hidden |
+| input, text | [`editor.Input()`](/Form-Fields/HTML-Inputs/#editorinput) |
+| richtext | [`editor.Richtext()`](/Form-Fields/HTML-Inputs/#editorrichtext) |
+| select | [`editor.Select()`](/Form-Fields/HTML-Inputs/#editorselect) |
+| textarea | [`editor.Textarea()`](/Form-Fields/HTML-Inputs/#editortextarea) |
+| tags | [`editor.Tags()`](/Form-Fields/HTML-Inputs/#editortags) |
+
+**Generate Content References**
+
+It's also possible to generate all of the code needed to create references between
+your content types. The syntax to do so is below, but refer to the [documentation](/CLI/Generating-References)
+for more details:
+
+```bash
+$ ponzu gen c author name:string genre:string:select
+$ ponzu gen c book title:string author:@author,name,genre
+```
+The commands above will generate a `Book` Content type with a reference to an
+`Author` item, by also generating a [`reference.Select`](/Form-Fields/HTML-Inputs/#referenceselect)
+as the view for the `author` field.
+
+---
+
+### build
+
+From within your Ponzu project directory, running build will copy and move
+the necessary files from your workspace into the vendored directory, and
+will build/compile the project to then be run.
+
+Optional flags:
+- `--gocmd` sets the binary used when executing `go build` within `ponzu` build step
+
+Example:
+```bash
+$ ponzu build
+(or)
+$ ponzu build --gocmd=go1.8rc1 # useful for testing
+```
+
+Errors will be reported, but successful build commands return nothing.
+
+---
+
+### run
+
+Starts the HTTP server for the JSON API, Admin System, or both.
+The segments, separated by a comma, describe which services to start, either
+'admin' (Admin System / CMS backend) or 'api' (JSON API), and, optionally,
+if the server should utilize TLS encryption - served over HTTPS, which is
+automatically managed using Let's Encrypt (https://letsencrypt.org)
+
+Optional flags:
+- `--port` sets the port on which the server listens for HTTP requests [defaults to 8080]
+- `--https-port` sets the port on which the server listens for HTTPS requests [defaults to 443]
+- `--https` enables auto HTTPS management via Let's Encrypt (port is always 443)
+- `--dev-https` generates self-signed SSL certificates for development-only (port is 10443)
+
+Example:
+```bash
+$ ponzu run
+(or)
+$ ponzu run --port=8080 --https admin,api
+(or)
+$ ponzu run admin
+(or)
+$ ponzu run --port=8888 api
+(or)
+$ ponzu --dev-https run
+```
+Defaults to `$ ponzu run --port=8080 admin,api` (running Admin & API on port 8080, without TLS)
+
+*Note:*
+Admin and API cannot run on separate processes unless you use a copy of the
+database, since the first process to open it receives a lock. If you intend
+to run the Admin and API on separate processes, you must call them with the
+'ponzu' command independently.
+
+---
+
+### upgrade
+
+Will backup your own custom project code (like content, addons, uploads, etc) so
+we can safely re-clone Ponzu from the latest version you have or from the network
+if necessary. Before running `$ ponzu upgrade`, you should update the `ponzu`
+package by running `$ go get -u github.com/ponzu-cms/ponzu/...`
+
+Example:
+```bash
+$ ponzu upgrade
+```
+
+---
+
+### add, a
+
+Downloads an addon to GOPATH/src and copies it to the current Ponzu project's
+`/addons` directory.
+
+Example:
+```bash
+$ ponzu add github.com/bosssauce/fbscheduler
+```
+
+Errors will be reported, but successful add commands return nothing.
+
+---
+
+### version, v
+
+Prints the version of Ponzu your project is using. Must be called from within a
+Ponzu project directory. By passing the `--cli` flag, the `version` command will
+print the version of the Ponzu CLI you have installed.
+
+Example:
+```bash
+$ ponzu version
+Ponzu v0.8.2
+# (or)
+$ ponzu version --cli
+Ponzu v0.9.2
+```
+
+---
+
+## Contributing
+
+1. Checkout branch ponzu-dev
+2. Make code changes
+3. Test changes to ponzu-dev branch
+ - make a commit to ponzu-dev
+ - to manually test, you will need to use a new copy (ponzu new path/to/code),
+ but pass the `--dev` flag so that ponzu generates a new copy from the `ponzu-dev`
+ branch, not master by default (i.e. `$ponzu new --dev /path/to/code`)
+ - build and run with `$ ponzu build` and `$ ponzu run`
+4. To add back to master:
+ - first push to origin ponzu-dev
+ - create a pull request
+ - will then be merged into master
+
+_A typical contribution workflow might look like:_
+```bash
+# clone the repository and checkout ponzu-dev
+$ git clone https://github.com/ponzu-cms/ponzu path/to/local/ponzu # (or your fork)
+$ git checkout ponzu-dev
+
+# install ponzu with go get or from your own local path
+$ go get github.com/ponzu-cms/ponzu/...
+# or
+$ cd /path/to/local/ponzu
+$ go install ./...
+
+# edit files, add features, etc
+$ git add -A
+$ git commit -m 'edited files, added features, etc'
+
+# now you need to test the feature.. make a new ponzu project, but pass --dev flag
+$ ponzu --dev new /path/to/new/project # will create $GOPATH/src/path/to/new/project
+
+# build & run ponzu from the new project directory
+$ cd /path/to/new/project
+$ ponzu build && ponzu run
+
+# push to your origin:ponzu-dev branch and create a PR at ponzu-cms/ponzu
+$ git push origin ponzu-dev
+# ... go to https://github.com/ponzu-cms/ponzu and create a PR
+```
+
+**Note:** if you intend to work on your own fork and contribute from it, you will
+need to also pass `--fork=path/to/your/fork` (using OS-standard filepath structure),
+where `path/to/your/fork` _must_ be within `$GOPATH/src`, and you are working from a branch
+called `ponzu-dev`.
+
+For example:
+```bash
+# ($GOPATH/src is implied in the fork path, do not add it yourself)
+$ ponzu new --dev --fork=github.com/nilslice/ponzu /path/to/new/project
+```
diff --git a/docs/src/CLI/Generating-References.md b/docs/src/CLI/Generating-References.md
new file mode 100644
index 0000000..77cd16a
--- /dev/null
+++ b/docs/src/CLI/Generating-References.md
@@ -0,0 +1,123 @@
+title: How to Generate References using Ponzu CLI
+
+In Ponzu, users make connections between Content types using references. In order
+to use the CLI to generate these references, a slightly different syntax is required.
+In all cases, the Content type you wish to reference does not need to exist prior
+to the "parent" type referencing it at generate-time, but in the following examples,
+the referenced "child" type will be shown before the parent type for clarity.
+
+## Syntax
+
+### @
+
+The **@** symbol is used to declare that the following name is a reference. The
+CLI will take care to parse the name and treat it as a Content type to which the
+current type refers.
+
+### []
+
+The `[]`, which if used, is always in front of the **@** symbol. It signifies
+that the reference type is a slice or a collection of references. When `[]`
+is used, the CLI will automatically generate a `reference.SelectRepeater()` view
+for you.
+
+### ,arg1,arg2,argN
+
+Immediately following the reference name (after the @ symbol), users may optionally
+pass arguments to specify how the reference is displayed in the parent type's
+editor. References are included in the parent types editor as a dropdown menu, with
+each possible reference as an option. These arguments define what goes inside the
+`<option></option>` text node, as would be seen by an Admin.
+
+The arguments must be valid JSON struct tag names from the reference type's fields.
+Notice in the example below, the `title` and `price` are formatted exactly as they
+were in the generate command for the `product` type.
+
+---
+###
+
+##### Example
+
+```bash
+$ ponzu gen content product title:string price:int description:string:textarea
+$ ponzu gen content catalog year:int products:"[]@product",title,price
+```
+
+The commands above output the following. For demonstration, we will omit the full
+code generated for the `Product`, since the reference is in the `Catalog` type.
+
+```go
+// content/product.go
+package content
+...
+
+type Product struct {
+ item.Item
+
+ Title string `json:"title"`
+ Price int `json:"price"`
+ Description string `json:"description"`
+}
+
+...
+```
+
+```go
+package content
+
+import (
+ "fmt"
+
+ "github.com/bosssauce/reference"
+
+ "github.com/ponzu-cms/ponzu/management/editor"
+ "github.com/ponzu-cms/ponzu/system/item"
+)
+
+type Catalog struct {
+ item.Item
+
+ Year int `json:"year"`
+ // all references are stored as []string or string types
+ Products []string `json:"products"`
+}
+
+func (c *Catalog) MarshalEditor() ([]byte, error) {
+ view, err := editor.Form(c,
+ editor.Field{
+ View: editor.Input("Year", c, map[string]string{
+ "label": "Year",
+ "type": "text",
+ "placeholder": "Enter the Year here",
+ }),
+ },
+ editor.Field{
+ // reference.SelectRepeater since []@product was used
+ View: reference.SelectRepeater("Products", c, map[string]string{
+ "label": "Products",
+ },
+ "Product", // generated from @product
+ `{{ .title }} {{ .price }} `, // generated from ,title,price args
+ ),
+ },
+ )
+
+ if err != nil {
+ return nil, fmt.Errorf("Failed to render Catalog editor view: %s", err.Error())
+ }
+
+ return view, nil
+}
+
+func init() {
+ item.Types["Catalog"] = func() interface{} { return new(Catalog) }
+}
+```
+
+**Note:**
+If the reference should be only a single item, rather than a slice (or collection)
+of items, omit the `[]`, changing the command to:
+
+```bash
+$ ponzu gen content catalog year:int product:@product,title,price
+```
diff --git a/docs/src/Content/An-Overview.md b/docs/src/Content/An-Overview.md
new file mode 100644
index 0000000..1e9d53e
--- /dev/null
+++ b/docs/src/Content/An-Overview.md
@@ -0,0 +1,87 @@
+title: Content Overview
+
+Nearly everything you work on in Ponzu is inside content files on the content types you create. These types must all reside in the `content` package and are the fundamental core of your CMS. In order for Content types to be rendered and managed by the CMS, they must implement the `editor.Editable` interface, and add their own `interface{}` container to the global `item.Types` map.
+
+Sound like a lot? Don't worry, all of this can be done for you by using the code-generating command line tools that come with Ponzu.
+
+It is rare to hand-write a new Content type, and should be generated instead!
+
+### Generating Content types
+
+To generate content types and boilerplate code, use the Ponzu CLI `generate` command as such:
+```bash
+$ ponzu generate content post title:string body:string:richtext author:string
+```
+
+The command above will create a file at `content/post.go` and will generate the following code:
+```go
+package content
+
+import (
+ "fmt"
+
+ "github.com/ponzu-cms/ponzu/management/editor"
+ "github.com/ponzu-cms/ponzu/system/item"
+)
+
+type Post struct {
+ item.Item
+
+ Title string `json:"title"`
+ Body string `json:"body"`
+ Author string `json:"author"`
+}
+
+// MarshalEditor writes a buffer of html to edit a Post within the CMS
+// and implements editor.Editable
+func (p *Post) MarshalEditor() ([]byte, error) {
+ view, err := editor.Form(p,
+ // Take note that the first argument to these Input-like functions
+ // is the string version of each Post field, and must follow
+ // this pattern for auto-decoding and auto-encoding reasons:
+ editor.Field{
+ View: editor.Input("Title", p, map[string]string{
+ "label": "Title",
+ "type": "text",
+ "placeholder": "Enter the Title here",
+ }),
+ },
+ editor.Field{
+ View: editor.Richtext("Body", p, map[string]string{
+ "label": "Body",
+ "placeholder": "Enter the Body here",
+ }),
+ },
+ editor.Field{
+ View: editor.Input("Author", p, map[string]string{
+ "label": "Author",
+ "type": "text",
+ "placeholder": "Enter the Author here",
+ }),
+ },
+ )
+
+ if err != nil {
+ return nil, fmt.Errorf("Failed to render Post editor view: %s", err.Error())
+ }
+
+ return view, nil
+}
+
+func init() {
+ item.Types["Post"] = func() interface{} { return new(Post) }
+}
+```
+
+The code above is the baseline amount required to manage content for the `Post` type from within the CMS. See [Extending Content](/Content/Extending-Content) for information about how to add more functionality to your Content types.
+
+All content managed by the CMS and exposed via the API is considered an "item", and thus should embed the `item.Item` type. There are many benefits to this, such as becoming automatically sortable by time, and being given default methods that are useful inside and out of the CMS. All content types that are created by the `generate` command via Ponzu CLI will embed Item.
+
+### Related packages
+
+The `item` package has a number of useful interfaces, which make it simple to add functionality to all content types and other types that embed Item.
+
+The `editor` package has the Editable interface, which allows types to create an editor for their fields within the CMS. Additionally, there is a helper function `editor.Form` which simplifies defining the editor's input layout and input types using `editor.Input` and various other functions to make HTML input elements like Select, Checkbox, Richtext, Textarea and more.
+
+The `api` package has interfaces including `api.Createable` and `api.Mergeable` which make it trivial to accept and approve or reject content submitted from 3rd parties (POST from HTML forms, mobile clients, etc).
+
diff --git a/docs/src/Content/Extending-Content.md b/docs/src/Content/Extending-Content.md
new file mode 100644
index 0000000..91a32a0
--- /dev/null
+++ b/docs/src/Content/Extending-Content.md
@@ -0,0 +1,44 @@
+title: Extending Content through built-in Interfaces and optional Addons
+
+Extending your Content types with more features and functionality within the system
+is done by implementing the various built-in interfaces provided by Ponzu. To learn
+more about interfaces, see [A Tour of Go - Interfaces](https://tour.golang.org/methods/10).
+
+It is also common to add more advanced functionality to Content types using Addons. Refer to the [Addon documentation](/Ponzu-Addons) for more information about how to use and create Ponzu Addons.
+
+## [Item Interfaces](/Interfaces/Item)
+
+All Content types which embed an `item.Item` will implicitly [implement](#) its many
+interfaces. In Ponzu, the following interfaces are exported from the `system/item`
+package and have a default implementation which can be overridden to change your
+content types' functionality within the system.
+
+- [`item.Pushable`](/Interfaces/Item#itempushable)
+- [`item.Hideable`](/Interfaces/Item#itemhideable)
+- [`item.Omittable`](/Interfaces/Item#itemomittable)
+- [`item.Hookable`](/Interfaces/Item#itemhookable)
+- [`item.Identifiable`](/Interfaces/Item#itemidentifiable)
+- [`item.Sortable`](/Interfaces/Item#itemsortable)
+- [`item.Sluggable`](/Interfaces/Item#itemsluggable)
+
+## [API Interfaces](/Interfaces/API)
+
+To enable 3rd-party clients to interact with your Content types, you can extend your types with the API interfaces:
+
+- [`api.Createable`](/Interfaces/API/#apicreateable)
+- [`api.Updateable`](/Interfaces/API/#apiupdateable)
+- [`api.Deleteable`](/Interfaces/API/#apideleteable)
+- [`api.Trustable`](/Interfaces/API/#apitrustable)
+
+## [Editor Interfaces](/Interfaces/Editor)
+
+To manage how content is edited and handled in the CMS, use the following Editor interfaces:
+
+- [`editor.Editable`](/Interfaces/Editor/#editoreditable)
+- [`editor.Mergeable`](/Interfaces/Editor/#editormergeable)
+
+## [Search Interfaces](/Interfaces/Search)
+
+To enable and customize full-text search on your content types, use the following interfaces:
+
+- [`search.Searchable`](/Interfaces/Search/#searchsearchable) \ No newline at end of file
diff --git a/docs/src/Form-Fields/HTML-Inputs.md b/docs/src/Form-Fields/HTML-Inputs.md
new file mode 100644
index 0000000..b79c5dd
--- /dev/null
+++ b/docs/src/Form-Fields/HTML-Inputs.md
@@ -0,0 +1,391 @@
+title: HTML Input Elements for Ponzu Editor Forms
+
+Ponzu provides a number of helpful HTML Inputs to create forms which CMS admins
+use to manage content. The input functions are typically used inside a Content
+type's `MarshalEditor()` func from within an `editor.Form()` - for example:
+
+```go
+// MarshalEditor writes a buffer of html to edit a Post within the CMS
+// and implements editor.Editable
+func (p *Post) MarshalEditor() ([]byte, error) {
+ view, err := editor.Form(p,
+ editor.Field{ // <- editor.Fields contain input-like funcs
+ View: editor.Input("Title", p, map[string]string{ // <- makes a text input
+ "label": "Title",
+ "type": "text",
+ "placeholder": "Enter the Title here",
+ }),
+ },
+ editor.Field{
+ View: editor.Richtext("Body", p, map[string]string{ // <- makes a WYSIWIG editor
+ "label": "Body",
+ "placeholder": "Enter the Body here",
+ }),
+ },
+ editor.Field{
+ View: editor.Input("Author", p, map[string]string{
+ "label": "Author",
+ "type": "text",
+ "placeholder": "Enter the Author here",
+ }),
+ },
+ )
+
+ if err != nil {
+ return nil, fmt.Errorf("Failed to render Post editor view: %s", err.Error())
+ }
+
+ return view, nil
+}
+```
+---
+
+## Field Input Functions
+
+There are many of these input-like HTML view funcs exported from Ponzu's
+`management/editor` package. Below is a list of the built-in options:
+
+### `editor.Input`
+The `editor.Input` function produces a standard text input.
+
+##### Screenshot
+![HTML Input](/images/editor-input.png)
+
+##### Function Signature
+```go
+Input(fieldName string, p interface{}, attrs, options map[string]string) []byte
+```
+
+##### Example
+
+```go
+...
+editor.Field{
+ View: editor.Input("Title", s, map[string]string{
+ "label": "Title",
+ "type": "text",
+ "placeholder": "Enter the Title here",
+ }),
+},
+...
+```
+
+---
+
+### `editor.InputRepeater`
+The `editor.InputRepeater` function applies a controller UI to the `editor.Input`
+view so any arbitrary number of inputs can be added for your field.
+
+!!! warning "Using Repeaters"
+ When using the `editor.InputRepeater` make sure it's corresponding field is a **slice `[]T`**
+ type. You will experience errors if it is not.
+
+##### Screenshot
+![HTML Input](/images/editor-input-repeater.png)
+
+##### Function Signature
+```go
+InputRepeater(fieldName string, p interface{}, attrs, options map[string]string) []byte
+```
+
+##### Example
+
+```go
+...
+editor.Field{
+ View: editor.InputRepeater("Title", s, map[string]string{
+ "label": "Titles",
+ "type": "text",
+ "placeholder": "Enter the Title here",
+ }),
+},
+...
+```
+
+---
+
+### `editor.Checkbox`
+The `editor.Checkbox` function returns any number of checkboxes in a collection,
+defined by the value:name map of options.
+
+##### Screenshot
+![HTML Checkbox](/images/editor-checkbox.png)
+
+##### Function Signature
+```go
+Checkbox(fieldName string, p interface{}, attrs, options map[string]string) []byte
+```
+
+##### Example
+
+```go
+...
+editor.Field{
+ View: editor.Checkbox("Options", s, map[string]string{
+ "label": "Options",
+ }, map[string]string{
+ // "value": "Display Name",
+ "1": "First",
+ "2": "Second",
+ "3": "Third",
+ }),
+},
+...
+```
+
+---
+
+### `editor.Richtext`
+The `editor.Richetext` function displays an HTML5 rich text / WYSYWIG editor which
+supports text formatting and styling, images, quotes, arbitrary HTML, and more.
+
+The rich text editor is a modified version of [Summernote](http://summernote.org/)
+using a theme called [MaterialNote](https://github.com/Cerealkillerway/materialNote)
+
+##### Screenshot
+![HTML Richtext Input](/images/editor-richtext.png)
+
+##### Function Signature
+```go
+Richtext(fieldName string, p interface{}, attrs map[string]string) []byte
+```
+
+##### Example
+```go
+...
+editor.Field{
+ View: editor.Richtext("Opinion", s, map[string]string{
+ "label": "Rich Text Editor",
+ "placeholder": "Enter the Opinion here",
+ }),
+},
+...
+```
+
+---
+
+### `editor.Tags`
+The `editor.Tags` function returns a container input element for lists of arbitrary
+bits of information.
+
+##### Screenshot
+![HTML Tags Input](/images/editor-tags.png)
+
+##### Function Signature
+```go
+Tags(fieldName string, p interface{}, attrs map[string]string) []byte
+```
+
+##### Example
+```go
+...
+editor.Field{
+ View: editor.Tags("Category", s, map[string]string{
+ "label": "Tags",
+ "placeholder": "+Category",
+ }),
+},
+...
+```
+
+---
+
+### `editor.File`
+The `editor.File` function returns an HTML file upload element, which saves files
+into the `/uploads` directory, and can be viewed from the "Uploads" section in the
+Admin dashboard. See also the [File Metadata API](/HTTP-APIs/File-Metadata.md).
+
+!!! warning "Field Type"
+ When using the `editor.File` function, its corresponding field type must be
+ a **`string`**, as files will be stored as URL paths in the database.
+
+##### Screenshot
+![HTML File Input](/images/editor-file.png)
+
+##### Function Signature
+```go
+File(fieldName string, p interface{}, attrs map[string]string) []byte
+```
+
+##### Example
+```go
+...
+editor.Field{
+ View: editor.File("Photo", s, map[string]string{
+ "label": "File Upload",
+ "placeholder": "Upload the Photo here",
+ }),
+},
+...
+```
+
+---
+
+### `editor.FileRepeater`
+The `editor.FileRepeater` function applies a controller UI to the `editor.File`
+view so any arbitrary number of uploads can be added for your field.
+
+!!! warning "Using Repeaters"
+ When using the `editor.FileRepeater` make sure it's corresponding field is a **slice `[]string`**
+ type. You will experience errors if it is not.
+
+##### Screenshot
+![HTML File Input](/images/editor-file-repeater.png)
+
+##### Function Signature
+```go
+FileRepeater(fieldName string, p interface{}, attrs map[string]string) []byte
+```
+
+##### Example
+```go
+...
+editor.Field{
+ View: editor.FileRepeater("Photo", s, map[string]string{
+ "label": "File Upload Repeater",
+ "placeholder": "Upload the Photo here",
+ }),
+},
+...
+```
+
+---
+
+### `editor.Select`
+The `editor.Select` function returns a single HTML select input with options
+as defined in the `options map[string]string` parameter of the function call.
+
+##### Screenshot
+![HTML Select Input](/images/editor-select.png)
+
+##### Function Signature
+```go
+func Select(fieldName string, p interface{}, attrs, options map[string]string) []byte
+```
+
+##### Example
+```go
+...
+editor.Field{
+ View: editor.Select("Rating", s, map[string]string{
+ "label": "Select Dropdown",
+ }, map[string]string{
+ // "value": "Display Name",
+ "G": "G",
+ "PG": "PG",
+ "PG-13": "PG-13",
+ "R": "R",
+ }),
+},
+...
+```
+
+---
+
+### `editor.SelectRepeater`
+The `editor.SelectRepeater` function applies a controller UI to the `editor.Select`
+view so any arbitrary number of dropdowns can be added for your field.
+
+##### Screenshot
+![HTML Select Input](/images/editor-select-repeater.png)
+
+##### Function Signature
+```go
+func SelectRepeater(fieldName string, p interface{}, attrs, options map[string]string) []byte
+```
+
+##### Example
+```go
+...
+editor.Field{
+ View: editor.SelectRepeater("Rating", s, map[string]string{
+ "label": "Select Dropdown Repeater",
+ }, map[string]string{
+ // "value": "Display Name",
+ "G": "G",
+ "PG": "PG",
+ "PG-13": "PG-13",
+ "R": "R",
+ }),
+},
+...
+```
+
+---
+
+### `editor.Textarea`
+The `editor.Textarea` function returns an HTML textarea input to add unstyled text
+blocks. Newlines in the textarea are preserved.
+
+##### Screenshot
+![HTML Textarea Input](/images/editor-textarea.png)
+
+##### Function Signature
+```go
+Textarea(fieldName string, p interface{}, attrs map[string]string) []byte
+```
+
+##### Example
+```go
+...
+editor.Field{
+ View: editor.Textarea("Readme", s, map[string]string{
+ "label": "Textarea",
+ "placeholder": "Enter the Readme here",
+ }),
+},
+...
+```
+
+---
+
+## Data References
+It is common to want to keep a reference from one Content type to another. To do
+this in Ponzu, use the [`bosssauce/reference`](https://github.com/bosssauce/reference)
+package. It comes pre-installed with Ponzu as an ["Addon"](/Ponzu-Addons/Using-Addons).
+
+### `reference.Select`
+
+##### Screenshot
+![HTML Select Input](/images/editor-select.png)
+
+##### Function Signature
+```go
+func Select(fieldName string, p interface{}, attrs map[string]string, contentType, tmplString string) []byte
+```
+
+##### Example
+```go
+...
+editor.Field{
+ View: reference.Select("DirectedBy", s, map[string]string{
+ "label": "Select Dropdown",
+ }, "Director", `{{.last-name}}, {{.first_name}}`),
+},
+...
+```
+
+---
+
+### `reference.SelectRepeater`
+
+##### Screenshot
+![HTML Select Input](/images/editor-select-repeater.png)
+
+##### Function Signature
+```go
+func SelectRepeater(fieldName string, p interface{}, attrs map[string]string, contentType, tmplString string) []byte
+```
+
+##### Example
+```go
+...
+editor.Field{
+ View: reference.SelectRepeater("PlacesFilmed", s, map[string]string{
+ "label": "Select Dropdown Repeater",
+ }, "Location", `{{.name}}, {{.region}}`),
+},
+...
+```
+
+---
diff --git a/docs/src/HTTP-APIs/Content.md b/docs/src/HTTP-APIs/Content.md
new file mode 100644
index 0000000..6a3e387
--- /dev/null
+++ b/docs/src/HTTP-APIs/Content.md
@@ -0,0 +1,196 @@
+title: Content HTTP API
+
+
+Ponzu provides a read & write HTTP API to access and interact with content on a
+system. By default, write access (including create, update and delete) and search
+are disabled. See the section on Ponzu's [API Interfaces](/Interfaces/API) to learn
+more about how to enable these endpoints.
+
+---
+
+## Endpoints
+
+### Get Content by Type
+<kbd>GET</kbd> `/api/content?type=<Type>&id=<ID>`
+
+##### Sample Response
+```javascript
+{
+ "data": [
+ {
+ "uuid": "024a5797-e064-4ee0-abe3-415cb6d3ed18",
+ "id": 6,
+ "slug": "item-id-024a5797-e064-4ee0-abe3-415cb6d3ed18" // customizable
+ "timestamp": 1493926453826, // milliseconds since Unix epoch
+ "updated": 1493926453826,
+ // your content data...,
+ }
+ ]
+}
+```
+
+---
+
+### Get Contents by Type
+<kbd>GET</kbd> `/api/contents?type=<Type>`
+
+ - optional params:
+ 1. `order` (string: ASC / DESC, default: DESC)
+ 2. `count` (int: -1 - N, default: 10, -1 returns all)
+ 3. `offset` (int: 0 - N, default: 0)
+##### Sample Response
+```javascript
+{
+ "data": [
+ {
+ "uuid": "024a5797-e064-4ee0-abe3-415cb6d3ed18",
+ "id": 6,
+ "slug": "item-id-024a5797-e064-4ee0-abe3-415cb6d3ed18", // customizable
+ "timestamp": 1493926453826, // milliseconds since Unix epoch
+ "updated": 1493926453826,
+ // your content data...,
+ },
+ {
+ "uuid": "5a9177c7-634d-4fb1-88a6-ef6c45de797c",
+ "id": 7,
+ "slug": "item-id-5a9177c7-634d-4fb1-88a6-ef6c45de797c", // customizable
+ "timestamp": 1493926453826, // milliseconds since Unix epoch
+ "updated": 1493926453826,
+ // your content data...,
+ },
+ // more objects...
+ ]
+}
+```
+
+---
+
+### Get Content by Slug
+<kbd>GET</kbd> `/api/content?slug=<Slug>`
+
+##### Sample Response
+```javascript
+{
+ "data": [
+ {
+ "uuid": "024a5797-e064-4ee0-abe3-415cb6d3ed18",
+ "id": 6,
+ "slug": "item-id-024a5797-e064-4ee0-abe3-415cb6d3ed18", // customizable
+ "timestamp": 1493926453826, // milliseconds since Unix epoch
+ "updated": 1493926453826,
+ // your content data...,
+ }
+ ]
+}
+```
+
+---
+
+### New Content
+<kbd>POST</kbd> `/api/content/create?type=<Type>`
+
+ - Type must implement [`api.Createable`](/Interfaces/API#apicreateable) interface
+!!! note "Request Data Encoding"
+ Request must be `multipart/form-data` encoded. If not, a `400 Bad Request`
+ Response will be returned.
+
+##### Sample Response
+```javascript
+{
+ "data": [
+ {
+ "id": 6, // will be omitted if status is pending
+ "type": "Review",
+ "status": "public"
+ }
+ ]
+}
+```
+
+---
+
+### Update Content
+<kbd>POST</kbd> `/api/content/update?type=<Type>&id=<id>`
+
+ - Type must implement [`api.Updateable`](/Interfaces/API#apiupdateable) interface
+!!! note "Request Data Encoding"
+ Request must be `multipart/form-data` encoded. If not, a `400 Bad Request`
+ Response will be returned.
+
+##### Sample Response
+```javascript
+{
+ "data": [
+ {
+ "id": 6,
+ "type": "Review",
+ "status": "public"
+ }
+ ]
+}
+```
+
+---
+
+### Delete Content
+<kbd>POST</kbd> `/api/content/delete?type=<Type>&id=<id>`
+
+ - Type must implement [`api.Deleteable`](/Interfaces/API#apideleteable) interface
+!!! note "Request Data Encoding"
+ Request must be `multipart/form-data` encoded. If not, a `400 Bad Request`
+ Response will be returned.
+
+##### Sample Response
+```javascript
+{
+ "data": [
+ {
+ "id": 6,
+ "type": "Review",
+ "status": "deleted"
+ }
+ ]
+}
+```
+
+---
+
+### Additional Information
+
+All API endpoints are CORS-enabled (can be disabled in configuration at run-time) and API requests are recorded by your system to generate graphs of total requests and unique client requests within the Admin dashboard.
+
+#### Response Headers
+The following headers are common across all Ponzu API responses. Some of them can be modified
+in the [system configuration](/System-Configuration/Settings) while your system is running.
+
+##### HTTP/1.1
+```
+HTTP/1.1 200 OK
+Access-Control-Allow-Headers: Accept, Authorization, Content-Type
+Access-Control-Allow-Origin: *
+Cache-Control: max-age=2592000, public
+Content-Encoding: gzip
+Content-Type: application/json
+Etag: MTQ5Mzk0NTYzNQ==
+Vary: Accept-Encoding
+Date: Fri, 05 May 2017 01:15:49 GMT
+Content-Length: 199
+```
+
+##### HTTP/2
+```
+access-control-allow-headers: Accept, Authorization, Content-Type
+access-control-allow-origin: *
+cache-control: max-age=2592000, public
+content-encoding: gzip
+content-length: 199
+content-type: application/json
+date: Fri, 05 May 2017 01:38:11 GMT
+etag: MTQ5Mzk0ODI4MA==
+status: 200
+vary: Accept-Encoding
+```
+
+#### Helpful links
+[Typewriter](https://github.com/natdm/typewriter)
+Generate & sync front-end data structures from Ponzu content types. ([Ponzu example](https://github.com/natdm/typewriter/blob/master/EXAMPLES.md#example-use-in-a-package-like-ponzu))
diff --git a/docs/src/HTTP-APIs/File-Metadata.md b/docs/src/HTTP-APIs/File-Metadata.md
new file mode 100644
index 0000000..19d6ab6
--- /dev/null
+++ b/docs/src/HTTP-APIs/File-Metadata.md
@@ -0,0 +1,29 @@
+title: File Metadata HTTP API
+
+Ponzu provides a read-only HTTP API to get metadata about the files that have been uploaded to your system. As a security and bandwidth abuse precaution, the API is only queryable by "slug" which is the normalized filename of the uploaded file.
+
+---
+
+### Endpoints
+
+#### Get File by Slug (single item)
+<kbd>GET</kbd> `/api/uploads?slug=<Slug>`
+
+##### Sample Response
+```javascript
+{
+ "data": [
+ {
+ "uuid": "024a5797-e064-4ee0-abe3-415cb6d3ed18",
+ "id": 6,
+ "slug": "filename.jpg",
+ "timestamp": 1493926453826, // milliseconds since Unix epoch
+ "updated": 1493926453826,
+ "name": "filename.jpg",
+ "path": "/api/uploads/2017/05/filename.jpg",
+ "content_length": 357557,
+ "content_type": "image/jpeg",
+ }
+ ]
+}
+``` \ No newline at end of file
diff --git a/docs/src/HTTP-APIs/Search.md b/docs/src/HTTP-APIs/Search.md
new file mode 100644
index 0000000..2939cce
--- /dev/null
+++ b/docs/src/HTTP-APIs/Search.md
@@ -0,0 +1,47 @@
+title: Full-text Search HTTP API
+
+Ponzu provides a read-only HTTP API to search the contents of your system's database.
+Full-text search is made possible by the use of [Bleve](http://blevesearch.com),
+which handles the indexing and querying.
+
+---
+
+### Endpoints
+
+#### Search Content
+
+<kbd>GET</kbd> `/api/search?type=<Type>&q=<Query String>`
+
+!!! warning "Search must be enabled individually for each Content type"
+ - Search is not on by default to protect your data in case it shouldn't be indexed and published via the API.
+ - `SearchMapping()` is implemented with default mapping (ideal for 99% of use cases).
+ - To enable search, add a `IndexContent() bool` method to your content type and return `true` (default implementation returns false).
+
+- `<Type>` must implement [db.Searchable](/Interfaces/Search/#searchsearchable)
+
+- Search is currently limited to single `<Type>` per request
+
+- `<Query String>` documentation here: [Bleve Docs - Query String](http://www.blevesearch.com/docs/Query-String-Query/)
+
+- Search results are formatted exactly the same as standard Content API calls, so you don't need to change your client data model
+
+- Search handler will respect other interface implementations on your content, including:
+ - [`item.Hideable`](https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Hideable)
+ - [`item.Omittable`](https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Omittable)
+ - [`item.Pushable`](https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Pushable) _(Note: only the first search result will be pushed)_
+
+##### Sample Response
+```javascript
+{
+ "data": [
+ {
+ "uuid": "024a5797-e064-4ee0-abe3-415cb6d3ed18",
+ "id": 6,
+ "slug": "item-id-024a5797-e064-4ee0-abe3-415cb6d3ed18", // customizable
+ "timestamp": 1493926453826, // milliseconds since Unix epoch
+ "updated": 1493926453826,
+ // your content data...,
+ }
+ ]
+}
+```
diff --git a/docs/src/Interfaces/API.md b/docs/src/Interfaces/API.md
new file mode 100644
index 0000000..1d9ab82
--- /dev/null
+++ b/docs/src/Interfaces/API.md
@@ -0,0 +1,110 @@
+title: API Package Interfaces
+
+Ponzu provides a set of interfaces from the `system/api` package which enable
+richer interaction with your system from external clients. If you need to allow
+3rd-party apps to manage content, use the following interfaces.
+
+The API interfaces adhere to a common function signature, expecting an
+`http.ResponseWriter` and `*http.Request` as arguments and returning an `error`.
+This provides Ponzu developers with full control over the request/response
+life-cycle.
+
+---
+
+## Interfaces
+
+### [api.Createable](https://godoc.org/github.com/ponzu-cms/ponzu/system/api#Createable)
+Externalable enables 3rd-party clients (outside the CMS) to send content via a
+`multipart/form-data` encoded `POST` request to a specific endpoint:
+`/api/content/create?type=<Type>`. When `api.Createable` is implemented, content
+will be saved from the request in a "Pending" section which will is visible only
+within the CMS.
+
+To work with "Pending" data, implement the [`editor.Mergeable`](/Interfaces/Editor#editormergeable)
+interface, which will add "Approve" and "Reject" buttons to your Content types'
+editor -- or implement [`api.Trustable`](#apitrustable) to bypass
+the "Pending" section altogether and become "Public" immediately.
+
+##### Method Set
+
+```go
+type Createable interface {
+ Create(http.ResponseWriter, *http.Request) error
+}
+```
+
+##### Implementation
+```go
+func (p *Post) Create(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+---
+
+### [api.Updateable](https://godoc.org/github.com/ponzu-cms/ponzu/system/api#Updateable)
+Updateable enables 3rd-party clients (outside the CMS) to update existing content
+via a `multipart/form-data` encoded `POST` request to a specific endpoint:
+`/api/content/update?type=<Type>&id=<id>`. Request validation should be employed
+otherwise any client could change data in your database.
+
+##### Method Set
+
+```go
+type Updateable interface {
+ Update(http.ResponseWriter, *http.Request) error
+}
+```
+
+##### Implementation
+```go
+func (p *Post) Update(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+---
+
+### [api.Deleteable](https://godoc.org/github.com/ponzu-cms/ponzu/system/api#Deleteable)
+Updateable enables 3rd-party clients (outside the CMS) to delete existing content
+via a `multipart/form-data` encoded `POST` request to a specific endpoint:
+`/api/content/delete?type=<Type>&id=<id>`. Request validation should be employed
+otherwise any client could delete data from your database.
+
+##### Method Set
+
+```go
+type Deleteable interface {
+ Delete(http.ResponseWriter, *http.Request) error
+}
+```
+
+##### Implementation
+```go
+func (p *Post) Delete(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+---
+
+### [api.Trustable](https://godoc.org/github.com/ponzu-cms/ponzu/system/api#Trustable)
+Trustable provides a way for submitted content (via `api.Createable`) to bypass
+the `editor.Mergeable` step in which CMS end-users must manually click the
+"Approve" button in order for content to be put in the "Public" section and access
+via the content API endpoints. `api.Trustable` has a single method: `AutoApprove`
+which will automatically approve content, bypassing the "Pending" section
+altogether.
+
+```go
+type Trustable interface {
+ AutoApprove(http.ResponseWriter, *http.Request) error
+}
+```
+
+##### Implementation
+```go
+func (p *Post) AutoApprove(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+``` \ No newline at end of file
diff --git a/docs/src/Interfaces/Editor.md b/docs/src/Interfaces/Editor.md
new file mode 100644
index 0000000..63d3ceb
--- /dev/null
+++ b/docs/src/Interfaces/Editor.md
@@ -0,0 +1,70 @@
+title: Editor Package Interfaces
+
+Ponzu provides a set of interfaces from the `management/editor` package which
+extend the system's functionality and determine how content editors are rendered
+within the CMS.
+
+---
+
+## Interfaces
+
+### [editor.Editable](https://godoc.org/github.com/ponzu-cms/ponzu/management/editor#Editable)
+
+Editable determines what `[]bytes` are rendered inside the editor page. Use
+Edtiable on anything inside your CMS that you want to provide configuration, editable
+fields, or any HTML/markup to display to an end-user.
+
+!!! note "Implementing `editor.Editable`"
+ Most of the time, Ponzu developers generate the majority of this code using
+ the Ponzu CLI [`generate` command](/CLI/Usage).
+
+##### Method Set
+
+```go
+type Editable interface {
+ MarshalEditor() ([]byte, error)
+}
+```
+
+##### Implementation
+
+```go
+func (p *Post) MarshalEditor() ([]byte, error) {
+ // The editor.Form func sets up a structured UI with default styles and form
+ // elements based on the fields provided. Most often, Ponzu developers will
+ // have the `$ ponzu generate` command generate the MarshalEditor func and
+ // its internal form fields
+ view, err := editor.Form(p,
+ editor.Field{
+ View: editor.Input("Name", p, map[string]string{
+ "label": "Name",
+ "type": "text",
+ "placeholder": "Enter the Name here",
+ }),
+ },
+ )
+}
+```
+
+!!! note "MarshalEditor() & View Rendering"
+ Although it is common to use the `editor.Form` and `editor.Fields` to structure your content editor inside `MarshalEditor()`, the method signature defines that its return value needs only to be `[]byte, error`. Keep in mind that you can return a `[]byte` of any raw HTML or other markup to be rendered in the editor view.
+
+---
+
+### [editor.Mergeable](https://godoc.org/github.com/ponzu-cms/ponzu/management/editor#Mergeable)
+
+Mergable enables a CMS end-user to merge the "Pending" content from an outside source into the "Public" section, and thus making it visible via the public content API. It also allows the end-user to reject content. "Approve" and "Reject" buttons will be visible on the edit page for content submitted.
+
+##### Method Set
+```go
+type Mergeable interface {
+ Approve(http.ResponseWriter, *http.Request) error
+}
+```
+
+##### Example
+```go
+func (p *Post) Approve(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
diff --git a/docs/src/Interfaces/Format.md b/docs/src/Interfaces/Format.md
new file mode 100644
index 0000000..8a259d3
--- /dev/null
+++ b/docs/src/Interfaces/Format.md
@@ -0,0 +1,48 @@
+title: Format Package Interfaces
+
+Ponzu provides a set of interfaces from the `management/format` package which
+determine how content data should be converted and formatted for exporting via
+the Admin interface.
+
+---
+
+## Interfaces
+
+### [format.CSVFormattable](https://godoc.org/github.com/ponzu-cms/ponzu/management/format#CSVFormattable)
+
+CSVFormattable controls if an "Export" button is added to the contents view for
+a Content type in the CMS to export the data to CSV. If it is implemented, a
+button will be present beneath the "New" button per Content type.
+
+##### Method Set
+
+```go
+type CSVFormattable interface {
+ FormatCSV() []string
+}
+```
+
+##### Implementation
+
+```go
+func (p *Post) FormatCSV() []string {
+ // []string contains the JSON struct tags generated for your Content type
+ // implementing the interface
+ return []string{
+ "id",
+ "timestamp",
+ "slug",
+ "title",
+ "photos",
+ "body",
+ "written_by",
+ }
+}
+```
+
+!!! note "FormatCSV() []string"
+ Just like other Ponzu content extension interfaces, like `Push()`, you will
+ return the JSON struct tags for the fields you want exported to the CSV file.
+ These will also be the "header" row in the CSV file to give titles to the file
+ columns. Keep in mind that all of item.Item's fields are available here as well.
+
diff --git a/docs/src/Interfaces/Item.md b/docs/src/Interfaces/Item.md
new file mode 100644
index 0000000..32f250b
--- /dev/null
+++ b/docs/src/Interfaces/Item.md
@@ -0,0 +1,517 @@
+title: Item Package Interfaces
+
+Ponzu provides a set of interfaces from the `system/item` package which extend
+the functionality of the content in your system and how it interacts with other
+components inside and outside of Ponzu.
+
+---
+
+## Interfaces
+
+### [item.Pushable](https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Pushable)
+Pushable, if [HTTP/2 Server Push](https://http2.github.io/http2-spec/#PushResources)
+is supported by the client, can tell a handler which resources it would like to
+have "pushed" preemptively to the client. This saves follow-on roundtrip requests
+for other items which are referenced by the Pushable item. The `Push` method, the
+only method in Pushable, must return a `[]string` containing the `json` field tags
+of the referenced items within the type.
+
+##### Method Set
+```go
+type Pushable interface {
+ // the values contained in fields returned by Push must be URL paths
+ Push() []string
+}
+```
+
+##### Implementation
+The `Push` method returns a `[]string` containing the `json` tag field names for
+which you want to have pushed to a supported client. The values for the field
+names **must** be URL paths, and cannot be from another origin.
+
+```go
+type Post struct {
+ item.Item
+
+ HeaderPhoto string `json:"header_photo"`
+ Author string `json:"author"` // reference `/api/content/?type=Author&id=2`
+ // ...
+}
+
+func (p *Post) Push() []string {
+ return []string{
+ "header_photo",
+ "author",
+ }
+}
+```
+
+---
+
+### [item.Hideable](https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Hideable)
+Hideable tells an API handler that data of this type shouldn’t be exposed outside
+the system. Hideable types cannot be used as references (relations in Content types).
+The `Hide` method, the only method in Hideable, takes an `http.ResponseWriter, *http.Request`
+and returns an `error`. A special error in the `items` package, `ErrAllowHiddenItem`
+can be returned as the error from Hide to instruct handlers to show hidden
+content in specific cases.
+
+##### Method Set
+```go
+type Hideable interface {
+ Hide(http.ResponseWriter, *http.Request) error
+}
+```
+
+##### Implementation
+```go
+func (p *Post) Hide(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+---
+
+### [item.Omittable](https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Omittable)
+Omittable tells a content API handler to keep certain fields from being exposed
+through the JSON response. It's single method, `Omit` takes no arguments and
+returns a `[]string` which must be made up of the JSON struct tags for the type
+containing fields to be omitted.
+
+##### Method Set
+```go
+type Omittable interface {
+ Omit() []string
+}
+```
+
+##### Implementation
+```go
+type Post struct {
+ item.Item
+
+ HeaderPhoto string `json:"header_photo"`
+ Author string `json:"author"`
+ // ...
+}
+
+func (p *Post) Omit() []string {
+ return []string{
+ "header_photo",
+ "author",
+ }
+}
+```
+
+---
+
+### [item.Hookable](https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Hookable)
+Hookable provides lifecycle hooks into the http handlers which manage Save, Delete,
+Approve, and Reject routines. All methods in its set take an
+`http.ResponseWriter, *http.Request` and return an `error`.
+
+##### Method Set
+
+```go
+type Hookable interface {
+ BeforeAPICreate(http.ResponseWriter, *http.Request) error
+ AfterAPICreate(http.ResponseWriter, *http.Request) error
+
+ BeforeAPIUpdate(http.ResponseWriter, *http.Request) error
+ AfterAPIUpdate(http.ResponseWriter, *http.Request) error
+
+ BeforeAPIDelete(http.ResponseWriter, *http.Request) error
+ AfterAPIDelete(http.ResponseWriter, *http.Request) error
+
+ BeforeAdminCreate(http.ResponseWriter, *http.Request) error
+ AfterAdminCreate(http.ResponseWriter, *http.Request) error
+
+ BeforeAdminUpdate(http.ResponseWriter, *http.Request) error
+ AfterAdminUpdate(http.ResponseWriter, *http.Request) error
+
+ BeforeAdminDelete(http.ResponseWriter, *http.Request) error
+ AfterAdminDelete(http.ResponseWriter, *http.Request) error
+
+ BeforeSave(http.ResponseWriter, *http.Request) error
+ AfterSave(http.ResponseWriter, *http.Request) error
+
+ BeforeDelete(http.ResponseWriter, *http.Request) error
+ AfterDelete(http.ResponseWriter, *http.Request) error
+
+ BeforeApprove(http.ResponseWriter, *http.Request) error
+ AfterApprove(http.ResponseWriter, *http.Request) error
+
+ BeforeReject(http.ResponseWriter, *http.Request) error
+ AfterReject(http.ResponseWriter, *http.Request) error
+
+ // Enable/Disable used exclusively for addons
+ BeforeEnable(http.ResponseWriter, *http.Request) error
+ AfterEnable(http.ResponseWriter, *http.Request) error
+
+ BeforeDisable(http.ResponseWriter, *http.Request) error
+ AfterDisable(http.ResponseWriter, *http.Request) error
+}
+```
+
+##### Implementations
+
+#### BeforeAPICreate
+BeforeAPICreate is called before an item is created via a 3rd-party client. If a
+non-nil `error` value is returned, the item will not be created/saved.
+
+```go
+func (p *Post) BeforeAPICreate(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### AfterAPICreate
+AfterAPICreate is called after an item has been created via a 3rd-party client.
+At this point, the item has been saved to the database. If a non-nil `error` is
+returned, it will respond to the client with an empty response, so be sure to
+use the `http.ResponseWriter` from within your hook appropriately.
+
+```go
+func (p *Post) AfterAPICreate(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### BeforeApprove
+BeforeApprove is called before an item is merged as "Public" from its prior
+status as "Pending". If a non-nil `error` value is returned, the item will not be
+appproved, and an error message is displayed to the Admin.
+
+```go
+func (p *Post) BeforeApprove(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### AfterApprove
+AfterApprove is called after an item has been merged as "Public" from its prior
+status as "Pending". If a non-nil `error` is returned, an error message is
+displayed to the Admin, however the item will already be irreversibly merged.
+
+```go
+func (p *Post) AfterApprove(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### BeforeReject
+BeforeReject is called before an item is rejected and deleted by default. To reject
+an item, but not delete it, return a non-nil `error` from this hook - doing so
+will allow the hook to do what you want it to do prior to the return, but the item
+will remain in the "Pending" section.
+
+```go
+func (p *Post) BeforeReject(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### AfterReject
+AfterReject is called after an item is rejected and has been deleted.
+
+```go
+func (p *Post) AfterReject(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### BeforeSave
+BeforeSave is called before any CMS Admin or 3rd-party client triggers a save to
+the database. This could be done by clicking the 'Save' button on a Content editor,
+or by a API call to Create or Update the Content item. By returning a non-nil
+`error` value, the item will not be saved.
+
+```go
+func (p *Post) BeforeSave(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### AfterSave
+AfterSave is called after any CMS Admin or 3rd-party client triggers a save to
+the database. This could be done by clicking the 'Save' button on a Content editor,
+or by a API call to Create or Update the Content item.
+
+```go
+func (p *Post) AfterSave(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### BeforeDelete
+BeforeDelete is called before any CMS Admin or 3rd-party client triggers a delete to
+the database. This could be done by clicking the 'Delete' button on a Content editor,
+or by a API call to Delete the Content item. By returning a non-nil `error` value,
+the item will not be deleted.
+
+```go
+func (p *Post) BeforeDelete(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### AfterDelete
+AfterSave is called after any CMS Admin or 3rd-party client triggers a delete to
+the database. This could be done by clicking the 'Delete' button on a Content editor,
+or by a API call to Delete the Content item.
+
+```go
+func (p *Post) AfterDelete(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### BeforeAPIDelete
+BeforeDelete is only called before a 3rd-party client triggers a delete to the
+database. By returning a non-nil `error` value, the item will not be deleted.
+
+```go
+func (p *Post) BeforeAPIDelete(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### AfterAPIDelete
+AfterAPIDelete is only called after a 3rd-party client triggers a delete to the
+database.
+
+```go
+func (p *Post) AfterAPIDelete(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### BeforeAPIUpdate
+BeforeAPIUpdate is only called before a 3rd-party client triggers an update to
+the database. By returning a non-nil `error` value, the item will not be updated.
+
+```go
+func (p *Post) BeforeAPIUpdate(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### AfterAPIUpdate
+AfterAPIUpdate is only called after a 3rd-party client triggers an update to
+the database.
+
+```go
+func (p *Post) AfterAPIUpdate(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### BeforeAdminCreate
+BeforeAdminCreate is only called before a CMS Admin creates a new Content item.
+It is not called for subsequent saves to the item once it has been created and
+assigned an ID. By returning a non-nil `error` value, the item will not be created.
+
+```go
+func (p *Post) BeforeAdminCreate(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### AfterAdminCreate
+AfterAdminCreate is only called after a CMS Admin creates a new Content item.
+It is not called for subsequent saves to the item once it has been created and
+assigned an ID.
+
+```go
+func (p *Post) AfterAdminCreate(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### BeforeAdminUpdate
+BeforeAdminUpdate is only called before a CMS Admin updates a Content item. By
+returning a non-nil `error`, the item will not be updated.
+
+```go
+func (p *Post) BeforeAdminUpdate(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### AfterAdminUpdate
+AfterAdminUpdate is only called after a CMS Admin updates a Content item.
+
+```go
+func (p *Post) AfterAdminUpdate(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### BeforeAdminDelete
+BeforeAdminDelete is only called before a CMS Admin deletes a Content item. By
+returning a non-nil `error` value, the item will not be deleted.
+
+```go
+func (p *Post) BeforeAdminDelete(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### AfterAdminDelete
+AfterAdminDelete is only called after a CMS Admin deletes a Content item.
+
+```go
+func (p *Post) AfterAdminDelete(res http.ResponseWriter, req *http.Request) error {
+ return nil
+}
+```
+
+#### BeforeEnable
+BeforeEnable is only applicable to Addon items, and is called before the addon
+changes status to "Enabled". By returning a non-nil `error` value, the addon
+will not become enabled.
+
+```go
+func (p *Post) BeforeEnable(http.ResponseWriter, *http.Request) error {
+ return nil
+}
+```
+
+#### AfterEnable
+AfterEnable is only applicable to Addon items, and is called after the addon
+changes status to "Enabled".
+```go
+func (p *Post) AfterEnable(http.ResponseWriter, *http.Request) error {
+ return nil
+}
+```
+
+#### BeforeDisable
+BeforeDisable is only applicable to Addon items, and is called before the addon
+changes status to "Disabled". By returning a non-nil `error` value, the addon
+will not become disabled.
+```go
+func (p *Post) BeforeDisable(http.ResponseWriter, *http.Request) error {
+ return nil
+}
+```
+
+#### AfterDisable
+AfterDisable is only applicable to Addon items, and is called after the addon
+changes status to "Disabled".
+```go
+func (p *Post) AfterDisable(http.ResponseWriter, *http.Request) error {
+ return nil
+}
+```
+
+Hookable is implemented by Item by default as no-ops which are expected to be overridden.
+
+!!! note "Note"
+ returning an error from any of these `Hookable` methods will end the request,
+ causing it to halt immediately after the hook. For example, returning an `error`
+ from `BeforeDelete` will result in the content being kept in the database.
+ The same logic applies to all of these interface methods that return an error
+ - **the error defines the behavior**.
+
+---
+
+### [item.Identifiable](https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Identifiable)
+Identifiable enables a struct to have its ID set/get. Typically this is done to set an ID to -1 indicating it is new for DB inserts, since by default a newly initialized struct would have an ID of 0, the int zero-value, and BoltDB's starting key per bucket is 0, thus overwriting the first record.
+Most notable, Identifiable’s `String` method is used to set a meaningful display name for an Item. `String` is called by default in the Admin dashboard to show the Items of certain types, and in the default creation of an Item’s slug.
+Identifiable is implemented by Item by default.
+
+##### Method Set
+```go
+type Identifiable interface {
+ ItemID() int
+ SetItemID(int)
+ UniqueID() uuid.UUID
+ String() string
+}
+```
+
+##### Implementation
+`item.Identifiable` has a default implementation in the `system/item` package.
+It is not advised to override these methods, with the exception of `String()`,
+which is commonly used to set the display name of Content items when listed in
+the CMS, and to customize slugs.
+
+```go
+func (i Item) ItemID() int {
+ return i.ID
+}
+
+func (i *Item) SetItemID(id int) {
+ i.ID = id
+}
+
+func (i Item) UniqueID() uuid.UUID {
+ return i.UUID
+}
+
+func (i Item) String() string {
+ return fmt.Sprintf("Item ID: %s", i.UniqueID())
+}
+```
+---
+
+### [item.Sluggable](https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Sluggable)
+Sluggable makes a struct locatable by URL with it's own path. As an Item implementing Sluggable, slugs may overlap. If this is an issue, make your content struct (or one which embeds Item) implement Sluggable and it will override the slug created by Item's `SetSlug` method with your own.
+It is not recommended to override `SetSlug`, but rather the `String` method on your content struct, which will have a similar, more predictable effect.
+Sluggable is implemented by Item by default.
+
+##### Method Set
+```go
+type Sluggable interface {
+ SetSlug(string)
+ ItemSlug() string
+}
+```
+
+##### Implementation
+`item.Sluggable` has a default implementation in the `system/item` package. It is
+possible to override these methods on your own Content types, but beware, behavior
+is undefined. It is tempting to override the `SetSlug()` method to customize your
+Content item slug, but try first to override the `String()` method found in the
+`item.Identifiable` interface instead. If you don't get the desired results, try
+`SetSlug()`.
+
+```go
+func (i *Item) SetSlug(slug string) {
+ i.Slug = slug
+}
+
+func (i *Item) ItemSlug() string {
+ return i.Slug
+}
+```
+---
+
+
+### [item.Sortable](https://godoc.org/github.com/ponzu-cms/ponzu/system/item#Sortable)
+Sortable enables items to be sorted by time, as per the sort.Interface interface. Sortable is implemented by Item by default.
+
+##### Method Set
+```go
+type Sortable interface {
+ Time() int64
+ Touch() int64
+}
+```
+
+##### Implementation
+`item.Sortable` has a default implementation in the `system/item` package. It is
+possible to override these methods on your own Content type, but beware, behavior
+is undefined.
+
+```go
+func (i Item) Time() int64 {
+ return i.Timestamp
+}
+
+func (i Item) Touch() int64 {
+ return i.Updated
+}
+```
+
diff --git a/docs/src/Interfaces/Search.md b/docs/src/Interfaces/Search.md
new file mode 100644
index 0000000..a7cd0d1
--- /dev/null
+++ b/docs/src/Interfaces/Search.md
@@ -0,0 +1,44 @@
+title: Search Package Interfaces
+
+Ponzu provides a set of interfaces from the `system/search` package to enable and customize full-text search access to content in your system. **Search is not enabled by default**, and must be enabled per Content type individually.
+
+## Interfaces
+
+### [search.Searchable](https://godoc.org/github.com/ponzu-cms/ponzu/system/search#Searchable)
+Searchable determines how content is indexed and whether the system should index the content when it is created and updated or be removed from the index when content is deleted.
+
+!!! warning ""
+ Search is **disabled** for all Content items by default. Each Content item that should be indexed and searchable must implement the `search.Searchable` interface.
+
+##### Method Set
+
+```go
+type Searchable interface {
+ SearchMapping() (*mapping.IndexMappingImpl, error)
+ IndexContent() bool
+}
+```
+
+By default, Ponzu sets up the [Bleve's](http://blevesearch.com) "default mapping", which is typically what you want for most content-based systems. This can be overridden by implementing your own `SearchMapping() (*mapping.IndexMappingImpl, error)` method on your Content type.
+
+This way, all you need to do to get full-text search is to add the `IndexContent() bool` method to each Content type you want search enabled. Return `true` from this method to enable search.
+
+
+##### Example
+```go
+// ...
+
+type Song struct {
+ item.Item
+
+ Name string `json:"name"`
+ // ...
+}
+
+func (s *Song) IndexContent() bool {
+ return true
+}
+```
+
+!!! tip "Indexing Existing Content"
+ If you previously had search disabled and had already added content to your system, you will need to re-index old content items in your CMS. Otherwise, they will not show up in search queries.. This requires you to manually open each item and click 'Save'. This could be scripted and Ponzu _might_ ship with a re-indexing function at some point in the fututre.
diff --git a/docs/src/Ponzu-Addons/Creating-Addons.md b/docs/src/Ponzu-Addons/Creating-Addons.md
new file mode 100644
index 0000000..c6aed40
--- /dev/null
+++ b/docs/src/Ponzu-Addons/Creating-Addons.md
@@ -0,0 +1,6 @@
+title: How to create Ponzu Addons
+
+# Coming soon
+
+For a reference to creating your own addons, see:
+[https://github.com/bosssauce/fbscheduler](https://github.com/bosssauce/fbscheduler)
diff --git a/docs/src/Ponzu-Addons/Using-Addons.md b/docs/src/Ponzu-Addons/Using-Addons.md
new file mode 100644
index 0000000..78200c5
--- /dev/null
+++ b/docs/src/Ponzu-Addons/Using-Addons.md
@@ -0,0 +1,6 @@
+title: How to use Ponzu Addons
+
+# Coming soon
+
+For a reference to creating your own addons, see:
+[https://github.com/bosssauce/fbscheduler](https://github.com/bosssauce/fbscheduler)
diff --git a/docs/src/Quickstart/Overview.md b/docs/src/Quickstart/Overview.md
new file mode 100644
index 0000000..6c4bec5
--- /dev/null
+++ b/docs/src/Quickstart/Overview.md
@@ -0,0 +1,38 @@
+### Quickstart Steps
+1) Install [Go 1.8+](https://golang.org/dl/)
+
+2) Install Ponzu CLI:
+```bash
+$ go get github.com/ponzu-cms/ponzu/…
+```
+
+3) Create a new project (path is created in your GOPATH):
+```bash
+$ ponzu new github.com/nilslice/reviews
+```
+
+4) Enter your new project directory:
+```bash
+$ cd $GOPATH/src/github.com/nilslice/reviews
+```
+
+5) Generate content type file and boilerplate code (creates `content/review.go`):
+```bash
+$ ponzu generate content review title:"string" author:"string" rating:"float64" body:"string":richtext website_url:"string" items:"[]string" photo:string:file`
+```
+
+6) Build your project:
+```bash
+$ ponzu build
+```
+
+7) Run your project with defaults:
+```bash
+$ ponzu run
+```
+
+8) Open browser to [`http://localhost:8080/admin`](http://localhost:8080/admin)
+
+### Notes
+- One-time initialization to set configuration
+- All fields can be changed in Configuration afterward
diff --git a/docs/src/References/Overview.md b/docs/src/References/Overview.md
new file mode 100644
index 0000000..8f5e40e
--- /dev/null
+++ b/docs/src/References/Overview.md
@@ -0,0 +1,218 @@
+title: References in Ponzu
+
+References in Ponzu allow you to create relationships between your Content types.
+Ponzu uses an embedded database, rather than a more traditional relational database
+with SQL support. This may seem unnatural since there is no native concept of
+"foreign keys" or "joins" like you may be used to. Instead, Ponzu wires up your
+data using references, which are simply URL paths, like `/api/content?type=Post&id=1`
+
+A foreign key as a URL path?! Am I crazy? No! For the purpose Ponzu serves,
+this structure works quite well, especially given its creation was specifically
+tuned for HTTP/2 features such as "Request/Response Multiplexing" and "Server Push."
+
+There is a deeper dive into the HTTP/2 concepts [below](/References/Overview/#designed-for-http2), but first we'll walk through
+a quick tutorial on Ponzu's references.
+
+To generate references from the CLI, please [read through the documentation](/CLI/Generating-References).
+The example below assumes you understand the syntax.
+
+---
+
+### Create Your Content Types
+
+Here we are creating two Content types, `Author` and `Book`. A `Book` will keep
+a reference to an `Author` in the sense that an author wrote the book.
+
+```bash
+$ ponzu gen c author name:string photo:string:file bio:string:textarea
+$ ponzu gen c book title:string author:@author,name pages:int year:int
+```
+
+The structs generated for each look like:
+
+`content/author.go`
+```go
+type Author struct {
+ item.Item
+
+ Name string `json:"name"`
+ Photo string `json:"photo"`
+ Bio string `json:"bio"`
+}
+```
+
+`content/book.go`
+```go
+type Book struct {
+ item.Item
+
+ Title string `json:"title"`
+ Author string `json:"author"`
+ Pages int `json:"pages"`
+ Year int `json:"year"`
+}
+```
+
+Notice how the `Author` field within the `Book` struct is a `string` type, not
+an `Author` type. This is because the `Author` is stored as a `string` in our
+database, as a reference to the `Author`, instead of embedding the `Author` data
+inside the `Book`.
+
+Some example JSON data for the two structs looks like:
+
+<kbd>GET</kbd> `/api/content?type=Author&id=1` (`Author`)
+```json
+{
+ "data": [
+ {
+ "uuid": "024a5797-e064-4ee0-abe3-415cb6d3ed18",
+ "id": 1,
+ "slug": "item-id-024a5797-e064-4ee0-abe3-415cb6d3ed18",
+ "timestamp": 1493926453826,
+ "updated": 1493926453826,
+ "name": "Shel Silverstein",
+ "photo": "/api/uploads/2017/05/shel-silverstein.jpg",
+ "bio": "Sheldon Allan Silverstein was an American poet..."
+ }
+ ]
+}
+```
+
+<kbd>GET</kbd> `/api/content?type=Book&id=1` (`Book`)
+```json
+{
+ "data": [
+ {
+ "uuid": "024a5797-e064-4ee0-abe3-415cb6d3ed18",
+ "id": 1,
+ "slug": "item-id-024a5797-e064-4ee0-abe3-415cb6d3ed18",
+ "timestamp": 1493926453826,
+ "updated": 1493926453826,
+ "title": "The Giving Tree",
+ "author": "/api/content?type=Author&id=1",
+ "pages": 57,
+ "year": 1964
+ }
+ ]
+}
+```
+
+As you can see, the `Author` is a reference as the `author` field in the JSON
+response for a `Book`. When you're building your client, you need to make a second
+request for the `Author`, to the URL path found in the `author` field of the `Book`
+response.
+
+For example, in pseudo-code:
+```bash
+# Request 1:
+$book = GET /api/content?type=Book&id=1
+
+# Request 2:
+$author = GET $book.author # where author = /api/content?type=Author&id=1
+```
+
+Until recently, this would be considered bad practice and would be costly to do
+over HTTP. However, with the wide availability of HTTP/2 clients, including all
+modern web browsers, mobile devices, and HTTP/2 libraries in practically every
+programming language, this pattern is fast and scalable.
+
+---
+
+### Designed For HTTP/2
+
+At this point, you've likely noticed that you're still making two independent
+HTTP requests to your Ponzu server. Further, if there are multiple references or more
+than one item, you'll be making many requests -- _how can that be efficient?_
+
+There are two main concepts at play: Request/Response Multiplexing and Server Push.
+
+#### Request/Response Multiplexing
+
+With HTTP/2, a client and server (peers) transfer data over a single TCP connection,
+and can send data back and forth at the same time. No longer does a request need
+to wait to be sent until after an expected response is read. This means that HTTP
+requests can be sent much faster and at the _same time_ on a single connection.
+Where previously, a client would open up several TCP connections, the re-use of a
+single connection reduces CPU overhead and makes the server more efficient.
+
+This feature is automatically provided to you when using HTTP/2 - the only
+requirement is that you connect via HTTPS and have active TLS certificates, which
+you can get for free by running Ponzu with the `--https` flag and configuring it
+with a properly set, active domain name of your own.
+
+#### Server Push
+
+Another impactful feature of HTTP/2 is "Server Push": the ability to preemptively
+send a response from the server to a client without waiting for a request. This
+is where Ponzu's reference design really shows it's power. Let's revisit the
+example from above:
+
+```bash
+# Request 1:
+$book = GET /api/content?type=Book&id=1
+
+# Request 2:
+$author = GET $book.author # where author = /api/content?type=Author&id=1
+```
+
+Instead of waiting for the server to respond with the data for `$book.author`,
+the response data is already in the client's cache before we even make the request!
+Now there is no round-trip made to the server and back, and the client reads the
+pushed response from cache in fractions of a millisecond.
+
+But, how does the server know which response to push and when? You'll need to
+specify which fields of the type you've requested should be pushed. This is done
+by implementing the [`item.Pushable` interface](/Interfaces/Item#itempushable).
+See the example below which demonstrates a complete implementation on the `Book`
+struct, which has a reference to an `Author`.
+
+##### Example
+
+`content/book.go`
+```go
+...
+type Book struct {
+ item.Item
+
+ Title string `json:"title"`
+ Author string `json:"author"`
+ Pages int `json:"pages"`
+ Year int `json:"year"`
+}
+
+
+func (b *Book) Push() []string {
+ return []string{
+ // the json struct tag is used to tell the server which
+ // field(s) it should push - only URL paths originating
+ // from your server can be pushed!
+ "author",
+ }
+}
+...
+```
+
+Now, whenever a single `Book` is requested, the server will preemptively push the
+`Author` referenced by the book. The response for the `Author` will _already be
+on the client_ and will remain there until a request for the referenced `Author`
+has been made.
+
+!!! note "What else can I Push?"
+ Only fields that are URL paths originating from your server can be pushed.
+ This means that you could also implement `item.Pushable` on the `Author`
+ type, and return `[]string{"photo"}` to push the Author's image!
+
+---
+
+### Other Considerations
+
+HTTP/2 Server Push is a powerful feature, but it can be abused just like anything
+else. To try and help mitigate potential issues, Ponzu has put some "stop-gaps"
+in place. Server Push is only activated on **single item** API responses, so you
+shouldn't expect to see references or files pushed from the `/api/contents` endpoint.
+An exception to this is the `/api/search` endpoint, which only the **first**
+result is pushed (if applicable) no matter how many items are in the response.
+
+You should take advantage of HTTP/2 in Ponzu and get the most out of the system.
+With the automatic HTTPS feature, there is no reason not to and you gain the
+additional benefit of encrypting your traffic - which your users will appreciate!
diff --git a/docs/src/Running-Backups/Backups.md b/docs/src/Running-Backups/Backups.md
new file mode 100644
index 0000000..15632a0
--- /dev/null
+++ b/docs/src/Running-Backups/Backups.md
@@ -0,0 +1,26 @@
+title: Running Backups on Ponzu systems
+
+Both the databases `system.db` & `analytics.db`, and the `/uploads` directory can be backed up over HTTP using `wget`, `curl`, etc. All of which are located at the `/admin/backup` route and require HTTP Basic Auth. In order to enable backups, you must add a user/password pair inside the CMS Configuration at `/admin/configure` near the bottom of the page.
+
+All backups are made using a `GET` request to the `/admin/backup` path with a query parameter of `?source={system,analytics,uploads}` (only one source can be included in the URL).
+
+Here are some full backup scripts to use or modify to fit your needs:
+[https://github.com/ponzu-cms/backup-scripts](https://github.com/ponzu-cms/backup-scripts)
+
+## System & Analytics
+The `system.db` & `analytics.db` data files are sent uncompressed in their original form as they exist on your server. No temporary copy is stored on the origin server, and it is possible that the backup could fail so checking for successful backups is recommended. See https://github.com/boltdb/bolt#database-backups for more information about how BoltDB handles HTTP backups.
+
+An example backup request for the `system.db` data file would look like:
+```bash
+$ curl --user user:pass "https://example.com/admin/backup?source=system" > system.db.bak
+```
+
+## Uploads
+The `/uploads` directory is gzip compressed and archived as a tar file, stored in the temporary directory (typically `/tmp` on Linux) on your origin server with a timestamp in the file name.
+
+An example backup request for the `/uploads` directory would look like:
+```bash
+$ curl --user user:pass "https://example.com/admin/backup?source=uploads" > uploads.tar.gz
+# unarchive the tarball with gzip
+$ tar xzf uploads.tar.gz
+``` \ No newline at end of file
diff --git a/docs/src/System-Configuration/Settings.md b/docs/src/System-Configuration/Settings.md
new file mode 100644
index 0000000..71fd2ec
--- /dev/null
+++ b/docs/src/System-Configuration/Settings.md
@@ -0,0 +1,124 @@
+title: Configuring Your Ponzu System Settings
+
+Ponzu has several options which can be configured at run-time. To view these
+configuration settings, visit the `/admin/configure` page of your Ponzu CMS.
+
+---
+
+#### Site Name
+The Site Name setting changes the displayed name on your admin dashboard. This is
+visible publicly on the `/admin/login` page.
+
+---
+
+#### Domain Name
+Internally, Ponzu needs to know where its canonical HTTP access origin is, and
+requires you to add the qualified domain name you are using. In development, use
+`localhost` or some other name mapped to the loopback address (`127.0.0.1`).
+
+Once you have deployed your Ponzu server to a remote host and pointed a public
+domain at it, you need to change the Domain Name setting to match. This is
+especially important when fetching TLS (SSL) certificates from [Let's Encrypt](https://letsencrypt.org)
+- since the process requires an active, verifiable domain. To set up your server
+with TLS over HTTPS connections, follow these steps:
+
+1. Set your Domain Name in the system configuration
+2. Set the Administrator Email to register with Let's Encrypt
+2. Stop your Ponzu server
+3. Run your Ponzu server with the `--https` flag e.g. `$ ponzu run --https`
+4. Visit your CMS admin with `https://` prepended to your URL
+
+!!! success "Verifying HTTPS / TLS Connections"
+ If successful, your APIs and CMS will be accessible via HTTPS, and you will
+ see a green indicator near the URL bar of most browsers. This also enables
+ your server to use the HTTP/2 protocol.
+
+##### Development Environment
+
+You can test HTTPS & HTTP/2 connections in your development environment on `localhost`,
+by running Ponzu with the `--devhttps` flag e.g. `$ ponzu --devhttps run`
+
+If you're greeted with a warning from the browser saying the connection is not
+secure, follow the steps outlined in the CLI message, or here:
+```
+If your browser rejects HTTPS requests, try allowing insecure connections on localhost.
+on Chrome, visit chrome://flags/#allow-insecure-localhost
+```
+
+---
+
+#### Administrator Email
+The Administrator Email is the contact email for the person who is the main admin
+of your Ponzu CMS. This can be changed at any point, but once a Let's Encrypt
+certificate has been fetched using an Administrator Email, it will remain the
+contact until a new certificate is requested.
+
+---
+
+#### Client Secret
+The Client Secret is a secure value used by the server to sign tokens and authenticate requests.
+**Do not share this** value with any untrusted party.
+
+!!! danger "Security and the Client Secret"
+ HTTP requests with a valid token, signed with the Client Secret, can take any
+ action an Admin can within the CMS. Be cautious of this when sharing account
+ logins or details with anyone.
+
+---
+
+#### Etag Header
+The Etag Header value is automatically created when content is changed and serves
+as a caching validation mechanism.
+
+---
+
+#### CORS
+CORS, or "Cross-Origin Resource Sharing" is a security setting which defines how
+resources (or URLs) can be accessed from outside clients / domains. By default,
+Ponzu HTTP APIs can be accessed from any origin, meaning a script from an unknown
+website could fetch data.
+
+By disabling CORS, you limit API requests to only the Domain Name you set.
+
+---
+
+#### GZIP
+GZIP is a popular codec which when applied to most HTTP responses, decreases data
+transmission size and response times. The GZIP setting on Ponzu has a minor
+side-effect of using more CPU, so you can disable it if you notice your system
+is CPU-constrained. However, traffic levels would need to be extremely demanding
+for this to be noticeable.
+
+---
+
+#### HTTP Cache
+The HTTP Cache configuration allows a system to disable the default HTTP cache,
+which saves the server from repeating API queries and sending responses -- it's
+generally advised to keep this enabled unless you have _frequently_ changing data.
+
+The `Max-Age` value setting overrides the default 2592000-second (30 day) cache
+`max-age` duration set in API response headers. The `0` value is an alias to
+`2592000`, so check the `Disable HTTP Cache` box if you don't want any caching.
+
+
+---
+
+#### Invalidate Cache
+If this box is checked and then the configuration is saved, the server will
+re-generate an Etag to send in responses. By doing so, the cache becomes invalidated
+and reset so new content or assets will be included in previously cached responses.
+
+The cache is invalidated when content changes, so this is typically not a widely
+used setting.
+
+---
+
+#### Database Backup Credentials
+In order to enable HTTP backups of the components that make up your system, you
+will need to add an HTTP Basic Auth user and password pair. When used to
+[run backups](/Running-Backups/Backups), the `user:password` pair tells your server
+that the backup request is made from a trusted party.
+
+!!! danger "Backup Access with Credentials"
+ This `user:password` pair should not be shared outside of your organization as
+ it allows full database downloads and archives of your system's uploads.
diff --git a/docs/src/System-Deployment/Docker.md b/docs/src/System-Deployment/Docker.md
new file mode 100644
index 0000000..a998a38
--- /dev/null
+++ b/docs/src/System-Deployment/Docker.md
@@ -0,0 +1,34 @@
+## Ponzu Docker build
+
+Ponzu is distributed as a [docker image](https://hub.docker.com/r/ponzu/ponzu/),
+which aids in ponzu deployment. The Dockerfile in this directory is used by Ponzu
+to generate the docker image which contains the ponzu executable.
+
+If you are deploying your own Ponzu project, you can write a new Dockerfile that
+is based from the `ponzu/ponzu` image of your choice. For example:
+```docker
+FROM ponzu/ponzu:latest
+
+# your project set up ...
+# ...
+# ...
+```
+
+### The following are convenient commands during development of Ponzu core:
+
+#### Build the docker image. Run from the root of the project.
+```bash
+# from the root of ponzu:
+docker build -t ponzu-dev
+```
+
+#### Start the image, share the local directory and pseudo terminal (tty) into for debugging:
+```bash
+docker run -v $(pwd):/go/src/github.com/ponzu-cms/ponzu -it ponzu-dev
+pwd # will output the go src directory for ponzu
+ponzu version # will output the ponzu version
+# make an edit on your local and rebuild
+go install ./...
+```
+
+Special thanks to [**@krismeister**](https://github.com/krismeister) for contributing this! \ No newline at end of file
diff --git a/docs/src/System-Deployment/SysV-Style.md b/docs/src/System-Deployment/SysV-Style.md
new file mode 100644
index 0000000..565b399
--- /dev/null
+++ b/docs/src/System-Deployment/SysV-Style.md
@@ -0,0 +1,76 @@
+title: Deploying Ponzu on Linux with System-V style init
+
+For reference, here is an example init script to run Ponzu servers. You must
+define the `PROJECT_DIR` & `RUNAS` variables by replacing `<PROJECT DIRECTORY>`
+& `<USER>` in the script below:
+
+```bash
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides: ponzu-server
+# Required-Start: $local_fs $network $named $time $syslog
+# Required-Stop: $local_fs $network $named $time $syslog
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Description: Ponzu API & Admin server
+### END INIT INFO
+
+PROJECT_DIR=<PROJECT DIRECTORY>
+SCRIPT='cd $PROJECT_DIR && ponzu run --port=80' # add --https here to get TLS/HTTPS
+RUNAS=<USER>
+
+PIDFILE=/var/run/ponzu-server.pid
+LOGFILE=/var/log/ponzu-server.log
+
+start() {
+ if [ -f /var/run/$PIDNAME ] && kill -0 $(cat /var/run/$PIDNAME); then
+ echo 'Service already running' >&2
+ return 1
+ fi
+ echo 'Starting service…' >&2
+ local CMD="$SCRIPT &> \"$LOGFILE\" & echo \$!"
+ su -c "$CMD" $RUNAS > "$PIDFILE"
+ echo 'Service started' >&2
+}
+
+stop() {
+ if [ ! -f "$PIDFILE" ] || ! kill -0 $(cat "$PIDFILE"); then
+ echo 'Service not running' >&2
+ return 1
+ fi
+ echo 'Stopping service…' >&2
+ kill -15 $(cat "$PIDFILE") && rm -f "$PIDFILE"
+ echo 'Service stopped' >&2
+}
+
+uninstall() {
+ echo -n "Are you really sure you want to uninstall this service? That cannot be undone. [yes|No] "
+ local SURE
+ read SURE
+ if [ "$SURE" = "yes" ]; then
+ stop
+ rm -f "$PIDFILE"
+ echo "Notice: log file is not be removed: '$LOGFILE'" >&2
+ update-rc.d -f <NAME> remove
+ rm -fv "$0"
+ fi
+}
+
+case "$1" in
+ start)
+ start
+ ;;
+ stop)
+ stop
+ ;;
+ uninstall)
+ uninstall
+ ;;
+ restart)
+ stop
+ start
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|restart|uninstall}"
+esac
+``` \ No newline at end of file
diff --git a/docs/src/images/editor-checkbox.png b/docs/src/images/editor-checkbox.png
new file mode 100644
index 0000000..dcea71c
--- /dev/null
+++ b/docs/src/images/editor-checkbox.png
Binary files differ
diff --git a/docs/src/images/editor-file-repeater.png b/docs/src/images/editor-file-repeater.png
new file mode 100644
index 0000000..ec4d372
--- /dev/null
+++ b/docs/src/images/editor-file-repeater.png
Binary files differ
diff --git a/docs/src/images/editor-file.png b/docs/src/images/editor-file.png
new file mode 100644
index 0000000..93ab56f
--- /dev/null
+++ b/docs/src/images/editor-file.png
Binary files differ
diff --git a/docs/src/images/editor-input-repeater.png b/docs/src/images/editor-input-repeater.png
new file mode 100644
index 0000000..5ab4256
--- /dev/null
+++ b/docs/src/images/editor-input-repeater.png
Binary files differ
diff --git a/docs/src/images/editor-input.png b/docs/src/images/editor-input.png
new file mode 100644
index 0000000..eea009a
--- /dev/null
+++ b/docs/src/images/editor-input.png
Binary files differ
diff --git a/docs/src/images/editor-richtext.png b/docs/src/images/editor-richtext.png
new file mode 100644
index 0000000..a953eda
--- /dev/null
+++ b/docs/src/images/editor-richtext.png
Binary files differ
diff --git a/docs/src/images/editor-select-repeater.png b/docs/src/images/editor-select-repeater.png
new file mode 100644
index 0000000..a175e5c
--- /dev/null
+++ b/docs/src/images/editor-select-repeater.png
Binary files differ
diff --git a/docs/src/images/editor-select.png b/docs/src/images/editor-select.png
new file mode 100644
index 0000000..ffd0ca6
--- /dev/null
+++ b/docs/src/images/editor-select.png
Binary files differ
diff --git a/docs/src/images/editor-tags.png b/docs/src/images/editor-tags.png
new file mode 100644
index 0000000..ea7c994
--- /dev/null
+++ b/docs/src/images/editor-tags.png
Binary files differ
diff --git a/docs/src/images/editor-textarea.png b/docs/src/images/editor-textarea.png
new file mode 100644
index 0000000..f714b48
--- /dev/null
+++ b/docs/src/images/editor-textarea.png
Binary files differ
diff --git a/docs/src/images/logo.png b/docs/src/images/logo.png
new file mode 100644
index 0000000..40b7b21
--- /dev/null
+++ b/docs/src/images/logo.png
Binary files differ
diff --git a/docs/src/images/ponzu-banner.png b/docs/src/images/ponzu-banner.png
new file mode 100644
index 0000000..855f97e
--- /dev/null
+++ b/docs/src/images/ponzu-banner.png
Binary files differ
diff --git a/docs/src/index.md b/docs/src/index.md
new file mode 100644
index 0000000..944a710
--- /dev/null
+++ b/docs/src/index.md
@@ -0,0 +1,41 @@
+# Ponzu CMS + Server Framework Docs
+
+![Ponzu](/images/ponzu-banner.png)
+
+## What is Ponzu?
+
+> Watch the [**video introduction**](https://www.youtube.com/watch?v=T_1ncPoLgrg)
+
+Ponzu is a powerful and efficient open-source HTTP server framework and CMS. It
+provides automatic, free, and secure HTTP/2 over TLS (certificates obtained via
+[Let's Encrypt](https://letsencrypt.org)), a useful CMS and scaffolding to generate
+content editors, and a fast HTTP API on which to build modern applications.
+
+Want to jump in right away? Try the [Quickstart](/Quickstart/Overview)
+
+### Table of Contents
+
+1. [CLI](/CLI/General-Usage/)
+2. [Content](/Content/An-Overview)
+3. [Form Fields](/Form-Fields/HTML-Inputs)
+4. [HTTP API - Content](/HTTP-APIs/Content)
+5. [HTTP API - File Metadata](/HTTP-APIs/File-Metadata)
+6. [HTTP API - Search](/HTTP-APIs/Search)
+7. [Interfaces - API](/Interfaces/API)
+8. [Interfaces - Editor](/Interfaces/Editor)
+9. [Interfaces - Item](/Interfaces/Item)
+10. [Interfaces - Search](/Interfaces/Search)
+11. [Creating Ponzu Addons](/Ponzu-Addons/Creating-Addons)
+12. [Using Ponzu Addons](/Ponzu-Addons/Using-Addons)
+13. [Quickstart](/Quickstart/Overview)
+14. [Backups](/Running-Backups/Backups)
+15. [System Configuration](/System-Configuration/Settings)
+
+
+### Need help? Get in touch
+- Chat: [#ponzu on Slack](https://gophers.slack.com/messages/C3TBV356D)
+- Reach out on Twitter: [@ponzu_cms](https://twitter.com/ponzu_cms)
+- File an [issue](https://github.com/ponzu-cms/ponzu/issues)
+
+---
+current version: `v0.9.2` @ ponzu:master