Initial commit

Working skeleton Conduit-based application, with home and resume URIs. Uses
Mustache for templating.

Sample HybridAuth middleware is present, though not yet used.
Working github link fetching

- Created a zf-console app, `bin/mwop.net.php`:
  - has a github-links target, which accepts the `--output` path, and,
    optionally, the `--template` string to use when creating links.
- Implemented configuration merging.
Moved config file under config/ directory
Wrote custom IoC implementation

- `Mwop\Services`, a small container for managing services, either via invokable
  class names or factories (which receive the container as an argument).
- Created `Mwop\Github\AtomReaderExtensions`, a custom feed extension manager,
  based on `Mwop\Services`, since the SM is no longer available.
- Updated web and console applications to use new service manager.
Conditional loading of middleware

- Don't pull middleware from IoC unless it will be used.
First milestone for contact

- Landing page works
  - incorporates pub/priv key values from config for recaptcha
  - injects CSRF token (via aura/session)
Thank you page for contact forms
Working contact form functionality

- Entire workflow is now implemented; contact is "middleware" that attaches its
  own middleware, each doing its own thing.
Hint that "from" field should be an email address
Working authentication workflow

- Uses [Opauth](https://github.com/opauth/opauth) to provide authentication via
  social authentication providers (currently github, facebook, and twitter).
- User details are stored in a session; The UserSession middleware then adds
  those details into the request on each request. Other middleware can then
  fetch that information to decide whether or not somebody is authorized.
  - Comics uses this workflow.
First pass at blog engine

Imported posts from original site, but changed namespace to Mwop\Blog\ (from
PhlyBlog). Imported Entry and Author entity objects from PhlyBlog, as well as related input
filters/validators/etc.

Created a database by iterating over all entries, capturing all but extended
content, and thus allowing fetching by author, tag, etc.

Middleware can now fetch individual entries, as well as paginate through
entries.

TODO:

- Disqus integration
- Timestamp formatting
- Tag links
- Importing CSS and JS into the layout (likely needs rewriting the JS)
- Tag cloud generation/display
- Fetching lists by tag/author
Blog posts by tag
Created EntryView

- Encapsulates all view logic for representing an entry.
Tag link rendering
Syntax highlighting

- Switched to prismjs, which is standalone; many, many fewer requirements,
  meaning no Dojo/jQuery/moo, etc. needed.
Tag cloud

- Implemented as a console script that can be run to generate the tag
  cloud at deployment. Templates then include it in when required.
Blog feeds

Two step feed process:

- Generate feeds using `bin/mwop.net.php feed-generator`
- Feeds are then available at:
  - `/blog/{rss,atom}.xml`
  - `/blog/tag/{rss,atom}.xml`
Console tool for creating database from blog posts

Tool that creates a new database (deleting it if it previously existed), and
then seeds it by iterating through posts on disk.

Also ensures that data/posts.db is never committed to the repo; it should be
generated.
Link feeds in layout

And for tag-specific listing pages, also add links to their specific feeds.
Full-page caching of blog posts

Write-through caching of blog posts.