62 lines
1.7 KiB
Elixir
62 lines
1.7 KiB
Elixir
defmodule Pandoc do
|
|
@moduledoc """
|
|
Documentation for `Pandoc`.
|
|
"""
|
|
use GenServer
|
|
|
|
def start_link(args) do
|
|
GenServer.start_link(__MODULE__, args)
|
|
end
|
|
|
|
def init([profile | args]) do
|
|
IO.puts "pandoc filesystem watcher init args #{inspect(args)}"
|
|
# inspect(Application.get_all_env(:pandoc)) |> IO.puts
|
|
inspect(Application.get_env(:pandoc, profile)) |> IO.puts
|
|
{:ok, watcher_pid} = FileSystem.start_link(args)
|
|
FileSystem.subscribe(watcher_pid)
|
|
{:ok, %{watcher_pid: watcher_pid}}
|
|
end
|
|
|
|
def handle_info({:file_event, watcher_pid, {path, events}}, %{watcher_pid: watcher_pid} = state) do
|
|
case {Path.extname(path), :closed in events} do
|
|
{".md", true} ->
|
|
System.cmd("pandoc", [
|
|
"--mathjax",
|
|
path,
|
|
"-o",
|
|
Path.join("priv/static/posts", Path.basename(path) |> String.replace_suffix(".md", ".html") |> String.slice(11..-1//1))
|
|
])
|
|
_ -> nil
|
|
end
|
|
|
|
{:noreply, state}
|
|
end
|
|
|
|
def handle_info({:file_event, watcher_pid, :stop}, %{watcher_pid: watcher_pid} = state) do
|
|
# Your own logic when monitor stop
|
|
{:noreply, state}
|
|
end
|
|
|
|
def run(profile) do
|
|
# Application.get_env(:pandoc, a1) |> inspect(pretty: true) |> IO.puts
|
|
Application.get_all_env(profile) |> inspect(pretty: true) |> IO.puts
|
|
|
|
ref =
|
|
__MODULE__.Supervisor
|
|
|> Supervisor.start_child(
|
|
Supervisor.child_spec({Pandoc, [profile, dirs: ["priv/posts"]]}, restart: :transient, id:
|
|
__MODULE__.Watcher)
|
|
)
|
|
|> case do
|
|
{:ok, pid} -> pid
|
|
{:error, {:already_started, pid}} -> pid
|
|
end
|
|
|> Process.monitor()
|
|
|
|
receive do
|
|
{:DOWN, ^ref, _, _, _} -> :ok
|
|
end
|
|
end
|
|
end
|
|
|