Packages
spark
1.1.35
2.7.2
2.7.1
2.7.0
2.6.1
2.6.0
2.5.0
2.4.1
2.4.0
2.3.14
2.3.13
2.3.12
2.3.11
2.3.10
2.3.9
2.3.8
2.3.7
2.3.6
2.3.5
2.3.4
2.3.3
2.3.2
2.3.1
2.3.0
2.2.69
2.2.68
2.2.67
2.2.66
2.2.65
2.2.64
2.2.63
2.2.62
2.2.61
2.2.60
2.2.59
2.2.58
2.2.57
2.2.56
2.2.55
2.2.54
2.2.53
2.2.52
2.2.51
2.2.50
2.2.49
2.2.48
2.2.47
2.2.46
2.2.45
2.2.44
2.2.43
2.2.42
2.2.41
2.2.40
2.2.39
2.2.38
2.2.37
2.2.36
2.2.35
2.2.34
2.2.33
2.2.32
2.2.31
2.2.30
2.2.29
2.2.28
2.2.27
2.2.26
2.2.25
2.2.24
2.2.23
2.2.22
2.2.21
2.2.20
2.2.19
2.2.18
2.2.17
2.2.16
2.2.15
2.2.14
2.2.13
2.2.12
2.2.11
2.2.10
2.2.9
2.2.8
2.2.7
2.2.6
2.2.5
2.2.4
2.2.3
2.2.2
2.2.1
2.2.0
2.1.24
2.1.23
2.1.22
2.1.21
2.1.20
2.1.19
2.1.18
2.1.17
2.1.16
2.1.15
2.1.14
2.1.13
2.1.12
2.1.11
2.1.10
2.1.9
2.1.8
2.1.7
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.1
2.0.0
1.1.55
1.1.54
1.1.53
1.1.52
1.1.51
1.1.50
1.1.49
1.1.48
1.1.47
1.1.46
1.1.45
1.1.44
1.1.43
1.1.42
1.1.41
1.1.40
1.1.39
1.1.38
1.1.37
1.1.36
1.1.35
1.1.34
1.1.32
1.1.31
1.1.30
1.1.29
1.1.28
1.1.27
1.1.26
1.1.25
1.1.24
1.1.22
1.1.21
1.1.20
1.1.19
1.1.18
1.1.17
1.1.16
1.1.15
1.1.14
retired
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.18
0.2.17
0.2.16
0.2.15
0.2.14
0.2.13
0.2.12
0.2.11
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.29
0.1.28
0.1.27
0.1.26
0.1.25
0.1.24
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
Generic tooling for building DSLs
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/spark.cheat_sheets_in_search.ex
defmodule Mix.Tasks.Spark.CheatSheetsInSearch do
@shortdoc "Includes generated cheat sheets in the search bar"
@moduledoc @shortdoc
use Mix.Task
def run(opts) do
Mix.Task.run("compile")
{opts, _} =
OptionParser.parse!(opts,
switches: [strip_prefix: :string, check: :boolean, extensions: :string]
)
unless opts[:extensions] do
raise "Must supply a comma separated list of extensions to generate a .formatter.exs for"
end
extensions =
opts[:extensions]
|> String.split(",")
|> Enum.map(&Module.concat([&1]))
|> Enum.uniq()
with {:ok, search_data_file, search_data} <- search_data_file(),
{:ok, sidebar_items_file, sidebar_items} <- sidebar_items_file() do
{search_data, sidebar_items} =
Enum.reduce(extensions, {search_data, sidebar_items}, fn extension, acc ->
add_extension_to_search_data(extension, acc, opts)
end)
File.write!(search_data_file, "searchData=" <> Jason.encode!(search_data))
File.write!(sidebar_items_file, "sidebarNodes=" <> Jason.encode!(sidebar_items))
else
{:error, error} -> raise error
end
end
defp search_data_file do
"doc/dist/search_data-*.js"
|> Path.wildcard()
|> Enum.at(0)
|> case do
nil ->
{:error, "No search_data file found"}
file ->
case File.read!(file) do
"searchData=" <> contents ->
{:ok, file, Jason.decode!(contents)}
_ ->
{:error, "search data js file was malformed"}
end
end
end
defp sidebar_items_file do
"doc/dist/sidebar_items-*.js"
|> Path.wildcard()
|> Enum.at(0)
|> case do
nil ->
{:error, "No sidebar_items file found"}
file ->
case File.read!(file) do
"sidebarNodes=" <> contents ->
{:ok, file, Jason.decode!(contents)}
_ ->
{:error, "sidebar items js file was malformed"}
end
end
end
defp add_extension_to_search_data(extension, acc, opts) do
extension_name = Spark.Mix.Helpers.extension_name(extension, opts)
acc =
Enum.reduce(extension.sections(), acc, fn section, acc ->
add_section_to_search_data(extension_name, section, acc)
end)
Enum.reduce(
extension.dsl_patches(),
acc,
fn %Spark.Dsl.Patch.AddEntity{
section_path: section_path,
entity: entity
},
acc ->
add_entity_to_search_data(
extension_name,
entity,
acc,
section_path
)
end
)
end
defp add_section_to_search_data(
extension_name,
section,
{search_data, sidebar_items},
path \\ []
) do
search_data =
add_search_item(
search_data,
%{
"doc" => section.describe,
"ref" => "#{extension_name}.html##{Enum.join(path ++ [section.name], "-")}",
"title" => "#{extension_name}.#{Enum.join(path ++ [section.name], ".")}",
"type" => "DSL"
}
)
sidebar_items =
if path == [] do
sidebar_items
else
add_sidebar_header(
sidebar_items,
extension_name,
"#{Enum.join(path ++ [section.name], ".")}",
Enum.join(path ++ [section.name], "-")
)
end
search_data =
add_schema_to_search_data(
search_data,
extension_name,
section.schema,
path ++ [section.name]
)
sidebar_items =
add_schema_to_sidebar_items(
sidebar_items,
extension_name,
section.schema,
path ++ [section.name]
)
acc =
Enum.reduce(
section.sections,
{search_data, sidebar_items},
&add_section_to_search_data(extension_name, &1, &2, path ++ [section.name])
)
Enum.reduce(
section.entities,
acc,
&add_entity_to_search_data(extension_name, &1, &2, path ++ [section.name])
)
end
defp add_entity_to_search_data(extension_name, entity, {search_data, sidebar_items}, path) do
search_data =
add_search_item(
search_data,
%{
"doc" => entity.describe,
"ref" => "#{extension_name}.html##{Enum.join(path ++ [entity.name], "-")}",
"title" => "#{extension_name}.#{Enum.join(path ++ [entity.name], ".")}",
"type" => "DSL"
}
)
sidebar_items =
add_sidebar_header(
sidebar_items,
extension_name,
"#{Enum.join(path ++ [entity.name], ".")}",
Enum.join(path ++ [entity.name], "-")
)
search_data =
add_schema_to_search_data(
search_data,
extension_name,
entity.schema,
path ++ [entity.name]
)
sidebar_items =
add_schema_to_sidebar_items(
sidebar_items,
extension_name,
entity.schema,
path ++ [entity.name]
)
entity.entities
|> Enum.flat_map(&List.wrap(elem(&1, 1)))
|> Enum.reduce(
{search_data, sidebar_items},
&add_entity_to_search_data(extension_name, &1, &2, path ++ [entity.name])
)
end
defp add_schema_to_search_data(
search_data,
extension_name,
schema,
path
) do
Enum.reduce(schema || [], search_data, fn {key, config}, search_data ->
add_search_item(
search_data,
%{
"doc" => config[:doc] || "",
"ref" => "#{extension_name}.html##{Enum.join(path ++ [key], "-")}",
"title" => "#{extension_name}.#{Enum.join(path ++ [key], ".")}",
"type" => "DSL"
}
)
end)
end
defp add_schema_to_sidebar_items(
sidebar_items,
extension_name,
schema,
path
) do
Enum.reduce(schema, sidebar_items, fn {key, _value}, sidebar_items ->
add_sidebar_header(
sidebar_items,
extension_name,
"#{Enum.join(path ++ [key], ".")}",
Enum.join(path, "-"),
false
)
end)
end
defp add_sidebar_header(sidebar_items, extension_name, name, anchor, add_header? \\ true) do
sidebar_items
|> Map.put_new("extras", [])
|> Map.update!("extras", fn extras ->
Enum.map(extras, fn extra ->
replace_extra(extra, extension_name, name, anchor, add_header?)
end)
end)
end
defp replace_extra(extra, extension_name, name, anchor, add_header?) when is_list(extra) do
Enum.map(extra, &replace_extra(&1, extension_name, name, anchor, add_header?))
end
defp replace_extra(extra, extension_name, name, anchor, add_header?) do
if extra["title"] == "DSL: #{extension_name}" do
if add_header? do
Map.update(
extra,
"headers",
[sidebar_node(anchor, name)],
&Enum.uniq(&1 ++ [sidebar_node(anchor, name)])
)
else
extra
end
|> add_node_group(extension_name, name, anchor)
else
extra
end
end
defp add_node_group(extra, _extension_name, name, anchor) do
Map.update(
extra,
"nodeGroups",
[%{"key" => "dsls", "name" => "DSLs", "nodes" => [sidebar_node(anchor, name)]}],
fn node_groups ->
case Enum.find(node_groups, fn node_group ->
node_group["key"] == "dsls"
end) do
nil ->
[
%{"key" => "dsls", "name" => "DSLs", "nodes" => [sidebar_node(anchor, name)]},
node_groups
]
_ ->
Enum.map(node_groups, fn node_group ->
if node_group["key"] == "dsls" do
node_group
|> Map.put_new("nodes", [])
|> Map.update!("nodes", fn anchors ->
Enum.sort_by(Enum.uniq([sidebar_node(anchor, name) | anchors]), & &1["id"])
end)
else
node_group
end
end)
end
end
)
end
defp sidebar_node(anchor, name) do
%{"anchor" => anchor, "id" => name}
end
defp add_search_item(search_data, item) do
Map.update!(search_data, "items", &Enum.uniq([item | &1]))
end
end