Skip to content

Commit a19a5d5

Browse files
committed
Cleaned up implementation. Additional tests.
1 parent de1bcb1 commit a19a5d5

File tree

2 files changed

+14
-37
lines changed

2 files changed

+14
-37
lines changed

lib/ex_doc/html_formatter/autolink.ex

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ defmodule ExDoc.HTMLFormatter.Autolink do
1919
"""
2020
def all(modules) do
2121
aliases = Enum.map modules, &(&1.module)
22-
Enum.map modules, &(&1 |> local_docs() |> project_docs(modules) |> all_typespecs(aliases))
22+
project_funs = all_functions(modules)
23+
Enum.map modules, &(&1 |> local_docs() |> project_docs(project_funs) |> all_typespecs(aliases))
2324
end
2425
2526
defp local_docs(ExDoc.ModuleNode[] = module) do
@@ -33,8 +34,7 @@ defmodule ExDoc.HTMLFormatter.Autolink do
3334
module.moduledoc(moduledoc).docs(docs)
3435
end
3536
36-
defp project_docs(ExDoc.ModuleNode[] = module, all_modules) do
37-
project_funs = all_functions(all_modules)
37+
defp project_docs(ExDoc.ModuleNode[] = module, project_funs) do
3838
moduledoc = module.moduledoc && project_doc(module.moduledoc, project_funs)
3939
4040
docs = lc node inlist module.docs do
@@ -62,16 +62,12 @@ defmodule ExDoc.HTMLFormatter.Autolink do
6262
module.typespecs(typespecs).docs(docs)
6363
end
6464
65-
@doc """
66-
Given a list of `ModulesNodes`, return a list of all functions defined in those modules.
67-
"""
68-
def all_functions(modules) do
69-
m = Enum.map modules, fn (mod) ->
65+
defp all_functions(modules) do
66+
Enum.flat_map modules, fn (mod) ->
7067
Enum.map mod.docs, fn (d) ->
7168
mod.id <> "." <> d.id
7269
end
7370
end
74-
List.flatten m
7571
end
7672
7773
@doc """
@@ -165,7 +161,7 @@ defmodule ExDoc.HTMLFormatter.Autolink do
165161
|> List.flatten
166162
|> Enum.filter(&(&1 in project_funs))
167163
|> Enum.reduce(bin, fn (x, acc) ->
168-
{mod_str, function_name, arity} = split_function(x)
164+
{ mod_str, function_name, arity } = split_function(x)
169165
escaped = Regex.escape(x)
170166
Regex.replace(%r/(?<!\[)`(\s*#{escaped}\s*)`(?!\])/, acc,
171167
"[`\\1`](#{mod_str}.html##{function_name}/#{arity})")
@@ -174,14 +170,7 @@ defmodule ExDoc.HTMLFormatter.Autolink do
174170

175171
defp split_function(bin) do
176172
[modules, arity] = String.split(bin, "/")
177-
rev = modules
178-
|> String.split(".")
179-
|> Enum.reverse
180-
function_name = hd(rev)
181-
mod_str = rev
182-
|> tl
183-
|> Enum.reverse
184-
|> Enum.join(".")
185-
{mod_str, function_name, arity}
173+
{ mod, name } = modules |> String.split(".") |> Enum.split(-1)
174+
{ Enum.join(mod, "."), hd(name), arity }
186175
end
187176
end

test/ex_doc/html_formatter/autolink_test.exs

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -49,26 +49,14 @@ defmodule ExDoc.HTMLFormatter.AutolinkTest do
4949
"[`Mod.funny_name\?/1`](Mod.html#funny_name\?/1) and [`Mod.funny_name!/2`](Mod.html#funny_name!/2)"
5050
end
5151

52-
# all_functions
53-
54-
test "all_functions returns empty for empty list" do
55-
assert Autolink.all_functions([]) == []
52+
test "autolink doesn't create links for undefined Mod.functions in docs" do
53+
assert Autolink.project_doc("`Mod.example/1`", ["Mod.example/2"]) == "`Mod.example/1`"
54+
assert Autolink.project_doc("`Mod.example/1`", []) == "`Mod.example/1`"
5655
end
5756

58-
test "all_functions returns the correct values" do
59-
defmodule Outer do
60-
defmodule Inner do
61-
def inner_one(_a), do: true
62-
def inner_two, do: true
63-
end
64-
def outer_one, do: true
65-
end
66-
67-
modules = ExDoc.Retriever.docs_from_modules([Outer, Outer.Inner], ExDoc.Config.new)
68-
modules = Autolink.all_functions modules
69-
set = HashSet.new modules
70-
expected = HashSet.new ["ExDoc.HTMLFormatter.AutolinkTest.Outer.outer_one/0", "ExDoc.HTMLFormatter.AutolinkTest.Outer.Inner.inner_one/1", "ExDoc.HTMLFormatter.AutolinkTest.Outer.Inner.inner_two/0"]
71-
assert set == expected
57+
test "autolink doesn't create links for pre-linked Mod.functions docs" do
58+
assert Autolink.project_doc("[`Mod.example/1`]()", ["Mod.example/1"]) == "[`Mod.example/1`]()"
59+
assert Autolink.project_doc("[the `Mod.example/1`]()", ["Mod.example/1"]) == "[the `Mod.example/1`]()"
7260
end
7361

7462
# typespec

0 commit comments

Comments
 (0)