Skip to content

Commit a9de3e6

Browse files
authored
Make a function acceptable for :skip_code_autolink_to option (#1878)
1 parent 07b3495 commit a9de3e6

File tree

6 files changed

+48
-14
lines changed

6 files changed

+48
-14
lines changed

lib/ex_doc/autolink.ex

+4-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ defmodule ExDoc.Autolink do
2626
#
2727
# * `:skip_undefined_reference_warnings_on` - list of modules to skip the warning on
2828
#
29-
# * `:skip_code_autolink_to` - list of terms that will be skipped when autolinking (e.g: "PrivateModule")
29+
# * `:skip_code_autolink_to` - function that will be called with a term and return a boolean
30+
# whether to skip autolinking to it.
3031
#
3132
# * `:filtered_modules` - A list of module nodes that were filtered by the retriever
3233
#
@@ -54,7 +55,7 @@ defmodule ExDoc.Autolink do
5455
current_kfa: nil,
5556
siblings: [],
5657
skip_undefined_reference_warnings_on: [],
57-
skip_code_autolink_to: [],
58+
skip_code_autolink_to: &ExDoc.Config.skip_code_autolink_to/1,
5859
force_module_prefix: nil,
5960
filtered_modules: [],
6061
warnings: :emit
@@ -201,7 +202,7 @@ defmodule ExDoc.Autolink do
201202
end
202203

203204
def url(string, mode, config) do
204-
if Enum.any?(config.skip_code_autolink_to, &(&1 == string)) do
205+
if config.skip_code_autolink_to.(string) do
205206
nil
206207
else
207208
parse_url(string, mode, config)

lib/ex_doc/config.ex

+13-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ defmodule ExDoc.Config do
88
def before_closing_footer_tag(_), do: ""
99
def before_closing_body_tag(_), do: ""
1010
def annotations_for_docs(_), do: []
11+
def skip_code_autolink_to(_string), do: false
1112

1213
defstruct annotations_for_docs: &__MODULE__.annotations_for_docs/1,
1314
api_reference: true,
@@ -39,7 +40,7 @@ defmodule ExDoc.Config do
3940
project: nil,
4041
retriever: ExDoc.Retriever,
4142
skip_undefined_reference_warnings_on: [],
42-
skip_code_autolink_to: [],
43+
skip_code_autolink_to: &__MODULE__.skip_code_autolink_to/1,
4344
source_beam: nil,
4445
source_ref: @default_source_ref,
4546
source_url: nil,
@@ -77,7 +78,7 @@ defmodule ExDoc.Config do
7778
project: nil | String.t(),
7879
retriever: atom(),
7980
skip_undefined_reference_warnings_on: [String.t()],
80-
skip_code_autolink_to: [String.t()],
81+
skip_code_autolink_to: (String.t() -> boolean),
8182
source_beam: nil | String.t(),
8283
source_ref: nil | String.t(),
8384
source_url: nil | String.t(),
@@ -102,6 +103,9 @@ defmodule ExDoc.Config do
102103
options
103104
end
104105

106+
{skip_code_autolink_to, options} =
107+
Keyword.pop(options, :skip_code_autolink_to, &skip_code_autolink_to/1)
108+
105109
{source_url_pattern, options} =
106110
Keyword.pop_lazy(options, :source_url_pattern, fn ->
107111
guess_url(options[:source_url], options[:source_ref] || @default_source_ref)
@@ -116,6 +120,7 @@ defmodule ExDoc.Config do
116120
output: normalize_output(output),
117121
proglang: normalize_proglang(proglang),
118122
project: project,
123+
skip_code_autolink_to: normalize_skip_code_autolink_to(skip_code_autolink_to),
119124
source_url_pattern: source_url_pattern,
120125
version: vsn
121126
}
@@ -169,6 +174,12 @@ defmodule ExDoc.Config do
169174
defp normalize_filter_modules(fun) when is_function(fun, 2),
170175
do: fun
171176

177+
defp normalize_skip_code_autolink_to(strings) when is_list(strings),
178+
do: &(&1 in strings)
179+
180+
defp normalize_skip_code_autolink_to(fun) when is_function(fun, 1),
181+
do: fun
182+
172183
defp guess_url(url, ref) do
173184
with {:ok, host_with_path} <- http_or_https(url),
174185
{:ok, pattern} <- known_pattern(host_with_path, ref) do

lib/ex_doc/language/erlang.ex

+2-2
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,7 @@ defmodule ExDoc.Language.Erlang do
631631
visibility = Refs.get_visibility(ref)
632632

633633
cond do
634-
Enum.any?(config.skip_code_autolink_to, &(&1 == "t:#{name}/#{arity}")) ->
634+
config.skip_code_autolink_to.("t:#{name}/#{arity}") ->
635635
nil
636636

637637
visibility in [:public] ->
@@ -657,7 +657,7 @@ defmodule ExDoc.Language.Erlang do
657657
visibility = Refs.get_visibility(ref)
658658

659659
cond do
660-
Enum.any?(config.skip_code_autolink_to, &(&1 == "t:#{module}:#{name}/#{arity}")) ->
660+
config.skip_code_autolink_to.("t:#{module}:#{name}/#{arity}") ->
661661
nil
662662

663663
visibility in [:public] ->

lib/mix/tasks/docs.ex

+4-3
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,10 @@ defmodule Mix.Tasks.Docs do
157157
158158
* `:skip_code_autolink_to` - Similar to `:skip_undefined_reference_warnings_on`, this option
159159
controls which terms will be skipped by ExDoc when building documentation.
160-
Useful for example if you want to highlight private modules or functions
161-
without warnings (e.g.: `["PrivateModule", "PrivateModule.func/1"]`);
162-
default: `[]`.
160+
Useful for example if you want to highlight private modules or functions without warnings.
161+
This option can be a function from a term to a boolean (e.g.: `&String.match?(&1, ~r/PrivateModule/)`
162+
or a list of terms (e.g.:`["PrivateModule", "PrivateModule.func/1"]`);
163+
default is nothing to be skipped.
163164
164165
* `:source_beam` - Path to the beam directory; default: mix's compile path.
165166

test/ex_doc/config_test.exs

+24
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,28 @@ defmodule ExDoc.ConfigTest do
3030
assert config.filter_modules.(Foo, %{works: true})
3131
refute config.filter_modules.(Foo, %{works: false})
3232
end
33+
34+
test "normalizes skip_code_autolink_to" do
35+
config =
36+
ExDoc.Config.build(@project, @version,
37+
skip_code_autolink_to: ["ConfigTest.Hidden", "ConfigTest.Hidden.foo/1"]
38+
)
39+
40+
assert config.skip_code_autolink_to.("ConfigTest.Hidden")
41+
assert config.skip_code_autolink_to.("ConfigTest.Hidden.foo/1")
42+
refute config.skip_code_autolink_to.("ConfigTest.Hidden.foo/2")
43+
refute config.skip_code_autolink_to.("ConfigTest.Hidden.bar/1")
44+
refute config.skip_code_autolink_to.("ConfigTest.NotHidden")
45+
46+
config =
47+
ExDoc.Config.build(@project, @version,
48+
skip_code_autolink_to: &String.match?(&1, ~r/\AConfigTest\.Hidden/)
49+
)
50+
51+
assert config.skip_code_autolink_to.("ConfigTest.Hidden")
52+
assert config.skip_code_autolink_to.("ConfigTest.Hidden.foo/1")
53+
assert config.skip_code_autolink_to.("ConfigTest.Hidden.foo/2")
54+
assert config.skip_code_autolink_to.("ConfigTest.Hidden.bar/1")
55+
refute config.skip_code_autolink_to.("ConfigTest.NotHidden")
56+
end
3357
end

test/ex_doc/language/elixir_test.exs

+1-4
Original file line numberDiff line numberDiff line change
@@ -425,10 +425,7 @@ defmodule ExDoc.Language.ElixirTest do
425425
])
426426

427427
options = [
428-
skip_code_autolink_to: [
429-
"AutolinkTest.Hidden",
430-
"AutolinkTest.Hidden.foo/1"
431-
]
428+
skip_code_autolink_to: &String.match?(&1, ~r/\AAutolinkTest\.Hidden/)
432429
]
433430

434431
assert autolink_doc("`AutolinkTest.Hidden`", options) ==

0 commit comments

Comments
 (0)