defmodule PreDotHn.Frontmatter do @frontmatter_pattern ~r/---\r?\n/ def make_frontmatter(path, frontmatter_text) do case YamlElixir.read_from_string(frontmatter_text) do {:ok, fm} -> fm _other -> %{} end |> merge_frontmatter_defaults(path) end def merge_frontmatter_defaults(fm, path) do {date, slug} = path_parts(path) fm |> Map.put_new_lazy("slug", fn -> slug end) |> Map.put_new_lazy("date", fn -> date end) |> Map.put_new_lazy("title", fn -> "" end) end @path_parts ~r/([0-9]{4}-[0-9]{2}-[0-9]{2})?-?(.*)?/ def path_parts(path) do filename = Path.basename(path) [basename | _] = String.split(filename, ".") [_, date_part, slug_part] = Regex.run(@path_parts, basename) date_part = if date_part == "", do: nil, else: date_part slug_part = if slug_part == "", do: date_part, else: slug_part {date_part, slug_part} end def front_matter_split(body) do case String.split(body, @frontmatter_pattern, parts: 3) do ["", frontmatter, body] -> {frontmatter, body} _other -> {"", body} end end end