Packages
tableau
0.2.0
0.30.0
0.29.0
0.28.0
0.27.1
0.27.0
0.26.1
0.26.0
0.25.1
0.25.0
0.24.1
0.24.0
0.23.1
0.23.0
0.22.0
0.21.0
0.20.1
0.20.0
0.19.0
0.18.0
0.17.1
0.17.0
0.16.0
0.15.3
0.15.2
0.15.1
0.15.0
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.0
0.11.1
0.11.0
0.10.1
0.10.0
0.9.0
0.8.0
0.7.1
0.7.0
0.6.0
0.5.0
0.4.0
0.3.1
0.3.0
0.2.0
0.1.2
0.1.1
0.1.0
Static site generator for elixir
Current section
Files
Jump to
Current section
Files
lib/tableau/live_reload.ex
defmodule Tableau.LiveReload do
@moduledoc false
require Logger
def init(opts \\ []) do
name = Keyword.get(opts, :name, :tableau_file_watcher)
FileSystem.subscribe(name)
end
def reload!({:file_event, _watcher_pid, {path, _event}}, opts \\ []) do
patterns = Keyword.get(opts, :patterns, [])
debounce = Keyword.get(opts, :debounce, 0)
callback = Keyword.get(opts, :callback, &Function.identity/1)
if matches_any_pattern?(path, patterns) do
ext = Path.extname(path)
for {path, ext} <- [{path, ext} | debounce(debounce, [ext], patterns)] do
asset_type = remove_leading_dot(ext)
Logger.debug("Live reload: #{Path.relative_to_cwd(path)}")
callback.(path)
send(self(), {:reload, asset_type})
end
end
end
defp debounce(0, _exts, _patterns), do: []
defp debounce(time, exts, patterns) when is_integer(time) and time > 0 do
Process.send_after(self(), :debounced, time)
debounce(exts, patterns)
end
defp debounce(exts, patterns) do
receive do
:debounced ->
[]
{:file_event, _pid, {path, _event}} ->
ext = Path.extname(path)
if matches_any_pattern?(path, patterns) and ext not in exts do
[{path, ext} | debounce([ext | exts], patterns)]
else
debounce(exts, patterns)
end
end
end
defp matches_any_pattern?(path, patterns) do
path = to_string(path)
Enum.any?(patterns, fn pattern ->
String.match?(path, pattern) and not String.match?(path, ~r{(^|/)_build/})
end)
end
defp remove_leading_dot("." <> rest), do: rest
defp remove_leading_dot(rest), do: rest
end