85 lines
2.5 KiB
Elixir
85 lines
2.5 KiB
Elixir
defmodule Mobilizon.Service.Metadata.Utils do
|
|
@moduledoc """
|
|
Tools to convert tags to string.
|
|
"""
|
|
|
|
alias Mobilizon.Service.{Address, DateTime}
|
|
alias Mobilizon.Service.Formatter.HTML, as: HTMLFormatter
|
|
alias Phoenix.HTML
|
|
import Mobilizon.Web.Gettext, only: [gettext: 1]
|
|
|
|
@slice_limit 200
|
|
|
|
@doc """
|
|
Converts list of tags, containing either `t:Phoenix.HTML.safe/0` or strings, to a concatenated string listing the tags
|
|
"""
|
|
@spec stringify_tags(list(Phoenix.HTML.safe() | String.t())) :: String.t()
|
|
def stringify_tags(tags), do: Enum.reduce(tags, "", &stringify_tag/2)
|
|
|
|
@doc """
|
|
Removes the HTML tags from a text
|
|
"""
|
|
@spec strip_tags(String.t()) :: String.t()
|
|
def strip_tags(text), do: HTMLFormatter.strip_tags_and_insert_spaces(text)
|
|
|
|
@doc """
|
|
Processes a text and limits it.
|
|
|
|
* Removes the HTML tags from a text
|
|
* Slices it to a limit and add an ellipsis character
|
|
* Returns a default description if text is empty
|
|
"""
|
|
@spec process_description(String.t(), String.t(), integer() | nil) :: String.t()
|
|
def process_description(description, locale \\ "en", limit \\ @slice_limit)
|
|
def process_description(nil, locale, limit), do: process_description("", locale, limit)
|
|
|
|
def process_description("", locale, _limit) do
|
|
default_description(locale)
|
|
end
|
|
|
|
def process_description(description, _locale, limit) do
|
|
description
|
|
|> HTMLFormatter.strip_tags_and_insert_spaces()
|
|
|> String.trim()
|
|
|> maybe_slice(limit)
|
|
end
|
|
|
|
@doc """
|
|
Returns the default description for a text
|
|
"""
|
|
@spec default_description(String.t()) :: String.t()
|
|
def default_description(locale \\ "en") do
|
|
Gettext.put_locale(locale)
|
|
gettext("The event organizer didn't add any description.")
|
|
end
|
|
|
|
defdelegate datetime_to_string(datetime, locale \\ "en", format \\ :medium), to: DateTime
|
|
defdelegate render_address!(address), to: Address
|
|
|
|
defp maybe_slice(description, nil), do: description
|
|
|
|
defp maybe_slice(description, limit) do
|
|
if String.length(description) > limit do
|
|
description
|
|
|> String.slice(0..limit)
|
|
|> String.trim()
|
|
|> (&"#{&1}…").()
|
|
else
|
|
description
|
|
end
|
|
end
|
|
|
|
@spec stringify_tag(Phoenix.HTML.safe(), String.t()) :: String.t()
|
|
defp stringify_tag(tag, acc) when is_tuple(tag), do: acc <> HTML.safe_to_string(tag)
|
|
|
|
@spec stringify_tag(String.t(), String.t()) :: String.t()
|
|
defp stringify_tag(tag, acc) when is_binary(tag), do: acc <> tag
|
|
|
|
@spec escape_text(String.t()) :: String.t()
|
|
def escape_text(text) do
|
|
text
|
|
|> HTML.html_escape()
|
|
|> HTML.safe_to_string()
|
|
end
|
|
end
|