NAME

Statocles::Help::Config - A guide to configuring a Statocles site

VERSION

version 0.098

DESCRIPTION

This document describes how to set up a simple blog web site suitable to be deployed to GitHub Pages using Statocles.

This document explains how to build a configuration file without using the statocles create command.

Building site.yml - The Main Configuration File

Statocles uses Beam::Wire, a dependency-injection module, for configuration. The format is YAML and contains the data needed to build the objects: Arguments to the object's constructor. This means that any ATTRIBUTES defined in the documentation can be used in the configuration file.

The configuration file is, by default, called site.yml. See the statocles command documentation if you want to have multiple site configuration files.

A Source

Statocles takes simple, YAML-and-Markdown-formatted document files and builds HTML pages out of them.

So we need a place to put our source documents. A store fills multiple roles relating to reading and writing files. Right now, we need it to hold on to our blog posts. We'll put our blog posts in the blog directory.

$ mkdir blog

The blog application will use this store to add new blog posts and build web pages from the documents in the blog directory. More on that later.

An App

A Statocles app is the driver that turns documents into pages. To build pages, we need a store full of documents. We define our store with the string blog, which will get magically coerced into a store object.

Since we're building a blog site, we'll use the Statocles blog app:

# site.yml
blog_app:
    class: Statocles::App::Blog
    args:
        url_root: /blog
        store: 'blog'

We put our blog app under the root URL /blog. All pages that come from this app will start with /blog (except the index page, we'll move that to /, later).

A Deploy

To deploy our site to Github, we need to build a deploy object for Git repositories using Statocles::Deploy::Git. Our deploy object will copy our built pages into the Git repository and commit them. Our deploy will happen in the root directory of our site on the gh-pages branch.

# site.yml
github_deploy:
    class: Statocles::Deploy::Git
    args:
        branch: gh-pages

Though we are going to deploy to Git, we could also deploy to SFTP or FTP or transfer the pages to a CDN. See Statocles::Help::Deploy for more information.

A Theme

We could set up a theme (Statocles::Theme) to change how our site looks, but for now, we'll use the default theme included with Statocles. See Statocles::Help::Theme for information on how to change and customize your theme.

A Site

Now that we're ready, we can tie it all together. A site is a collection of apps that build and deploy to the same place.

# site.yml
site:
    class: Statocles::Site
    args:
        apps:
            blog:
                $ref: blog_app
        deploy:
            $ref: github_deploy
        title: My Site
        index: /blog
        nav:
            main:
                - title: Blog
                  href: /

When adding apps to our site, we give them a name (in this case blog) so that we can refer to them on the command-line (later).

As part of the default template, we can provide a site title.

The index attribute gives the path to the page to use as our index page. Since the blog's url_root is /blog, this will move the main blog page to the main site index /.

Finally, we can define a nav list, again giving a name: main. The default template uses the main nav across the top.

The Complete site.yml

Combine it all together and you get this. Feel free to copy and paste to start your own site.

# site.yml
blog_app:
    class: Statocles::App::Blog
    args:
        url_root: /blog
        store: 'blog'

github_deploy:
    class: Statocles::Deploy::Git
    args:
        branch: gh-pages

site:
    class: Statocles::Site
    args:
        apps:
            blog:
                $ref: blog_app
        deploy:
            $ref: github_deploy
        title: My Site
        index: /blog
        nav:
            main:
                - title: Blog
                  href: /

NOTE: One of the most useful things about using a dependency injection module is that you can easily plug-in your own classes. If you want to use your own template format, you can build your own Statocles::Theme class that provides a different kind of Statocles::Template object and use that instead. If you want to use your own document format, you can make your own Statocles::Store class that reads from a database.

The statocles Command

Now that we have a site.yml, we can run the statocles command to manage our site.

See Statocles::Help::Content for more information about editing the site's content.

Adding More Apps

In addition to our blog app, we also want to add some plain Markdown content, and some images.

Basic Pages

For basic pages with no structure or extras, there is the basic app: Statocles::App::Basic. The basic app takes the same YAML-and-Markdown-formatted documents as the blog app and creates HTML pages, without the lists, tags, and feeds the blog generates. The basic app also takes any other files (HTML, images, audio, video, and other formats) and copies them into the deployed site..

Like the blog, we need a store to find our documents. This time, we'll use the root directory of our repository, .. Finally, we'll need a URL root. Since we're using the root directory for our documents, we'll use the root URL for our destination /.

# site.yml
basic_app:
    class: Statocles::App::Basic
    args:
        url_root: '/'
        store: '.'

Add the New Apps

To enable the new app, we just need to add it to the site's apps.

# site.yml
site:
    class: Statocles::Site
    args:
        apps:
            blog:
                $ref: blog_app
            basic:
                $ref: basic_app
        deploy:
            $ref: github_deploy
        title: My Site
        index: /blog
        nav:
            main:
                - title: Blog
                  href: /

Add Basic Content

Now, we just need some content for our basic app to deploy. The basic app uses the same format as the blog, so we need a YAML header followed by some Markdown content:

Create a file named about.markdown with the following content:

---
title: About
---
# About Me

This is a personal website!

Then, run statocles daemon to test the new page.

Now we should probably make a link in our main nav to the new about page:

# site.yml
site:
    class: Statocles::Site
    args:
        apps:
            blog:
                $ref: blog_app
            basic:
                $ref: basic_app
        deploy:
            $ref: github_deploy
        title: My Site
        index: /blog
        nav:
            main:
                - title: Blog
                  href: /
                - title: About
                  href: /about.html

Now, if we run statocles build again, we can see the link in our header.

The Complete site.yml - With More Apps

Along with the blog app and our other settings, here is our new, complete site.yml:

# site.yml
blog_app:
    class: Statocles::App::Blog
    args:
        url_root: /blog
        store: 'blog'

basic_app:
    class: Statocles::App::Basic
    args:
        url_root: '/'
        store: '.'

github_deploy:
    class: Statocles::Deploy::Git
    args:
        branch: gh-pages

site:
    class: Statocles::Site
    args:
        apps:
            blog:
                $ref: blog_app
            basic:
                $ref: basic_app

        deploy:
            $ref: github_deploy

        title: My Site
        index: /blog
        nav:
            main:
                - title: Blog
                  href: /
                - title: About
                  href: /about.html

If we're satisfied with our new About page, we can deploy our site with statocles deploy.

DEFAULT THEME FEATURES

There are special features built-in to all default themes that can be enabled by adding the appropriate configuration to the site object or app objects.

Shortcut Icons

To add a shortcut icon to your site, place the image file anywhere that will be deployed (if you're using the configuration above, you can put it in the root). Then, add an icon property to the images key of the site object, like so:

site:
    class: Statocles::Site
    args:
        images:
            icon:
                src: /favicon.png

For more information, see the images attribute documentation.

Additional Stylesheets and Scripts

You can easily add extra scripts and stylesheets by adding them to the site's links attribute:

site:
    class: Statocles::Site
    args:
        links:
            stylesheet:
                - href: /css/site.css
            script:
                - href: /js/site.js

Create the files /css/site.css and /js/site.js and they will be picked up by the basic_app we created, above. If you accidentally create a link to a file that doesn't exist, Statocles will warn you.

Service Integration

There are third-party services that can be integrated into your site by adding keys to the data configuration section.

Disqus

Disqus is a free, hosted comment system that can be easily added to static sites to provide some user interaction.

To add Disqus comments to your blog, add your Disqus shortname (from http://YOUR_NAME.disqus.com/admin) to the site data, like so:

# site.yml
site:
    class: Statocles::Site
    args:
        # ...
        data:
            disqus:
                shortname: 'YOUR_NAME'

This will add a comments section to the bottom of your blog posts, and show the number of comments in the blog list pages.

ADVANCED CONFIGURATION

The configuration file is a Beam::Wire container. This means that any object attributes (in the ATTRIBUTES section of their documentation) can be set from the config file.

Plugins

Additional functionality can be added by plugins using the site's plugins attribute:

# site.yml
site:
    class: Statocles::Site
    args:
        # ...
        plugins:
            highlight:
                $class: Statocles::Plugin::Highlight
                $args:
                    theme: solarized-light

Each plugin has a name (highlight), and requires a $class (the class name of the plugin) and optional $args (the plugin's attributes).

See the list of bundled plugins.

Custom Markdown

To use a custom Markdown parser, like Text::MultiMarkdown, which has some extra syntax features, you can use the site object's markdown attribute to configure a custom object with $class and optional $args:

# site.yml
site:
    class: Statocles::Site
    args:
        # ...
        markdown:
            $class: Text::MultiMarkdown
            $args:
                use_metadata: false

SEE ALSO

Statocles::Help::Error - How to fix error messages from Statocles
Statocles::Help::Content - How to edit content with Statocles
Statocles::Help::Deploy - How to deploy a Statocles site
Statocles::Help::Theme - How to customize a Statocles theme

AUTHOR

Doug Bell <preaction@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2016 by Doug Bell.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.