Skip to content

Commit 068ba02

Browse files
authored
Allow anchors on function and callback autolinks (#1921)
1 parent e54c4e7 commit 068ba02

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

lib/ex_doc/autolink.ex

+8-2
Original file line numberDiff line numberDiff line change
@@ -335,20 +335,22 @@ defmodule ExDoc.Autolink do
335335
end
336336

337337
defp parse_url(string, mode, config) do
338-
case Regex.run(~r{^(.+)/(\d+)$}, string) do
339-
[_, left, right] ->
338+
case Regex.run(~r{^(.+)/(\d+)(#.*)?$}, string) do
339+
[_, left, right | maybe_fragment] ->
340340
with {:ok, arity} <- parse_arity(right) do
341341
{kind, rest} = kind(left)
342342

343343
case config.language.parse_module_function(rest) do
344344
{:local, function} ->
345345
kind
346346
|> local_url(function, arity, config, string, mode: mode)
347+
|> maybe_append_nested_fragment(maybe_fragment)
347348
|> maybe_remove_link(mode)
348349

349350
{:remote, module, function} ->
350351
{kind, module, function, arity}
351352
|> remote_url(config, string, mode: mode)
353+
|> maybe_append_nested_fragment(maybe_fragment)
352354
|> maybe_remove_link(mode)
353355

354356
:error ->
@@ -611,6 +613,10 @@ defmodule ExDoc.Autolink do
611613
def format_visibility(:undefined, _kind), do: "undefined or private"
612614
def format_visibility(visibility, _kind), do: "#{visibility}"
613615

616+
defp maybe_append_nested_fragment(nil, _), do: nil
617+
defp maybe_append_nested_fragment(url, []), do: url
618+
defp maybe_append_nested_fragment(url, ["#" <> fragment]), do: url <> "-" <> fragment
619+
614620
defp append_fragment(url, nil), do: url
615621
defp append_fragment(url, fragment), do: url <> "#" <> fragment
616622
end

test/ex_doc/language/elixir_test.exs

+5
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,11 @@ defmodule ExDoc.Language.ElixirTest do
148148
~s|<a href="https://hexdocs.pm/elixir/GenServer.html#c:handle_call/3"><code class="inline">GenServer.handle_call/3</code></a>|
149149
end
150150

151+
test "elixir callback fragment" do
152+
assert autolink_doc("`c:GenServer.handle_call/3#fragment`") ==
153+
~s|<a href="https://hexdocs.pm/elixir/GenServer.html#c:handle_call/3-fragment"><code class="inline">GenServer.handle_call/3</code></a>|
154+
end
155+
151156
test "erlang callback" do
152157
assert autolink_doc("`c::gen_server.handle_call/3`") ==
153158
~s|<a href="https://www.erlang.org/doc/apps/stdlib/gen_server.html#c:handle_call/3"><code class="inline">:gen_server.handle_call/3</code></a>|

0 commit comments

Comments
 (0)