Packages
ckeditor5_phoenix
1.28.2
1.28.2
1.28.1
1.28.0
1.27.2
1.27.1
1.27.0
1.26.0
1.25.1
1.25.0
1.24.2
1.24.1
1.24.0
1.23.0
1.22.0
1.21.0
1.20.0
1.19.0
1.18.0
1.17.2
1.17.1
1.17.0
1.16.1
1.16.0
1.15.8
1.15.7
1.15.6
1.15.5
1.15.4
1.15.3
1.15.2
1.15.1
1.15.0
1.14.2
1.14.1
1.14.0
1.13.0
1.12.0
1.11.0
1.10.2
1.10.1
1.10.0
1.9.0
1.8.0
1.7.0
1.6.0
1.5.0
1.4.1
1.4.0
1.3.0
1.2.1
1.2.0
1.1.0
1.0.8
1.0.7
CKEditor 5 integration for Phoenix Framework
Current section
Files
Jump to
Current section
Files
lib/custom_translations.ex
defmodule CKEditor5.CustomTranslations do
@moduledoc """
Represents custom translations configuration for CKEditor5.
"""
import Norm
alias CKEditor5.Errors
@derive Jason.Encoder
@type t :: %__MODULE__{
dictionary: %{String.t() => %{String.t() => String.t() | [String.t()]}}
}
defstruct dictionary: %{}
@doc """
Defines the schema for custom translations configuration.
"""
def s do
key_spec = one_of([spec(is_binary()), spec(is_atom())])
translation_value_spec = one_of([spec(is_binary()), spec(is_list())])
language_translations_spec = map_of(key_spec, translation_value_spec)
map_of(key_spec, language_translations_spec)
end
@doc """
Parses a map into a CustomTranslations struct.
Returns {:ok, %CustomTranslations{}} if valid, {:error, reason} if invalid.
"""
def parse(nil), do: {:ok, nil}
def parse(map) when is_map(map) do
case conform(map, s()) do
{:ok, _} -> {:ok, %__MODULE__{dictionary: map}}
{:error, errors} -> {:error, errors}
end
end
def parse(_), do: {:error, "Custom translations must be a map or nil"}
@doc """
Parses a map into a CustomTranslations struct.
Returns %CustomTranslations{} if valid, raises an error if invalid.
"""
def parse!(translations_data) do
case parse(translations_data) do
{:ok, translations} ->
translations
{:error, reason} ->
raise Errors.InvalidCustomTranslations,
reason: "Invalid custom translations: #{inspect(reason)}"
end
end
@doc """
Merges two CustomTranslations structs or maps.
"""
def merge(base, overrides) do
base_dictionary = to_dictionary(base)
overrides_dictionary = to_dictionary(overrides)
case {base_dictionary, overrides_dictionary} do
{nil, nil} -> nil
{dict, nil} -> %__MODULE__{dictionary: dict}
{nil, dict} -> %__MODULE__{dictionary: dict}
{dict1, dict2} -> %__MODULE__{dictionary: merge_translation_maps(dict1, dict2)}
end
end
# Merges translation maps with deep merging for language-specific translations
defp merge_translation_maps(base, overrides) do
Map.merge(base, overrides, fn _lang, base_lang_translations, override_lang_translations ->
Map.merge(base_lang_translations, override_lang_translations)
end)
end
defp to_dictionary(nil), do: nil
defp to_dictionary(%__MODULE__{dictionary: dict}), do: dict
defp to_dictionary(map) when is_map(map), do: map
end