Fermo

Usage

  1. Create an Elixir project:
$ mix new myProject
  1. Modify mix.exs

Configure the compiler:

  def project do
    [
      ...
      compilers: Mix.compilers() ++ [:fermo],
      ...
    ]
  end

Add the dependency:

{:fermo, "~> 0.2.1"}
  1. Get dependencies:
$ mix deps.get
  1. 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
  1. 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.

Fermo and DatoCMS

With the GraphQL client

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.