defmodule Mix.Tasks.Mdex.GenerateSamples do use Mix.Task @shortdoc "Generate samples." @layout ~S""" MDEx Sample - <%= @filename %> <%= if @index do %> MDEx logo <% end %> <%= @inner_content %> """ @files [ {"req_readme.md", ~c"https://raw.githubusercontent.com/wojtekmach/req/main/README.md"} ] @impl true def run(_args) do :inets.start() :ssl.start() for {filename, url} <- @files do generate(filename, url) end langs() end defp generate(filename, url) do Mix.shell().info("#{filename} - #{url}") md = MDEx.to_html(download_source(url), features: [syntax_highlight_theme: "github_light"]) html = EEx.eval_string(@layout, assigns: %{filename: filename, inner_content: md} ) dest_path = Path.join([:code.priv_dir(:mdex), "generated", "samples", "#{filename}.html"]) File.write!(dest_path, html) generate_index() end defp generate_index do Mix.shell().info("index.html") src_path = Path.join([:code.priv_dir(:mdex), "generated", "samples"]) links = (src_path <> "/*.html") |> Path.wildcard() |> Enum.map(&Path.basename/1) |> Enum.reject(&(&1 == "index.html")) |> Enum.map(fn sample -> ["

", sample, "

", "\n"] end) inner_content = [ "

MDEx Samples

", "\n", links ] html = EEx.eval_string(@layout, assigns: %{inner_content: inner_content, index: true} ) dest_path = Path.join([:code.priv_dir(:mdex), "generated", "samples", "index.html"]) File.write!(dest_path, html) end defp langs do path = "langs.md" for theme <- [ "onedark", "dracula", "catppuccin_macchiato", "github_light", "github_dark", "autumn", "base16_default_dark", "emacs", "nord", "nord_light", "onelight", "solarized_dark", "solarized_light", "sonokai", "spacebones_light" ] do Mix.shell().info("#{path} - #{theme}") md = [:code.priv_dir(:mdex), "generated", "samples", path] |> Path.join() |> File.read!() md = MDEx.to_html(md, features: [syntax_highlight_theme: theme]) html = EEx.eval_string(@layout, assigns: %{filename: path, inner_content: md} ) dest_path = Path.join([:code.priv_dir(:mdex), "generated", "samples", "#{path}_#{theme}.html"]) File.write!(dest_path, html) end end defp download_source(url) do {:ok, {_, _, body}} = :httpc.request(url) to_string(body) end end