defmodule Frontmark do @moduledoc """ Parses a frontmatter+markdown page """ def parse_yaml(string) do case YamlElixir.read_from_string(string) do {:ok, yaml} -> yaml {:error, _error} -> nil end end def parse(text) do text |> String.split(Application.get_env(:frontmark, :separator), parts: 2) end def process([frontmatter, markdown]) do [Frontmark.parse_yaml(frontmatter), Earmark.as_html!(markdown)] end def page([yaml, html]) do Enum.reduce(yaml, %{"content" => html}, fn {key, value}, acc -> Map.put(acc, key, value) end) end def filepath(path) do partial = Application.get_env(:frontmark, :pages_folder) <> path if String.slice(partial, -3, 3) == ".md" do partial else partial <> ".md" end end def get(path) do path |> Frontmark.filepath() |> File.read!() |> Frontmark.parse() |> Frontmark.process() |> Frontmark.page() end end