Fermo

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.

Helpers

FermoHelpers.DateTime

If you want to use current_datetime/1, you need to include the following dependency:

{:tzdata, "~> 1.0"}

and add a config option

config :elixir, :time_zone_database, Tzdata.TimeZoneDatabase

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.