lib/fermo/localizable.ex

defmodule Fermo.Localizable do
  import Fermo.Compilers, only: [templates: 1]
  import Fermo.I18n, only: [root_locale: 1]

  @source_path "priv/source"

  @callback add(map()) :: map()
  def add(%{i18n: i18n} = config) do
    root_locale = root_locale(config)
    locales = i18n

    exclude = Map.get(config, :exclude, []) ++ ["localizable/*"]
    config = put_in(config, [:exclude], exclude)

    extensions_and_paths =
      templates(Path.join(@source_path, "localizable"))
      |> Enum.map(fn {extension, path} ->
        {extension, Path.relative_to(path, @source_path)}
      end)

    Enum.reduce(extensions_and_paths, config, fn ({extension, template}, config) ->
      is_html = String.ends_with?(template, ".html.#{extension}")

      filename =
        template
        |> String.replace_prefix("localizable/", "")
        |> Fermo.Paths.template_to_filename(as_index_html: is_html)

      Enum.reduce(locales, config, fn (locale, config) ->
        localized_filename = if locale == root_locale do
            "/#{filename}"
          else
            "/#{locale}/#{filename}"
          end
        Fermo.Config.add_page(config, template, localized_filename, %{locale: locale})
      end)
    end)
  end
  def add(config), do: config
end