logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

compiler.ex (2681B)


  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Docs.Translator.Compiler do
  5. @external_resource "config/description.exs"
  6. @raw_config Pleroma.Config.Loader.read("config/description.exs")
  7. @raw_descriptions @raw_config[:pleroma][:config_description]
  8. defmacro __before_compile__(_env) do
  9. strings =
  10. __MODULE__.descriptions()
  11. |> __MODULE__.extract_strings()
  12. quote do
  13. def placeholder do
  14. unquote do
  15. Enum.map(
  16. strings,
  17. fn {path, type, string} ->
  18. ctxt = msgctxt_for(path, type)
  19. quote do
  20. Pleroma.Web.Gettext.dpgettext_noop(
  21. "config_descriptions",
  22. unquote(ctxt),
  23. unquote(string)
  24. )
  25. end
  26. end
  27. )
  28. end
  29. end
  30. end
  31. end
  32. def descriptions do
  33. Pleroma.Web.ActivityPub.MRF.config_descriptions()
  34. |> Enum.reduce(@raw_descriptions, fn description, acc -> [description | acc] end)
  35. |> Pleroma.Docs.Generator.convert_to_strings()
  36. end
  37. def extract_strings(descriptions) do
  38. descriptions
  39. |> Enum.reduce(%{strings: [], path: []}, &process_item/2)
  40. |> Map.get(:strings)
  41. end
  42. defp process_item(entity, acc) do
  43. current_level =
  44. acc
  45. |> process_desc(entity)
  46. |> process_label(entity)
  47. process_children(entity, current_level)
  48. end
  49. defp process_desc(acc, %{description: desc} = item) do
  50. %{
  51. strings: [{acc.path ++ [key_for(item)], "description", desc} | acc.strings],
  52. path: acc.path
  53. }
  54. end
  55. defp process_desc(acc, _) do
  56. acc
  57. end
  58. defp process_label(acc, %{label: label} = item) do
  59. %{
  60. strings: [{acc.path ++ [key_for(item)], "label", label} | acc.strings],
  61. path: acc.path
  62. }
  63. end
  64. defp process_label(acc, _) do
  65. acc
  66. end
  67. defp process_children(%{children: children} = item, acc) do
  68. current_level = Map.put(acc, :path, acc.path ++ [key_for(item)])
  69. children
  70. |> Enum.reduce(current_level, &process_item/2)
  71. |> Map.put(:path, acc.path)
  72. end
  73. defp process_children(_, acc) do
  74. acc
  75. end
  76. def msgctxt_for(path, type) do
  77. "config #{type} at #{Enum.join(path, " > ")}"
  78. end
  79. defp convert_group({_, group}) do
  80. group
  81. end
  82. defp convert_group(group) do
  83. group
  84. end
  85. def key_for(%{group: group, key: key}) do
  86. "#{convert_group(group)}-#{key}"
  87. end
  88. def key_for(%{group: group}) do
  89. convert_group(group)
  90. end
  91. def key_for(%{key: key}) do
  92. key
  93. end
  94. def key_for(_) do
  95. nil
  96. end
  97. end