Packages
tableau
0.23.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/yaml_front_matter.ex
# Copyright (c) 2017 Sebastian De Deyne sebastiandedeyne@gmail.com
# Vendored from github.com/sebastiandedeyne/yaml_front_matter
defmodule Tableau.YamlFrontMatter.Error do
@moduledoc false
defexception message: "Error parsing yaml front matter"
end
defmodule Tableau.YamlFrontMatter do
@moduledoc false
def parse(string, opts \\ []) do
string
|> split_string()
|> process_parts(opts)
end
def parse!(string, opts \\ []) do
case parse(string, opts) do
{:ok, matter, body} -> {atomicize(matter), body}
{:error, _} -> raise Tableau.YamlFrontMatter.Error
end
end
defp split_string(string) do
split_pattern = ~r/[\s\r\n]---[\s\r\n]/s
string
|> String.trim_leading()
|> then(&("\n" <> &1))
|> then(&Regex.split(split_pattern, &1, parts: 3))
end
defp process_parts([_, yaml, body], opts) do
case parse_yaml(yaml, opts) do
{:ok, yaml} -> {:ok, yaml, body}
{:error, error} -> {:error, error}
end
end
defp process_parts(_, _), do: {:error, :invalid_front_matter}
defp parse_yaml(yaml, opts) do
case YamlElixir.read_from_string(yaml, opts) do
{:ok, parsed} -> {:ok, parsed}
error -> error
end
end
defp atomicize(map) when is_map(map) do
Map.new(map, fn
{k, v} when is_binary(k) -> {String.to_atom(k), atomicize(v)}
other -> other
end)
end
defp atomicize(list) when is_list(list) do
Enum.map(list, &atomicize/1)
end
defp atomicize(other), do: other
end