defmodule Gulib.String.PlainFormat do @moduledoc """ 纯文本格式的正文的转换 """ alias Gulib.HtmlSanitize @doc """ 转成html ## opts ``` * sanitize true/false 是否过滤标签 * wrapper_tag: :p or :br 默认:p ``` """ def to_html(text, opts \\ []) do wrapper_tag = opts |> Keyword.get(:wrapper_tag, :p) |> Gulib.to_atom sanitize = opts |> Keyword.get(:sanitize, false) text = if sanitize, do: HtmlSanitize.strip_tags(text), else: text text = Gulib.to_s(text) paragraphs = split_paragraphs(text) if Gulib.blank?(paragraphs) do case wrapper_tag do :br -> "

" _ -> "<#{wrapper_tag}>" end else new_paragraphs = paragraphs |> Enum.map(fn(paragraph) -> Enum.map(paragraph, fn(p) -> "#{Gulib.html_escape(p)}" end) |> Enum.filter(fn(p) -> Gulib.present?(p) end) |> Enum.join("
") end) |> Enum.filter(fn(paragraph) -> Gulib.present?(paragraph) end) case wrapper_tag do :br -> new_paragraphs |> Enum.join("
") _ -> new_paragraphs |> Enum.map(fn(paragraph) -> "<#{wrapper_tag}>#{paragraph}" end) |> Enum.join("") end end end def split_paragraphs(text) do if Gulib.blank?(text) do text else text |> String.replace(~r/\r\n?/, "\n") # 将\r\n 换成一个\n |> String.split(~r/\n\n+/) # 多个换行换成一个换行 |> Enum.map(fn(t) -> String.split(t, ~r/\n/) end) end end end