63 lines
1.7 KiB
Elixir
63 lines
1.7 KiB
Elixir
defmodule BDS.StarterTemplates do
|
|
@moduledoc false
|
|
|
|
alias BDS.Frontmatter
|
|
alias BDS.Projects
|
|
|
|
@top_level_templates [
|
|
%{file_name: "single-post.liquid", slug: "single-post", title: "Single Post", kind: :post},
|
|
%{file_name: "post-list.liquid", slug: "post-list", title: "Post List", kind: :list},
|
|
%{file_name: "not-found.liquid", slug: "not-found", title: "Not Found", kind: :not_found}
|
|
]
|
|
|
|
def install(project) do
|
|
source_root = Path.join(Application.app_dir(:bds, "priv/starter_templates"), "templates")
|
|
target_root = Path.join(Projects.project_data_dir(project), "templates")
|
|
|
|
:ok = File.mkdir_p(target_root)
|
|
|
|
source_root
|
|
|> list_files()
|
|
|> Enum.each(fn source_path ->
|
|
relative_path = Path.relative_to(source_path, source_root)
|
|
target_path = Path.join(target_root, relative_path)
|
|
:ok = File.mkdir_p(Path.dirname(target_path))
|
|
|
|
unless File.exists?(target_path) do
|
|
case Enum.find(@top_level_templates, &(&1.file_name == relative_path)) do
|
|
nil ->
|
|
File.cp!(source_path, target_path)
|
|
|
|
template ->
|
|
body = File.read!(source_path)
|
|
|
|
File.write!(
|
|
target_path,
|
|
Frontmatter.serialize_document(
|
|
[
|
|
{:id, Ecto.UUID.generate()},
|
|
{:slug, template.slug},
|
|
{:title, template.title},
|
|
{:kind, template.kind},
|
|
{:enabled, true},
|
|
{:version, 1}
|
|
],
|
|
body
|
|
)
|
|
)
|
|
end
|
|
end
|
|
end)
|
|
|
|
:ok
|
|
end
|
|
|
|
defp list_files(root) do
|
|
root
|
|
|> Path.join("**/*")
|
|
|> Path.wildcard(match_dot: true)
|
|
|> Enum.reject(&File.dir?/1)
|
|
|> Enum.sort()
|
|
end
|
|
end
|