summaryrefslogtreecommitdiff
path: root/lib/pleroma/docs/translator/compiler.ex
blob: 21c02b50b984665175d7f1f865e503dd689e3c03 (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
# Pleroma: A lightweight social networking server
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Pleroma.Docs.Translator.Compiler do
  @external_resource "config/description.exs"
  @raw_config Pleroma.Config.Loader.read("config/description.exs")
  @raw_descriptions @raw_config[:pleroma][:config_description]

  defmacro __before_compile__(_env) do
    strings =
      __MODULE__.descriptions()
      |> __MODULE__.extract_strings()

    quote do
      def placeholder do
        unquote do
          Enum.map(
            strings,
            fn string ->
              quote do
                Pleroma.Web.Gettext.dgettext_noop("config_descriptions", unquote(string))
              end
            end
          )
        end
      end
    end
  end

  def descriptions do
    Pleroma.Web.ActivityPub.MRF.config_descriptions()
    |> Enum.reduce(@raw_descriptions, fn description, acc -> [description | acc] end)
    |> Pleroma.Docs.Generator.convert_to_strings()
  end

  def extract_strings(descriptions) do
    descriptions
    |> Enum.reduce([], &process_item/2)
  end

  defp process_item(entity, acc) do
    current_level =
      acc
      |> process_desc(entity)
      |> process_label(entity)

    process_children(entity, current_level)
  end

  defp process_desc(acc, %{description: desc}) do
    [desc | acc]
  end

  defp process_desc(acc, _) do
    acc
  end

  defp process_label(acc, %{label: label}) do
    [label | acc]
  end

  defp process_label(acc, _) do
    acc
  end

  defp process_children(%{children: children}, acc) do
    children
    |> Enum.reduce(acc, &process_item/2)
  end

  defp process_children(_, acc) do
    acc
  end
end