Current section
Files
Jump to
Current section
Files
lib/core/string/plain_format.ex
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 -> "<p></p>"
_ -> "<#{wrapper_tag}></#{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("<br />")
end)
|> Enum.filter(fn(paragraph) -> Gulib.present?(paragraph) end)
case wrapper_tag do
:br -> new_paragraphs |> Enum.join("<br />")
_ ->
new_paragraphs
|> Enum.map(fn(paragraph) ->
"<#{wrapper_tag}>#{paragraph}</#{wrapper_tag}>"
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