diff --git a/lib/ex_doc/formatter/markdown.ex b/lib/ex_doc/formatter/markdown.ex index 9e39d80b0..63620c35b 100644 --- a/lib/ex_doc/formatter/markdown.ex +++ b/lib/ex_doc/formatter/markdown.ex @@ -6,6 +6,15 @@ defmodule ExDoc.Formatter.MARKDOWN do def run(config, project_nodes, extras) when is_map(config) do File.mkdir_p!(config.output) + static_files = + if Enum.all?(config.assets, fn {_k, target_dir} -> + config.output |> Path.join(target_dir) |> File.exists?() + end) do + [] + else + ExDoc.Formatter.copy_assets(config.assets, config.output) + end + {modules, tasks} = project_nodes |> Enum.filter(&(&1.source_format == "text/markdown")) @@ -16,7 +25,8 @@ defmodule ExDoc.Formatter.MARKDOWN do generate_api_reference(config, modules, tasks) ++ generate_extras(config, extras) ++ generate_list(config, modules) ++ - generate_list(config, tasks) + generate_list(config, tasks) ++ + static_files entrypoint = config.output |> Path.join("llms.txt") |> Path.relative_to_cwd() %{entrypoint: entrypoint, build: List.flatten(all_files)} diff --git a/test/ex_doc/formatter/markdown_test.exs b/test/ex_doc/formatter/markdown_test.exs index 408d35598..b74809996 100644 --- a/test/ex_doc/formatter/markdown_test.exs +++ b/test/ex_doc/formatter/markdown_test.exs @@ -288,4 +288,28 @@ defmodule ExDoc.Formatter.MarkdownTest do "*Consult [api-reference.md](api-reference.md) for complete listing*" end end + + describe "assets" do + test "copies assets from source", %{tmp_dir: tmp_dir} = context do + dir_name = Path.join(tmp_dir, "hello") + File.mkdir!(dir_name) + dir_name |> Path.join("world") |> File.touch!() + + config = config(context, assets: %{dir_name => "assets"}) + + generate(config) + + assert File.regular?(tmp_dir <> "/assets/world") + end + + test "does not override previous work from other formatters", %{tmp_dir: tmp_dir} = context do + dir_name = Path.join(tmp_dir, "assets") + File.mkdir!(dir_name) + info = File.stat!(dir_name) + config = config(context, assets: %{"test/tmp/markdown_assets/hello" => "assets"}) + generate(config) + + assert File.stat!(dir_name) == info + end + end end