53 lines
1.1 KiB
Elixir
53 lines
1.1 KiB
Elixir
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
|