Fermo

A static website generator written in Elixir

Because the world needs another static site generator, especially one written in Elixir!

Usage

Create an Elixir project:

$ mix new myProject

Add the dependency to mix.exs:

{:fermo, "~> 0.2.1"}

Get dependencies:

$ mix deps.get

Create lib/{{project name}}.ex:

defmodule MyProject do
@moduledoc """
Documentation for MyProject.
"""
use Fermo, %{
exclude: ["templates/*", "layouts/*", "javascripts/*", "stylesheets/*"],
i18n: [:it, :en]
}
def build do
config = config()
Fermo.build(config)
end
end

Build the project:

$ mix fermo.build

Approach

When a Fermo project is compiled, all pages (single pages, templates and partials) are located. Pages which have a special function (e.g. templates and partials) are filtered out and remaining pages are queued for conversion to HTML.

Dynamic, data-based pages are created with the page method.

Defaults

A number of helper methods are provided (e.g. javascript_include_tag).

Templates

Currently, Fermo only supports SLIM templates for HTML.

Parameters

Top level pages are called with the following parameters:

Context

Page

Information about the top-level page.

Partials

Partials are also called with the same 2 parameters, but the values in :page are those of the top-level page, not the partial itself.

Middleman to Fermo

Fermo was build to mimic the behaviour of Middleman, so it's defaults tend to be the same its progenitor.

See here.

Assets

Webpack-based assets can be integrated with the Fermo build.

Your config should product a manifest as build/manifest.json:

const ManifestPlugin = require('webpack-manifest-plugin')
module.exports = {
..
output: {
path: __dirname + '/build',
...
},
...
plugins: [
...
new ManifestPlugin()
]
}

Run the Webpack build:

config = Fermo.Assets.build(config)

You can then use the helpers provided by Fermo.Helpers.Assets such as javascript_include_tag and you will pick up the correctly hashed filenames.