1
- defmodule Helper.Converter.EditorToHtml do
1
+ # defmodule Helper.Converter.EditorToHTML.Parser do
2
+ # @moduledoc false
3
+
4
+ # # TODO: map should be editor_block
5
+ # @callback parse_block(editor_json :: Map.t()) :: String.t()
6
+ # end
7
+
8
+ defmodule Helper.Converter.EditorToHTML do
2
9
@ moduledoc """
3
10
parse editor.js's json data to raw html and sanitize it
4
11
5
12
see https://editorjs.io/
6
13
"""
7
- alias Helper.Converter.HtmlSanitizer
8
- alias Helper.Converter.EditorToHtml.Assets
9
- alias Helper.Utils
10
14
11
- alias Assets . { DelimiterIcons }
15
+ use Helper.Converter.EditorToHTML.Header
16
+ use Helper.Converter.EditorToHTML.Paragraph
17
+ use Helper.Converter.EditorToHTML.List
18
+
19
+ alias Helper.Converter.EditorToHTML.Validator
20
+ alias Helper.Converter . { EditorToHTML , HtmlSanitizer }
21
+ alias Helper . { Metric , Utils }
22
+
23
+ alias EditorToHTML.Assets . { DelimiterIcons }
12
24
13
- @ html_class_prefix "cps-viewer"
25
+ @ clazz Metric.Article . class_names ( :html )
14
26
15
27
@ spec to_html ( binary | maybe_improper_list ) :: false | { :ok , << _ :: 64 , _ :: _ * 8 >> }
16
28
def to_html ( string ) when is_binary ( string ) do
17
29
with { :ok , parsed } = string_to_json ( string ) ,
18
- true <- valid_editor_data? ( parsed ) do
30
+ { :ok , _ } <- Validator . is_valid ( parsed ) do
19
31
content =
20
32
Enum . reduce ( parsed [ "blocks" ] , "" , fn block , acc ->
21
33
clean_html = block |> parse_block |> HtmlSanitizer . sanitize ( )
22
34
acc <> clean_html
23
35
end )
24
36
25
- { :ok , "<div class=\" #{ @ html_class_prefix } \" >#{ content } <div>" }
37
+ { :ok , "<div class=\" #{ @ clazz . viewer } \" >#{ content } <div>" }
26
38
end
27
39
end
28
40
41
+ @ doc "used for markdown ast to editor"
29
42
def to_html ( editor_blocks ) when is_list ( editor_blocks ) do
30
43
content =
31
44
Enum . reduce ( editor_blocks , "" , fn block , acc ->
32
45
clean_html = block |> Utils . keys_to_strings ( ) |> parse_block |> HtmlSanitizer . sanitize ( )
33
46
acc <> clean_html
34
47
end )
35
48
36
- { :ok , "<div class=\" #{ @ html_class_prefix } \" >#{ content } <div>" }
37
- end
38
-
39
- # IO.inspect(data, label: "parse header")
40
- defp parse_block ( % { "type" => "header" , "data" => data } ) do
41
- text = get_in ( data , [ "text" ] )
42
- level = get_in ( data , [ "level" ] )
43
-
44
- "<h#{ level } class=\" #{ @ html_class_prefix } -header\" >#{ text } </h#{ level } >"
49
+ { :ok , "<div class=\" #{ @ clazz . viewer } \" >#{ content } <div>" }
45
50
end
46
51
47
- # IO.inspect(data, label: "parse paragraph")
48
- defp parse_block ( % { "type" => "paragraph" , "data" => data } ) do
49
- text = get_in ( data , [ "text" ] )
50
-
51
- "<p class=\" #{ @ html_class_prefix } -paragraph\" >#{ text } </p>"
52
- end
53
-
54
- # IO.inspect(data, label: "parse image")
55
52
defp parse_block ( % { "type" => "image" , "data" => data } ) do
56
53
url = get_in ( data , [ "file" , "url" ] )
57
54
58
- "<div class=\" #{ @ html_class_prefix } -image\" ><img src=\" #{ url } \" ></div>"
55
+ "<div class=\" #{ @ clazz . viewer } -image\" ><img src=\" #{ url } \" ></div>"
59
56
# |> IO.inspect(label: "iamge ret")
60
57
end
61
58
@@ -77,7 +74,6 @@ defmodule Helper.Converter.EditorToHtml do
77
74
"<ol>#{ content } </ol>"
78
75
end
79
76
80
- # IO.inspect(items, label: "checklist items")
81
77
# TODO: add item class
82
78
defp parse_block ( % { "type" => "checklist" , "data" => % { "items" => items } } ) do
83
79
content =
@@ -94,31 +90,31 @@ defmodule Helper.Converter.EditorToHtml do
94
90
end
95
91
end )
96
92
97
- "<div class=\" #{ @ html_class_prefix } -checklist\" >#{ content } </div>"
93
+ "<div class=\" #{ @ clazz . viewer } -checklist\" >#{ content } </div>"
98
94
# |> IO.inspect(label: "jjj")
99
95
end
100
96
101
97
defp parse_block ( % { "type" => "delimiter" , "data" => % { "type" => type } } ) do
102
98
svg_icon = DelimiterIcons . svg ( type )
103
99
104
100
# TODO: left-wing, righ-wing staff
105
- { :skip_sanitize , "<div class=\" #{ @ html_class_prefix } -delimiter\" >#{ svg_icon } </div>" }
101
+ { :skip_sanitize , "<div class=\" #{ @ clazz . viewer } -delimiter\" >#{ svg_icon } </div>" }
106
102
end
107
103
108
104
# IO.inspect(data, label: "parse linkTool")
109
105
# TODO: parse the link-card info
110
106
defp parse_block ( % { "type" => "linkTool" , "data" => data } ) do
111
107
link = get_in ( data , [ "link" ] )
112
108
113
- "<div class=\" #{ @ html_class_prefix } -linker\" ><a href=\" #{ link } \" target=\" _blank\" >#{ link } </a></div>"
109
+ "<div class=\" #{ @ clazz . viewer } -linker\" ><a href=\" #{ link } \" target=\" _blank\" >#{ link } </a></div>"
114
110
# |> IO.inspect(label: "linkTool ret")
115
111
end
116
112
117
113
# IO.inspect(data, label: "parse quote")
118
114
defp parse_block ( % { "type" => "quote" , "data" => data } ) do
119
115
text = get_in ( data , [ "text" ] )
120
116
121
- "<div class=\" #{ @ html_class_prefix } -quote\" >#{ text } </div>"
117
+ "<div class=\" #{ @ clazz . viewer } -quote\" >#{ text } </div>"
122
118
# |> IO.inspect(label: "quote ret")
123
119
end
124
120
@@ -132,18 +128,8 @@ defmodule Helper.Converter.EditorToHtml do
132
128
end
133
129
134
130
defp parse_block ( _block ) do
135
- # IO.puts("[unknow block]")
136
- "[unknow block]"
131
+ "<div class=\" #{ @ clazz . unknow_block } \" >[unknow block]</div>"
137
132
end
138
133
139
134
def string_to_json ( string ) , do: Jason . decode ( string )
140
-
141
- defp valid_editor_data? ( map ) when is_map ( map ) do
142
- Map . has_key? ( map , "time" ) and
143
- Map . has_key? ( map , "version" ) and
144
- Map . has_key? ( map , "blocks" ) and
145
- is_list ( map [ "blocks" ] ) and
146
- is_binary ( map [ "version" ] ) and
147
- is_integer ( map [ "time" ] )
148
- end
149
135
end
0 commit comments