From 068ba02412ae1bbdf14bd1042b853290b3cda410 Mon Sep 17 00:00:00 2001 From: Matt Enlow Date: Fri, 21 Jun 2024 02:03:24 -0600 Subject: [PATCH] Allow anchors on function and callback autolinks (#1921) --- lib/ex_doc/autolink.ex | 10 ++++++++-- test/ex_doc/language/elixir_test.exs | 5 +++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/ex_doc/autolink.ex b/lib/ex_doc/autolink.ex index b26d55df5..f7beb46fe 100644 --- a/lib/ex_doc/autolink.ex +++ b/lib/ex_doc/autolink.ex @@ -335,8 +335,8 @@ defmodule ExDoc.Autolink do end defp parse_url(string, mode, config) do - case Regex.run(~r{^(.+)/(\d+)$}, string) do - [_, left, right] -> + case Regex.run(~r{^(.+)/(\d+)(#.*)?$}, string) do + [_, left, right | maybe_fragment] -> with {:ok, arity} <- parse_arity(right) do {kind, rest} = kind(left) @@ -344,11 +344,13 @@ defmodule ExDoc.Autolink do {:local, function} -> kind |> local_url(function, arity, config, string, mode: mode) + |> maybe_append_nested_fragment(maybe_fragment) |> maybe_remove_link(mode) {:remote, module, function} -> {kind, module, function, arity} |> remote_url(config, string, mode: mode) + |> maybe_append_nested_fragment(maybe_fragment) |> maybe_remove_link(mode) :error -> @@ -611,6 +613,10 @@ defmodule ExDoc.Autolink do def format_visibility(:undefined, _kind), do: "undefined or private" def format_visibility(visibility, _kind), do: "#{visibility}" + defp maybe_append_nested_fragment(nil, _), do: nil + defp maybe_append_nested_fragment(url, []), do: url + defp maybe_append_nested_fragment(url, ["#" <> fragment]), do: url <> "-" <> fragment + defp append_fragment(url, nil), do: url defp append_fragment(url, fragment), do: url <> "#" <> fragment end diff --git a/test/ex_doc/language/elixir_test.exs b/test/ex_doc/language/elixir_test.exs index 69b4b8eb4..8af557826 100644 --- a/test/ex_doc/language/elixir_test.exs +++ b/test/ex_doc/language/elixir_test.exs @@ -148,6 +148,11 @@ defmodule ExDoc.Language.ElixirTest do ~s|GenServer.handle_call/3| end + test "elixir callback fragment" do + assert autolink_doc("`c:GenServer.handle_call/3#fragment`") == + ~s|GenServer.handle_call/3| + end + test "erlang callback" do assert autolink_doc("`c::gen_server.handle_call/3`") == ~s|:gen_server.handle_call/3|