Web Dev Solutions

Catalin Mititiuc

aboutsummaryrefslogtreecommitdiff
path: root/lib/mix
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mix')
-rw-r--r--lib/mix/tasks/pandoc.ex62
-rw-r--r--lib/mix/tasks/pandoc.install.ex70
2 files changed, 108 insertions, 24 deletions
diff --git a/lib/mix/tasks/pandoc.ex b/lib/mix/tasks/pandoc.ex
index 2c1573d..a04ab26 100644
--- a/lib/mix/tasks/pandoc.ex
+++ b/lib/mix/tasks/pandoc.ex
@@ -1,13 +1,44 @@
defmodule Mix.Tasks.Pandoc do
- use Mix.Task
+ @moduledoc """
+ Invokes pandoc with the given args.
+
+ Usage:
+
+ $ mix pandoc TASK_OPTIONS PROFILE PANDOC_ARGS
+
+ Example:
+
+ $ mix pandoc default documents/hello.md -o priv/static/posts/hello.html
+
+ If pandoc is not installed, it is automatically downloaded. Note the
+ arguments given to this task will be appended to any configured arguments.
+
+ ## Options
+
+ * `--runtime-config` - load the runtime configuration
+ before executing command
- @ext ".md"
+ Note flags to control this Mix task must be given before the profile:
+
+ $ mix pandoc --runtime-config default documents/hello.md
+
+ """
+
+ @shortdoc "Invokes pandoc with the profile and args"
+ @compile {:no_warn_undefined, Mix}
+
+ use Mix.Task
@impl true
def run(args) do
switches = [runtime_config: :boolean]
{opts, remaining_args} = OptionParser.parse_head!(args, switches: switches)
+ if function_exported?(Mix, :ensure_application!, 1) do
+ Mix.ensure_application!(:inets)
+ Mix.ensure_application!(:ssl)
+ end
+
if opts[:runtime_config] do
Mix.Task.run("app.config")
else
@@ -19,28 +50,11 @@ defmodule Mix.Tasks.Pandoc do
install_and_run(remaining_args)
end
- defp install_and_run([profile | _args] = all) do
- IO.puts("Converting markdown...")
-
- profile = String.to_atom(profile)
- config = Application.get_env(:pandoc, profile)
- args = config[:args] || []
- opts = [cd: config[:cd] || File.cwd!()]
-
- out_path = List.last(args)
- full_out_path = [opts[:cd], out_path] |> Path.join() |> Path.expand()
- File.rm_rf!(full_out_path)
- File.mkdir_p!(full_out_path)
-
- opts[:cd]
- |> Path.join("*#{@ext}")
- |> Path.wildcard()
- |> Enum.each(fn path ->
- case Pandoc.run(profile, path) do
- 0 -> :ok
- status -> Mix.raise("`mix pandoc #{Enum.join(all, " ")}` exited with #{status}")
- end
- end)
+ defp install_and_run([profile | args] = all) do
+ case Pandoc.install_and_run(String.to_atom(profile), args) do
+ 0 -> :ok
+ status -> Mix.raise("`mix pandoc #{Enum.join(all, " ")}` exited with #{status}")
+ end
end
defp install_and_run([]) do
diff --git a/lib/mix/tasks/pandoc.install.ex b/lib/mix/tasks/pandoc.install.ex
new file mode 100644
index 0000000..1e36696
--- /dev/null
+++ b/lib/mix/tasks/pandoc.install.ex
@@ -0,0 +1,70 @@
+defmodule Mix.Tasks.Pandoc.Install do
+ @moduledoc """
+ Installs pandoc under `_build`.
+
+ ```bash
+ $ mix pandoc.install
+ $ mix pandoc.install --if-missing
+ ```
+
+ By default, it installs #{Pandoc.latest_version()} but you can configure it
+ in your config files, such as:
+
+ config :pandoc, :version, "#{Pandoc.latest_version()}"
+
+ ## Options
+
+ * `--runtime-config` - load the runtime configuration before executing
+ command
+
+ * `--if-missing` - install only if the given version does not exist
+ """
+
+ @shortdoc "Installs pandoc under _build"
+ @compile {:no_warn_undefined, Mix}
+
+ use Mix.Task
+
+ @impl true
+ def run(args) do
+ valid_options = [runtime_config: :boolean, if_missing: :boolean]
+
+ {opts, base_url} =
+ case OptionParser.parse_head!(args, strict: valid_options) do
+ {opts, []} ->
+ {opts, Pandoc.default_base_url()}
+
+ {opts, [base_url]} ->
+ {opts, base_url}
+
+ {_, _} ->
+ Mix.raise("""
+ Invalid arguments to pandoc.install, expected one of:
+
+ mix pandoc.install
+ mix pandoc.install 'https://github.com/jgm/pandoc/releases/download/$version/pandoc-$version-$target.tar.gz'
+ mix pandoc.install --runtime-config
+ mix pandoc.install --if-missing
+ """)
+ end
+
+ if opts[:runtime_config], do: Mix.Task.run("app.config")
+
+ if opts[:if_missing] && latest_version?() do
+ :ok
+ else
+ if function_exported?(Mix, :ensure_application!, 1) do
+ Mix.ensure_application!(:inets)
+ Mix.ensure_application!(:ssl)
+ end
+
+ Mix.Task.run("loadpaths")
+ Pandoc.install(base_url)
+ end
+ end
+
+ defp latest_version?() do
+ version = Pandoc.configured_version()
+ match?({:ok, ^version}, Pandoc.bin_version())
+ end
+end