Packages
fermo
0.20.1
0.20.1
0.20.0
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.17.1
0.17.0
0.16.7
0.16.6
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.0
0.14.9
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.9
0.13.8
0.13.7
0.13.6
0.13.5
0.13.4
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.1
0.11.0
0.10.0
0.9.1
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.1
0.7.0
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.1
0.5.0
0.4.0
0.3.0
0.2.4
0.2.2
0.2.1
0.2.0
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
A static site generator
Current section
Files
Jump to
Current section
Files
lib/fermo/live/change_handler/template.ex
defmodule Fermo.Live.ChangeHandler.Template do
@moduledoc """
A change handler for template files in a Fermo project.
When a template file changes, this module is notified by
a `Fermo.Live.Watcher` and it triggers a recompilation of the templates.
"""
@behaviour Fermo.Live.ChangeHandler
alias Fermo.Live.{Dependencies, SocketRegistry}
alias Mix.Fermo.{Compiler, Paths}
require Logger
@impl true
def notify(path) do
app_relative_path =
path
|> Paths.app_relative_path()
|> template_relative_path()
recompile(app_relative_path)
end
defp recompile(template_path) do
Logger.debug("#{__MODULE__} - Recompiling template: #{template_path}")
recompile_updated()
notify_template_change(template_path)
end
defp recompile_updated() do
:ok = Compiler.run()
end
defp template_relative_path(path) do
root = "priv/source/"
if String.starts_with?(path, root) do
root_length = byte_size(root)
<<_::binary-size(root_length)>> <> rest = path
rest
end
end
defp notify_template_change(relative_path) do
{:ok, pages} = Dependencies.pages_by_dependency(relative_path)
Enum.each(pages, fn page ->
{:ok} = SocketRegistry.reload(page.path)
end)
end
end