/
meeseeks.ex
66 lines (56 loc) · 1.32 KB
/
meeseeks.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
defmodule Premailex.HTMLParser.Meeseeks do
@moduledoc false
require Logger
alias Premailex.HTMLParser
alias Meeseeks.{Document, Selector.CSS}
@behaviour HTMLParser
@impl true
@doc false
def parse(html) do
html
|> Meeseeks.parse()
|> Meeseeks.tree()
|> case do
[html] -> html
html -> html
end
end
@impl true
@doc false
def all(tree, selector) do
selector = CSS.compile_selectors(selector)
tree
|> Meeseeks.parse(:tuple_tree)
|> Meeseeks.all(selector)
|> Enum.map(&Meeseeks.tree/1)
rescue
e in Meeseeks.Error ->
Logger.warning("Meeseeks error: " <> inspect(e))
[]
end
@impl true
@doc false
def to_string(tree) do
tree
|> Meeseeks.parse(:tuple_tree)
|> Meeseeks.html()
end
@impl true
@doc false
def text(text) when is_binary(text), do: text
def text(list) when is_list(list), do: Enum.map_join(list, "", &text/1)
def text({:comment, _text}), do: ""
def text({_element, _attrs, children}), do: text(children)
@impl true
@doc false
def filter(tree, selector) do
selector = CSS.compile_selectors(selector)
tree = Meeseeks.parse(tree, :tuple_tree)
tree
|> Meeseeks.all(selector)
|> Enum.reduce(tree, fn e, acc ->
Document.delete_node(acc, e.id)
end)
|> Meeseeks.tree()
end
end