Packages
tableau
0.15.1
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/extensions/data_extension.ex
defmodule Tableau.DataExtension do
@moduledoc """
YAML files and Elixir scripts (.exs) in the configured directory will be automatically parsed/executed and made available in an `@data` assign in your templates.
Elixir scripts will be executed and the last expression returned as the data.
## Configuration
- `:enabled` - boolean - Extension is active or not.
- `:dir` - string - Directory to scan for data files. Defaults to `_data`
### Example
```elixir
config :tableau, Tableau.DataExtension,
enabled: true,
dir: "_facts"
```
<!-- tabs-open -->
### YAML
```yaml
# _facts/homies.yaml
- name: Mitch
- name: Jimbo
- name: Bobby
```
```heex
<ul>
<li :for={homie <- @data["homies"]}>
<%= homie.name %>
</li>
</ul>
```
### Elixir
```elixir
# _facts/homies.exs
resp = Req.get!("https://example.com/homies")
resp.body["homies"]
```
```heex
<ul>
<li :for={homie <- @data["homies"]}>
<%= homie.name %>
</li>
</ul>
```
<!-- tabs-close -->
"""
use Tableau.Extension, key: :data, type: :pre_build, priority: 200
def run(token) do
data =
for file <- Path.wildcard(Path.join(token.data.dir, "**/*.{yml,yaml,exs}")), into: %{} do
case Path.extname(file) do
".exs" ->
key = Path.basename(file, ".exs")
{result, _binding} = Code.eval_file(file)
{key, result}
yaml when yaml in ~w[.yml .yaml] ->
key =
file
|> Path.basename(".yaml")
|> Path.basename(".yml")
{key, YamlElixir.read_from_file!(file)}
end
end
{:ok, Map.put(token, :data, data)}
end
end