add helpers, fix watch
This commit is contained in:
parent
8bc094afb8
commit
f743cca9fe
8 changed files with 48 additions and 67 deletions
|
@ -6,6 +6,7 @@ defmodule SloaneSH.Assets.Markdown do
|
|||
type = Keyword.fetch!(opts, :type)
|
||||
|
||||
quote do
|
||||
import SloaneSH.Layouts.Helpers, warn: false
|
||||
alias SloaneSH.Asset
|
||||
alias SloaneSH.FrontMatter
|
||||
alias SloaneSH.Layouts
|
||||
|
@ -49,7 +50,7 @@ defmodule SloaneSH.Assets.Markdown do
|
|||
end
|
||||
|
||||
defp do_render(ctx, {path, ".eex"}, data, attrs) do
|
||||
eexed = EEx.eval_string(data, ctx: ctx, attrs: attrs)
|
||||
eexed = eval_eex(data, "#{path}.eex", ctx, attrs)
|
||||
do_render(ctx, base_and_ext(path), eexed, attrs)
|
||||
end
|
||||
|
||||
|
@ -68,6 +69,15 @@ defmodule SloaneSH.Assets.Markdown do
|
|||
{base, ext}
|
||||
end
|
||||
|
||||
defp eval_eex(template, file, ctx, attrs) do
|
||||
{result, _binding} =
|
||||
template
|
||||
|> EEx.compile_string(file: file)
|
||||
|> Code.eval_quoted([ctx: ctx, attrs: attrs], __ENV__)
|
||||
|
||||
result
|
||||
end
|
||||
|
||||
def handle_attrs(cfg, path, data, attrs) do
|
||||
attrs
|
||||
end
|
||||
|
|
|
@ -3,7 +3,8 @@ defmodule SloaneSH.Layouts do
|
|||
`EEx` based layouts
|
||||
"""
|
||||
require EEx
|
||||
import SloaneSH.Layouts.Partials
|
||||
import SloaneSH.Layouts.Partials, warn: false
|
||||
import SloaneSH.Layouts.Helpers, warn: false
|
||||
|
||||
@layouts_dir Path.join(:code.priv_dir(:sloane_sh), "site/layouts")
|
||||
|
||||
|
|
19
lib/sloane_sh/layouts/helpers.ex
Normal file
19
lib/sloane_sh/layouts/helpers.ex
Normal file
|
@ -0,0 +1,19 @@
|
|||
defmodule SloaneSH.Layouts.Helpers do
|
||||
alias SloaneSH.Context
|
||||
|
||||
def cx(classes) do
|
||||
classes
|
||||
|> Enum.map(fn
|
||||
{_, _} = t -> t
|
||||
c -> {c, true}
|
||||
end)
|
||||
|> Enum.filter(fn {_, v} -> !!v end)
|
||||
|> Enum.map_join(" ", fn {class, _} -> class end)
|
||||
end
|
||||
|
||||
def sorted_post_attrs(%Context{} = ctx) do
|
||||
ctx.posts
|
||||
|> Enum.map(& &1.attrs)
|
||||
|> Enum.sort_by(& &1[:date], &Date.compare/2)
|
||||
end
|
||||
end
|
|
@ -3,6 +3,7 @@ defmodule SloaneSH.Layouts.Partials do
|
|||
HTML partials for use in HTML layouts
|
||||
"""
|
||||
require EEx
|
||||
import SloaneSH.Layouts.Helpers, warn: false
|
||||
|
||||
EEx.function_from_string(
|
||||
:def,
|
||||
|
@ -21,14 +22,4 @@ defmodule SloaneSH.Layouts.Partials do
|
|||
""",
|
||||
[:ctx, :attrs]
|
||||
)
|
||||
|
||||
defp cx(classes) do
|
||||
classes
|
||||
|> Enum.map(fn
|
||||
{_, _} = t -> t
|
||||
c -> {c, true}
|
||||
end)
|
||||
|> Enum.filter(fn {_, v} -> !!v end)
|
||||
|> Enum.map_join(" ", fn {class, _} -> class end)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,39 +0,0 @@
|
|||
defmodule SloaneSH.Markdown do
|
||||
@moduledoc """
|
||||
Markdown parsing using `Earmark` and `Earmark.Parser`
|
||||
"""
|
||||
require Logger
|
||||
use TypedStruct
|
||||
|
||||
alias SloaneSH.Context
|
||||
alias SloaneSH.FrontMatter
|
||||
alias __MODULE__
|
||||
|
||||
typedstruct do
|
||||
field :attrs, map(), default: %{}
|
||||
field :html, String.t(), default: ""
|
||||
field :text, String.t(), default: ""
|
||||
end
|
||||
|
||||
def transform(%Context{} = ctx, data) when is_binary(data) do
|
||||
with {:ok, attrs, body} <- FrontMatter.parse(data, ctx),
|
||||
{:ok, html, msgs} <- Earmark.as_html(body),
|
||||
{:ok, html_tree} <- Floki.parse_fragment(html) do
|
||||
for msg <- msgs, do: Logger.warning(msg)
|
||||
|
||||
{:ok,
|
||||
%Markdown{
|
||||
attrs: attrs,
|
||||
html: html,
|
||||
text: Floki.text(html_tree, sep: " ")
|
||||
}}
|
||||
else
|
||||
{:error, _, msgs} ->
|
||||
for msg <- msgs, do: Logger.error(msg)
|
||||
:error
|
||||
|
||||
_ ->
|
||||
:error
|
||||
end
|
||||
end
|
||||
end
|
|
@ -52,24 +52,14 @@ defmodule SloaneSH.Watch do
|
|||
end
|
||||
|
||||
@impl GenServer
|
||||
def handle_info({:file_event, pid, {path, events}}, %{ctx: ctx, watcher_pid: pid} = state) do
|
||||
def handle_info({:file_event, pid, {path, _events}}, %{ctx: ctx, watcher_pid: pid} = state) do
|
||||
if String.match?(path, ~r/layouts/) do
|
||||
recompile_layouts()
|
||||
Build.run(ctx)
|
||||
{:noreply, state}
|
||||
else
|
||||
ctx = Context.maybe_add(ctx, path)
|
||||
|
||||
if Context.in_context?(ctx, path) do
|
||||
path = Path.relative_to(path, ctx.config.pages_dir)
|
||||
Logger.info("File changed: #{path}")
|
||||
Build.build_page(ctx, path)
|
||||
end
|
||||
|
||||
%{state | ctx: ctx}
|
||||
|
||||
{:noreply, state}
|
||||
end
|
||||
|
||||
Build.run(ctx)
|
||||
|
||||
{:noreply, state}
|
||||
end
|
||||
|
||||
@impl GenServer
|
||||
|
@ -79,9 +69,10 @@ defmodule SloaneSH.Watch do
|
|||
end
|
||||
|
||||
defp recompile_layouts do
|
||||
helpers_source = Layouts.Helpers.module_info(:compile)[:source] |> List.to_string()
|
||||
partials_source = Layouts.Partials.module_info(:compile)[:source] |> List.to_string()
|
||||
layouts_source = Layouts.module_info(:compile)[:source] |> List.to_string()
|
||||
{:ok, _, _} = Kernel.ParallelCompiler.compile([partials_source, layouts_source])
|
||||
{:ok, _, _} = Kernel.ParallelCompiler.compile([helpers_source, partials_source, layouts_source])
|
||||
|
||||
:ok
|
||||
end
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
+++
|
||||
page_title = "home"
|
||||
permalink = "/"
|
||||
+++
|
||||
|
||||
hey, i'm sloane! i'm a professional software engineer and an amateur musician, photographer, wife, chef, and pet mom.
|
7
priv/site/pages/posts.html.eex
Normal file
7
priv/site/pages/posts.html.eex
Normal file
|
@ -0,0 +1,7 @@
|
|||
<ul>
|
||||
<%= for post <- sorted_post_attrs(ctx) do %>
|
||||
<li>
|
||||
<a href="<%= post[:permalink] %>"><%= post[:title] %></a>
|
||||
</li>
|
||||
<% end %>
|
||||
</ul>
|
Loading…
Reference in a new issue