Current section
Files
Jump to
Current section
Files
lib/mix/tasks/docs.ex
defmodule Mix.Tasks.Ggity.Docs do
@shortdoc "Generates guides documentation."
@moduledoc @shortdoc
use Mix.Task
alias GGity.Docs
@examples [
Docs.Geom.Point,
Docs.Geom.Line,
Docs.Geom.Bar,
Docs.Geom.Boxplot,
Docs.Geom.Text,
Docs.Scale.Color.Viridis,
Docs.Theme,
Docs.Annotate
]
@aliases "alias GGity.{Examples, Plot}\n"
@element_import "import GGity.Element.{Line, Rect, Text}\n"
@docs_code """
|> Plot.plot()
"""
@to_file_code """
|> Plot.to_xml(550)
"""
@doc false
@spec run(list(any)) :: list(:ok)
def run(_argv) do
for example <- @examples, do: guides_for(example)
end
defp guides_for(example) do
[_elixir, _ggity, _docs | example_module] =
example
|> Atom.to_string()
|> String.downcase()
|> String.split(".")
name = Enum.join(example_module, "_")
guide_content =
example
|> apply(:examples, [])
|> Enum.with_index(1)
|> Enum.map(fn example -> generate_example(name, example) end)
File.write!("guides/#{name}.md", guide_content)
end
defp generate_example(name, {example, index}) do
image_example(name, example, index)
doc_example(name, example <> @docs_code, index)
end
defp image_example(name, example, index) do
full_code = @aliases <> @element_import <> example <> @to_file_code
{image, _mystery_list} = Code.eval_string(full_code)
file = "guides/assets/#{name}_#{index}.svg"
File.write!(file, image)
end
defp doc_example(name, example, index) do
"""
```
#{example}
```

"""
end
end