summaryrefslogtreecommitdiff
path: root/lib/pleroma/docs/markdown.ex
blob: da3f20f4341ae46b0cd29e10acd94e1092f081f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
defmodule Pleroma.Docs.Markdown do
  @behaviour Pleroma.Docs.Generator

  @spec process(keyword()) :: {:ok, String.t()}
  def process(descriptions) do
    config_path = "docs/generated_config.md"
    {:ok, file} = File.open(config_path, [:utf8, :write])
    IO.write(file, "# Generated configuration\n")
    IO.write(file, "Date of generation: #{Date.utc_today()}\n\n")

    IO.write(
      file,
      "This file describe the configuration, it is recommended to edit the relevant `*.secret.exs` file instead of the others founds in the ``config`` directory.\n\n" <>
        "If you run Pleroma with ``MIX_ENV=prod`` the file is ``prod.secret.exs``, otherwise it is ``dev.secret.exs``.\n\n"
    )

    for group <- descriptions do
      if is_nil(group[:key]) do
        IO.write(file, "## #{inspect(group[:group])}\n")
      else
        IO.write(file, "## #{inspect(group[:key])}\n")
      end

      IO.write(file, "#{group[:description]}\n")

      for child <- group[:children] || [] do
        print_child_header(file, child)

        print_suggestions(file, child[:suggestions])

        if child[:children] do
          for subchild <- child[:children] do
            print_child_header(file, subchild)

            print_suggestions(file, subchild[:suggestions])
          end
        end
      end

      IO.write(file, "\n")
    end

    :ok = File.close(file)
    {:ok, config_path}
  end

  defp print_child_header(file, %{key: key, type: type, description: description} = _child) do
    IO.write(
      file,
      "- `#{inspect(key)}` (`#{inspect(type)}`): #{description}  \n"
    )
  end

  defp print_child_header(file, %{key: key, type: type} = _child) do
    IO.write(file, "- `#{inspect(key)}` (`#{inspect(type)}`)  \n")
  end

  defp print_suggestion(file, suggestion) when is_list(suggestion) do
    IO.write(file, "  `#{inspect(suggestion)}`\n")
  end

  defp print_suggestion(file, suggestion) when is_function(suggestion) do
    IO.write(file, "  `#{inspect(suggestion.())}`\n")
  end

  defp print_suggestion(file, suggestion, as_list \\ false) do
    list_mark = if as_list, do: "- ", else: ""
    IO.write(file, "  #{list_mark}`#{inspect(suggestion)}`\n")
  end

  defp print_suggestions(file, {:list_behaviour_implementations, behaviour}) do
    suggestions = Pleroma.Docs.Generator.list_behaviour_implementations(behaviour)
    print_suggestions(file, suggestions)
  end

  defp print_suggestions(_file, nil), do: nil

  defp print_suggestions(_file, ""), do: nil

  defp print_suggestions(file, suggestions) do
    if length(suggestions) > 1 do
      IO.write(file, "Suggestions:\n")

      for suggestion <- suggestions do
        print_suggestion(file, suggestion, true)
      end
    else
      IO.write(file, "  Suggestion: ")

      print_suggestion(file, List.first(suggestions))
    end
  end
end