- @tag_regex ~r/\#\w+/u
- def parse_tags(text, data \\ %{}) do
- Regex.scan(@tag_regex, text)
- |> Enum.map(fn ["#" <> tag = full_tag] -> {full_tag, String.downcase(tag)} end)
- |> (fn map ->
- if data["sensitive"] in [true, "True", "true", "1"],
- do: [{"#nsfw", "nsfw"}] ++ map,
- else: map
- end).()
+ @markdown_characters_regex ~r/(`|\*|_|{|}|[|]|\(|\)|#|\+|-|\.|!)/
+ @link_regex ~r{((?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~%:/?#[\]@!\$&'\(\)\*\+,;=.]+)|[0-9a-z+\-\.]+:[0-9a-z$-_.+!*'(),]+}ui
+ # credo:disable-for-previous-line Credo.Check.Readability.MaxLineLength
+
+ @auto_linker_config hashtag: true,
+ hashtag_handler: &Pleroma.Formatter.hashtag_handler/4,
+ mention: true,
+ mention_handler: &Pleroma.Formatter.mention_handler/4
+
+ def mention_handler("@" <> nickname, buffer, opts, acc) do
+ case User.get_cached_by_nickname(nickname) do
+ %User{id: id} = user ->
+ ap_id = get_ap_id(user)
+ nickname_text = get_nickname_text(nickname, opts) |> maybe_escape(opts)
+
+ link =
+ "<span class='h-card'><a data-user='#{id}' class='u-url mention' href='#{ap_id}'>@<span>#{
+ nickname_text
+ }</span></a></span>"
+
+ {link, %{acc | mentions: MapSet.put(acc.mentions, {"@" <> nickname, user})}}
+
+ _ ->
+ {buffer, acc}
+ end