Packages
tableau
0.8.0
0.30.0
0.29.0
0.28.0
0.27.1
0.27.0
0.26.1
0.26.0
0.25.1
0.25.0
0.24.1
0.24.0
0.23.1
0.23.0
0.22.0
0.21.0
0.20.1
0.20.0
0.19.0
0.18.0
0.17.1
0.17.0
0.16.0
0.15.3
0.15.2
0.15.1
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.0
0.11.1
0.11.0
0.10.1
0.10.0
0.9.0
0.8.0
0.7.1
0.7.0
0.6.0
0.5.0
0.4.0
0.3.1
0.3.0
0.2.0
0.1.2
0.1.1
0.1.0
Static site generator for elixir
Current section
Files
Jump to
Current section
Files
lib/tableau/extension.ex
defmodule Tableau.Extension do
@moduledoc ~s'''
A tableau extension.
An extension can be used to generate other kinds of content.
## Options
* `:key` - The key in which the extensions configuration and data is loaded.
* `:type` - The type of extension. See below for a description.
* `:priority` - An integer used for ordering extensions of the same type.
* `:enabled` - Whether or not to enable the extension. Defaults to true, and can be configured differently based on the extension.
## Types
There are currently the following extension types:
- `:pre_build` - executed before tableau builds your site and writes anything to disk.
- `:post_write` - executed after tableau builds your site and writes everything to disk.
## Example
```elixir
defmodule MySite.PostsExtension do
use Tableau.Extension, key: :posts, type: :pre_build, priority: 300
def run(token) do
posts = Path.wildcard("_posts/**/*.md")
for post <- post do
post
|> Markdown.render()
|> then(&File.write(Path.join(Path.rootname(post), "index.html"), &1))
end
{:ok, token}
end
end
```
'''
@typep extension_type :: :pre_build | :post_write
@type token :: map()
@doc """
The extension entry point.
The function is passed a token and can return a new token with new data loaded into it.
"""
@callback run(token()) :: {:ok, token()} | :error
defmacro __using__(opts) do
opts = Keyword.validate!(opts, [:key, :enabled, :type, :priority])
prelude =
quote do
def __tableau_extension_type__, do: unquote(opts)[:type]
def __tableau_extension_key__, do: unquote(opts)[:key]
def __tableau_extension_enabled__, do: unquote(opts)[:enabled] || true
def __tableau_extension_priority__, do: unquote(opts)[:priority] || 0
end
postlude =
quote do
@behaviour unquote(__MODULE__)
end
[prelude, postlude]
end
@doc false
@spec type(module()) :: extension_type()
def type(module) do
if function_exported?(module, :__tableau_extension_type__, 0) do
{:ok, module.__tableau_extension_type__()}
else
:error
end
end
@doc false
@spec key(module()) :: extension_type()
def key(module) do
if function_exported?(module, :__tableau_extension_key__, 0) do
{:ok, module.__tableau_extension_key__()}
else
:error
end
end
@doc false
@spec enabled?(module()) :: boolean()
def enabled?(module) do
if function_exported?(module, :__tableau_extension_enabled__, 0) do
module.__tableau_extension_enabled__()
else
false
end
end
end