From 973c217197be594f69c82da7965101f3503ac5d4 Mon Sep 17 00:00:00 2001 From: Milton Mazzarri Date: Sun, 8 Feb 2026 21:20:26 -0600 Subject: [PATCH 1/2] markdown: conditionally copy assets to target dir --- lib/ex_doc/formatter/markdown.ex | 12 +++++++++++- test/ex_doc/formatter/markdown_test.exs | 26 +++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) 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..200a916ff 100644 --- a/test/ex_doc/formatter/markdown_test.exs +++ b/test/ex_doc/formatter/markdown_test.exs @@ -288,4 +288,30 @@ 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 = "test/tmp/markdown_assets/hello" + File.mkdir_p!(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") + after + File.rm_rf!("test/tmp/markdown_assets") + 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 From 6262deabef40e136935dab0781eb9e5c2fab50da Mon Sep 17 00:00:00 2001 From: Milton Mazzarri Date: Mon, 9 Feb 2026 07:34:46 -0600 Subject: [PATCH 2/2] use tmp_dir exclusively --- test/ex_doc/formatter/markdown_test.exs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/test/ex_doc/formatter/markdown_test.exs b/test/ex_doc/formatter/markdown_test.exs index 200a916ff..b74809996 100644 --- a/test/ex_doc/formatter/markdown_test.exs +++ b/test/ex_doc/formatter/markdown_test.exs @@ -291,8 +291,8 @@ defmodule ExDoc.Formatter.MarkdownTest do describe "assets" do test "copies assets from source", %{tmp_dir: tmp_dir} = context do - dir_name = "test/tmp/markdown_assets/hello" - File.mkdir_p!(dir_name) + 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"}) @@ -300,8 +300,6 @@ defmodule ExDoc.Formatter.MarkdownTest do generate(config) assert File.regular?(tmp_dir <> "/assets/world") - after - File.rm_rf!("test/tmp/markdown_assets") end test "does not override previous work from other formatters", %{tmp_dir: tmp_dir} = context do