defmodule Mix.Tasks.FormatLivebooks do
@moduledoc "Format Livebooks"
@shortdoc @moduledoc
@ignored_folders ["deps", "_build", ".elixir_ls"]
use Mix.Task
def run(_) do
get_nested_livebooks()
|> Enum.map(fn livemd ->
formatted_content =
File.read!(livemd)
|> LivebookFormatter.reformat()
File.write!(livemd, formatted_content)
end)
end
@spec get_nested_livebooks(String.t()) :: [String.t()]
defp get_nested_livebooks(path \\ "./") do
File.ls!(path)
|> Kernel.--(@ignored_folders)
|> Enum.map(fn file_or_dir ->
full_path = Path.join(path, file_or_dir)
if File.dir?(full_path) do
get_nested_livebooks(full_path)
else
full_path
end
end)
|> List.flatten()
|> Enum.filter(&String.ends_with?(&1, ".livemd"))
end
end