Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 34 additions & 29 deletions lib/ex_doc/formatter/html.ex
Original file line number Diff line number Diff line change
Expand Up @@ -22,22 +22,22 @@ defmodule ExDoc.Formatter.HTML do
Formatter.copy_assets(config.assets, config.output) ++
Formatter.copy_assets(additional_assets(config), config.output)

search_data = generate_search_data(project_nodes, extras, config)
search_data = generate_search_data(config, project_nodes, extras)

{modules, tasks} = Enum.split_with(project_nodes, &(&1.type != :task))

all_files =
search_data ++
static_files ++
generate_sidebar_items(modules, tasks, extras, config) ++
generate_api_reference(modules, tasks, config) ++
generate_extras(extras, config) ++
generate_sidebar_items(config, modules, tasks, extras) ++
generate_api_reference(config, modules, tasks) ++
generate_extras(config, extras) ++
Formatter.copy_favicon(config, Path.join(@assets_dir, "favicon")) ++
Formatter.copy_logo(config, Path.join(@assets_dir, "logo")) ++
generate_search(config) ++
generate_not_found(config) ++
generate_list(modules, config) ++
generate_list(tasks, config) ++
generate_list(config, modules) ++
generate_list(config, tasks) ++
generate_redirects(config, ".html")

entrypoint = config.output |> Path.join("index.html") |> Path.relative_to_cwd()
Expand All @@ -48,30 +48,29 @@ defmodule ExDoc.Formatter.HTML do
filename = "404.html"
config = set_canonical_url(config, filename)
content = Templates.not_found_template(config)
File.write!("#{config.output}/#{filename}", content)
write!(config, filename, content)
[filename]
end

defp generate_search(config) do
filename = "search.html"
config = set_canonical_url(config, filename)
content = Templates.search_template(config)
File.write!("#{config.output}/#{filename}", content)
write!(config, filename, content)
[filename]
end

defp generate_sidebar_items(modules, tasks, extras, config) do
defp generate_sidebar_items(config, modules, tasks, extras) do
content = Templates.create_sidebar_items(config, modules, tasks, extras)

path = "dist/sidebar_items-#{digest(content)}.js"
File.write!(Path.join(config.output, path), content)
write!(config, path, content)
[path]
end

defp generate_search_data(linked, extras, config) do
defp generate_search_data(config, linked, extras) do
content = SearchData.create(linked, extras, config.proglang)
path = "dist/search_data-#{digest(content)}.js"
File.write!(Path.join(config.output, path), content)
write!(config, path, content)
[path]
end

Expand All @@ -82,14 +81,14 @@ defmodule ExDoc.Formatter.HTML do
|> binary_part(0, 8)
end

defp generate_extras(extras, config) do
defp generate_extras(config, extras) do
generated_extras =
extras
|> Enum.reject(&is_map_key(&1, :url))
|> with_prev_next()
|> Enum.map(fn {node, prev, next} ->
filename = "#{node.id}.html"
output = "#{config.output}/#{filename}"
output = Path.join(config.output, filename)
config = set_canonical_url(config, filename)

refs = %{
Expand All @@ -114,7 +113,7 @@ defmodule ExDoc.Formatter.HTML do
for %{source_path: source_path, id: id} when source_path != nil <- extras,
ext = extension_name(source_path),
ext == ".livemd" do
output = "#{config.output}/#{id}#{ext}"
output = Path.join(config.output, "#{id}#{ext}")

File.copy!(source_path, output)

Expand All @@ -135,13 +134,13 @@ defmodule ExDoc.Formatter.HTML do
]
end

defp generate_api_reference(_modules, _tasks, %{api_reference: false}) do
defp generate_api_reference(%{api_reference: false}, _modules, _tasks) do
[]
end

defp generate_api_reference(modules, tasks, config) do
defp generate_api_reference(config, modules, tasks) do
filename = "api-reference.html"
output = "#{config.output}/#{filename}"
output = Path.join(config.output, filename)
config = set_canonical_url(config, filename)

html = Templates.api_reference_template(config, modules, tasks)
Expand All @@ -154,7 +153,7 @@ defmodule ExDoc.Formatter.HTML do
[filename]
end

def generate_redirects(config, ext) do
defp generate_redirects(config, ext) do
config.redirects
|> Map.new()
|> Map.put_new("index", config.main)
Expand All @@ -173,7 +172,7 @@ defmodule ExDoc.Formatter.HTML do
_ -> to <> ext
end

generate_redirect(source, config, destination)
generate_redirect(config, source, destination)

source
end)
Expand All @@ -185,15 +184,15 @@ defmodule ExDoc.Formatter.HTML do
|> String.downcase()
end

defp generate_redirect(filename, config, redirect_to) do
without_anchor = String.split(redirect_to, "#") |> hd()
defp generate_redirect(config, filename, redirect_to) do
without_anchor = redirect_to |> String.split("#") |> hd()

unless case_sensitive_file_regular?("#{config.output}/#{without_anchor}") do
unless config.output |> Path.join(without_anchor) |> case_sensitive_file_regular?() do
ExDoc.warn("#{filename} redirects to #{redirect_to}, which does not exist", [])
end

content = Templates.redirect_template(config, redirect_to)
File.write!("#{config.output}/#{filename}", content)
write!(config, filename, content)
end

defp case_sensitive_file_regular?(path) do
Expand All @@ -205,17 +204,17 @@ defmodule ExDoc.Formatter.HTML do
end
end

defp generate_list(nodes, config) do
defp generate_list(config, nodes) do
nodes
|> Task.async_stream(&generate_module_page(&1, config), timeout: :infinity)
|> Task.async_stream(&generate_module_page(config, &1), timeout: :infinity)
|> Enum.map(&elem(&1, 1))
end

defp generate_module_page(module_node, config) do
defp generate_module_page(config, module_node) do
filename = "#{module_node.id}.html"
config = set_canonical_url(config, filename)
content = Templates.module_template(config, module_node)
File.write!("#{config.output}/#{filename}", content)
write!(config, filename, content)
filename
end

Expand All @@ -231,4 +230,10 @@ defmodule ExDoc.Formatter.HTML do
config
end
end

defp write!(config, filename, content) do
config.output
|> Path.join(filename)
|> File.write!(content)
end
end