From 1c5e50a88b88ab1d2e500cdec0ab3257da2dce11 Mon Sep 17 00:00:00 2001 From: m1kadev Date: Fri, 9 Jan 2026 19:25:58 +0100 Subject: [PATCH] kethel: start stage 1 of build api: collect --- bricks/{base-header.html => base-header.thtml} | 0 .../{extended-footer.html => extended-footer.thtml} | 0 bricks/{footer.html => footer.thtml} | 0 bricks/{highlight.html => highlight.thtml} | 0 bricks/{navbar.html => navbar.thtml} | 0 kethel/lib/bricks.ex | 10 +++++----- kethel/lib/compilers.ex | 12 ++++++++++++ kethel/lib/filex.ex | 9 +++++++++ kethel/lib/kernelx.ex | 8 ++++++++ kethel/lib/pages.ex | 8 ++++++++ kethel/main.exs | 9 ++++++--- 11 files changed, 48 insertions(+), 8 deletions(-) rename bricks/{base-header.html => base-header.thtml} (100%) rename bricks/{extended-footer.html => extended-footer.thtml} (100%) rename bricks/{footer.html => footer.thtml} (100%) rename bricks/{highlight.html => highlight.thtml} (100%) rename bricks/{navbar.html => navbar.thtml} (100%) create mode 100644 kethel/lib/compilers.ex create mode 100644 kethel/lib/filex.ex create mode 100644 kethel/lib/kernelx.ex create mode 100644 kethel/lib/pages.ex diff --git a/bricks/base-header.html b/bricks/base-header.thtml similarity index 100% rename from bricks/base-header.html rename to bricks/base-header.thtml diff --git a/bricks/extended-footer.html b/bricks/extended-footer.thtml similarity index 100% rename from bricks/extended-footer.html rename to bricks/extended-footer.thtml diff --git a/bricks/footer.html b/bricks/footer.thtml similarity index 100% rename from bricks/footer.html rename to bricks/footer.thtml diff --git a/bricks/highlight.html b/bricks/highlight.thtml similarity index 100% rename from bricks/highlight.html rename to bricks/highlight.thtml diff --git a/bricks/navbar.html b/bricks/navbar.thtml similarity index 100% rename from bricks/navbar.html rename to bricks/navbar.thtml diff --git a/kethel/lib/bricks.ex b/kethel/lib/bricks.ex index 7e2e5b897f952b40c08e2561e6d07e388622db7c..e2f57a3264ba25a07031ad68a995428c4cfe916a 100644 --- a/kethel/lib/bricks.ex +++ b/kethel/lib/bricks.ex @@ -1,17 +1,17 @@ defmodule Bricks do @typedoc "A path, relative to mix.exs" - @type relative_path() :: String.t() + @type relative_path() :: binary() @typedoc "The name of the brick" - @type brick_name() :: String.t() + @type brick_name() :: binary() @typedoc "A valid mustache template" - @type mustache() :: String.t() + @type mustache() :: binary() - @spec collect(relative_path()) :: %{brick_name() => mustache()} + @spec collect(relative_path()) :: [ { brick_name(), mustache() } ] def collect(folder) do Path.wildcard(folder <> "/bricks/*.thtml") |> Enum.map(fn brick -> { brick, File.read!(brick) } end) - |> Enum.map(fn { brick, contents } -> { Path.basename(brick) |> Path.rootname(), contents } end) # "../bricks/base_header.html" would beccome just "base_header" + |> Enum.map(fn { brick, contents } -> { FileX.trimmed_filename(brick), contents } end) # "../bricks/base_header.html" would beccome just "base_header" end end diff --git a/kethel/lib/compilers.ex b/kethel/lib/compilers.ex new file mode 100644 index 0000000000000000000000000000000000000000..20459beef44760c3d9fd56ba12605500f26c7006 --- /dev/null +++ b/kethel/lib/compilers.ex @@ -0,0 +1,12 @@ +defmodule Compilers do + # TODO + @doc "Creates a random file in /tmp/kethel-TIME/, which functions as a pipe writing the given `data`" + @spec tempdata(binary()) :: binary() + defp tempdata(data) do + end + + + @doc "Invokes the fxg compiler on `data`. provides the output as a binary" + def fxg(path) do + end +end diff --git a/kethel/lib/filex.ex b/kethel/lib/filex.ex new file mode 100644 index 0000000000000000000000000000000000000000..606f6705772ca37a0a595cb1a3cdc7c636a4147d --- /dev/null +++ b/kethel/lib/filex.ex @@ -0,0 +1,9 @@ +defmodule FileX do + @typedoc "Any path" + @type path() :: binary() + + @spec trimmed_filename(path()) :: binary() + def trimmed_filename(path) do + Path.basename(path) |> Path.rootname() + end +end diff --git a/kethel/lib/kernelx.ex b/kethel/lib/kernelx.ex new file mode 100644 index 0000000000000000000000000000000000000000..61d513dab459b057b10fff8677a8772e408658cf --- /dev/null +++ b/kethel/lib/kernelx.ex @@ -0,0 +1,8 @@ +defmodule KernelX do + + @doc "Returns all bytes from `binary`, excluding those before `from`" + @spec binary_slice_from(binary(), pos_integer()) :: binary() + def binary_slice_from(binary, from) do + binary_part(binary, from, byte_size(binary) - from) + end +end diff --git a/kethel/lib/pages.ex b/kethel/lib/pages.ex new file mode 100644 index 0000000000000000000000000000000000000000..a960bce64fabc5661b2a13c70b0bc4c687a35780 --- /dev/null +++ b/kethel/lib/pages.ex @@ -0,0 +1,8 @@ +defmodule Pages do + def collect(context) do + pages_root = context.project_root <> "/pages" + pages = Path.wildcard(pages_root <> "/**/*.fxg") + |> Enum.map(fn path -> { path, File.read!(path) } end) + |> Enum.map(fn { path, data } -> { KernelX.binary_slice_from(path, byte_size(pages_root)), data } end) + end +end diff --git a/kethel/main.exs b/kethel/main.exs index 037295b0886a2fd31201d8b9bb9793730575ab3e..7a8b960b0bb84a5214cd1d1f50fb2bd2b4544837 100644 --- a/kethel/main.exs +++ b/kethel/main.exs @@ -3,9 +3,12 @@ args = System.argv() folder = Enum.at(args, 1) if folder != nil do - IO.inspect(folder) - bricks = Bricks.collect(folder) - IO.inspect(bricks) + project_root = Path.expand(folder) + context = %{ + project_root: project_root, + bricks: Bricks.collect(project_root) + } + pages = Pages.collect(context) else IO.puts(:stderr, "The root project folder should be provided on the command line") end