Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Nov 8, 2022. It is now read-only.

Commitde6abab

Browse files
committed
refactor(editor): re-org code with frags concept
make it easy to test
1 parent02a934f commitde6abab

File tree

15 files changed

+315
-245
lines changed

15 files changed

+315
-245
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
defmoduleHelper.Converter.EditorToHTML.Frags.Headerdo
2+
@moduledoc"""
3+
parse editor.js's block fragments, use for test too
4+
5+
see https://editorjs.io/
6+
"""
7+
aliasHelper.Metric
8+
aliasHelper.Types,as:T
9+
10+
@classget_in(Metric.Article.class_names(:html),["header"])
11+
12+
@specget(T.editor_header())::T.html()
13+
defget(%{"eyebrowTitle"=>eyebrow_title,"footerTitle"=>footer_title}=data)do
14+
%{"text"=>text,"level"=>level}=data
15+
16+
wrapper_class=@class["wrapper"]
17+
eyebrow_class=@class["eyebrow_title"]
18+
footer_class=@class["footer_title"]
19+
20+
~s(<div class="#{wrapper_class}">
21+
<div class="#{eyebrow_class}">#{eyebrow_title}</div>
22+
<h#{level}>#{text}</h#{level}>
23+
<div class="#{footer_class}">#{footer_title}</div>
24+
</div>)
25+
end
26+
27+
defget(%{"eyebrowTitle"=>eyebrow_title}=data)do
28+
%{"text"=>text,"level"=>level}=data
29+
30+
wrapper_class=@class["wrapper"]
31+
eyebrow_class=@class["eyebrow_title"]
32+
33+
~s(<div class="#{wrapper_class}">
34+
<div class="#{eyebrow_class}">#{eyebrow_title}</div>
35+
<h#{level}>#{text}</h#{level}>
36+
</div>)
37+
end
38+
39+
defget(%{"footerTitle"=>footer_title}=data)do
40+
%{"text"=>text,"level"=>level}=data
41+
42+
wrapper_class=@class["wrapper"]
43+
footer_class=@class["footer_title"]
44+
45+
~s(<div class="#{wrapper_class}">
46+
<h#{level}>#{text}</h#{level}>
47+
<div class="#{footer_class}">#{footer_title}</div>
48+
</div>)
49+
end
50+
51+
defget(%{"text"=>text,"level"=>level})do
52+
"<h#{level}>#{text}</h#{level}>"
53+
end
54+
end
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
defmoduleHelper.Converter.EditorToHTML.Frags.Listdo
2+
@moduledoc"""
3+
parse editor.js's block fragments, use for test too
4+
5+
see https://editorjs.io/
6+
"""
7+
aliasHelper.Metric
8+
9+
@classget_in(Metric.Article.class_names(:html),["list"])
10+
11+
defget_item(:checklist,%{
12+
"checked"=>checked,
13+
"hideLabel"=>hide_label,
14+
"indent"=>indent,
15+
"label"=>label,
16+
"labelType"=>label_type,
17+
"text"=>text
18+
})do
19+
# local fragments
20+
checkbox_frag=frag(:checkbox,checked)
21+
label_frag=ifhide_label,do:"",else:frag(:label,label_type,indent,label)
22+
text_frag=frag(:checkbox,:text,text)
23+
24+
item_class=@class["checklist_item"]
25+
26+
~s(<div class="#{item_class}">
27+
#{checkbox_frag}
28+
#{label_frag}
29+
#{text_frag}
30+
</div>)
31+
end
32+
33+
deffrag(:label,label_type,indent,label)do
34+
label_class=@class["label"]
35+
label_type_class=@class["label__#{label_type}"]
36+
37+
~s(<div class="#{label_class}#{label_type_class}" data-index="#{indent}">
38+
#{label}
39+
</div>)
40+
end
41+
42+
@specfrag(:checkbox,Boolean.t())::String.t()
43+
deffrag(:checkbox,_checked)do
44+
checked_svg=svg(:checked)
45+
46+
~s(<div class="checklist__item-checkbox checklist__item-check-sign-active">
47+
<div class="checklist__item-check-sign">
48+
#{checked_svg}
49+
</div>
50+
</div>)
51+
end
52+
53+
deffrag(:text,text)do
54+
text_class=@class["text"]
55+
56+
~s(<div class="#{text_class}">
57+
#{text}
58+
</div>)
59+
end
60+
61+
deffrag(:checkbox,:text,text)do
62+
text_class=@class["checklist_text"]
63+
64+
~s(<div class="#{text_class}">
65+
#{text}
66+
</div>)
67+
end
68+
69+
defpsvg(type)do
70+
# workarround for https://github.com/rrrene/html_sanitize_ex/issues/48
71+
svg_frag(type)|>String.replace(" viewBox=\""," viewbox=\"")
72+
end
73+
74+
defpsvg_frag(:checked)do
75+
~s(<svg t="1592049095081" width="20px" height="20px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9783"><path d="M853.333333 256L384 725.333333l-213.333333-213.333333" p-id="9784"></path></svg>)
76+
end
77+
end

‎lib/helper/converter/editor_to_html/header.ex‎

Lines changed: 4 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -10,70 +10,12 @@ defmodule Helper.Converter.EditorToHTML.Header do
1010
defmacro__using__(_opts)do
1111
quotedo
1212
aliasHelper.Metric
13+
aliasHelper.Converter.EditorToHTML.Frags
1314

14-
@clazzMetric.Article.class_names(:html)
15+
@classget_in(Metric.Article.class_names(:html),["header"])
1516

16-
defpparse_block(%{
17-
"type"=>"header",
18-
"data"=>
19-
%{
20-
"text"=>text,
21-
"level"=>level,
22-
"eyebrowTitle"=>eyebrow_title,
23-
"footerTitle"=>footer_title
24-
}=data
25-
})do
26-
"""
27-
<div class="#{@clazz.header.wrapper}">
28-
<div class="#{@clazz.header.eyebrow_title}">#{eyebrow_title}</div>
29-
<h#{level}>#{text}</h#{level}>
30-
<div class="#{@clazz.header.footer_title}">#{footer_title}</div>
31-
</div>
32-
"""
33-
end
34-
35-
defpparse_block(%{
36-
"type"=>"header",
37-
"data"=>
38-
%{
39-
"text"=>text,
40-
"level"=>level,
41-
"eyebrowTitle"=>eyebrow_title
42-
}=data
43-
})do
44-
"""
45-
<div class="#{@clazz.header.wrapper}">
46-
<div class="#{@clazz.header.eyebrow_title}">#{eyebrow_title}</div>
47-
<h#{level}>#{text}</h#{level}>
48-
</div>
49-
"""
50-
end
51-
52-
defpparse_block(%{
53-
"type"=>"header",
54-
"data"=>
55-
%{
56-
"text"=>text,
57-
"level"=>level,
58-
"footerTitle"=>footer_title
59-
}=data
60-
})do
61-
"""
62-
<div class="#{@clazz.header.wrapper}">
63-
<h#{level}>#{text}</h#{level}>
64-
<div class="#{@clazz.header.footer_title}">#{footer_title}</div>
65-
</div>
66-
"""
67-
end
68-
69-
defpparse_block(%{
70-
"type"=>"header",
71-
"data"=>%{
72-
"text"=>text,
73-
"level"=>level
74-
}
75-
})do
76-
"<h#{level}>#{text}</h#{level}>"
17+
defpparse_block(%{"type"=>"header","data"=>data})do
18+
Frags.Header.get(data)
7719
end
7820
end
7921
end

‎lib/helper/converter/editor_to_html/index.ex‎

Lines changed: 30 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,15 @@ defmodule Helper.Converter.EditorToHTML do
1212
see https://editorjs.io/
1313
"""
1414

15-
useHelper.Converter.EditorToHTML.Header
16-
useHelper.Converter.EditorToHTML.Paragraph
17-
useHelper.Converter.EditorToHTML.List
15+
useHelper.Converter.EditorToHTML.{Header,Paragraph,List}
1816

19-
aliasHelper.Converter.EditorToHTML.Validator
20-
aliasHelper.Converter.{EditorToHTML,HtmlSanitizer}
2117
aliasHelper.{Metric,Utils}
18+
aliasHelper.Converter.{EditorToHTML,HtmlSanitizer}
19+
aliasEditorToHTML.Validator
2220

23-
aliasEditorToHTML.Assets.{DelimiterIcons}
21+
#alias EditorToHTML.Assets.{DelimiterIcons}
2422

25-
@clazzMetric.Article.class_names(:html)
23+
@root_classMetric.Article.class_names(:html)
2624

2725
@specto_html(binary|maybe_improper_list)::false|{:ok,<<_::64,_::_*8>>}
2826
defto_html(string)whenis_binary(string)do
@@ -34,7 +32,8 @@ defmodule Helper.Converter.EditorToHTML do
3432
acc<>clean_html
3533
end)
3634

37-
{:ok,"<div class=\"#{@clazz.viewer}\">#{content}<div>"}
35+
viewer_class=@root_class["viewer"]
36+
{:ok,~s(<div class="#{viewer_class}">#{content}</div>)}
3837
end
3938
end
4039

@@ -46,77 +45,39 @@ defmodule Helper.Converter.EditorToHTML do
4645
acc<>clean_html
4746
end)
4847

49-
{:ok,"<div class=\"#{@clazz.viewer}\">#{content}<div>"}
50-
end
51-
52-
defpparse_block(%{"type"=>"image","data"=>data})do
53-
url=get_in(data,["file","url"])
54-
55-
"<div class=\"#{@clazz.viewer}-image\"><img src=\"#{url}\"></div>"
56-
# |> IO.inspect(label: "iamge ret")
57-
end
58-
59-
defpparse_block(%{"type"=>"list","data"=>%{"style"=>"unordered","items"=>items}})do
60-
content=
61-
Enum.reduce(items,"",fnitem,acc->
62-
acc<>"<li>#{item}</li>"
63-
end)
64-
65-
"<ul>#{content}</ul>"
66-
end
67-
68-
defpparse_block(%{"type"=>"list","data"=>%{"style"=>"ordered","items"=>items}})do
69-
content=
70-
Enum.reduce(items,"",fnitem,acc->
71-
acc<>"<li>#{item}</li>"
72-
end)
73-
74-
"<ol>#{content}</ol>"
48+
viewer_class=@root_class["viewer"]
49+
{:ok,~s(<div class="#{viewer_class}">#{content}</div>)}
7550
end
7651

77-
# TODO: add item class
78-
defpparse_block(%{"type"=>"checklist","data"=>%{"items"=>items}})do
79-
content=
80-
Enum.reduce(items,"",fnitem,acc->
81-
text=Map.get(item,"text")
82-
checked=Map.get(item,"checked")
83-
84-
casecheckeddo
85-
true->
86-
acc<>"<div><input type=\"checkbox\" checked />#{text}</div>"
87-
88-
false->
89-
acc<>"<div><input type=\"checkbox\" />#{text}</div>"
90-
end
91-
end)
52+
# defp parse_block(%{"type" => "image", "data" => data}) do
53+
# url = get_in(data, ["file", "url"])
9254

93-
"<div class=\"#{@clazz.viewer}-checklist\">#{content}</div>"
94-
# |> IO.inspect(label: "jjj")
95-
end
55+
# "<div class=\"#{@.viewer}-image\"><img src=\"#{url}\"></div>"
56+
# end
9657

97-
defpparse_block(%{"type"=>"delimiter","data"=>%{"type"=>type}})do
98-
svg_icon=DelimiterIcons.svg(type)
58+
#defp parse_block(%{"type" => "delimiter", "data" => %{"type" => type}}) do
59+
# svg_icon = DelimiterIcons.svg(type)
9960

100-
# TODO: left-wing, righ-wing staff
101-
{:skip_sanitize,"<div class=\"#{@clazz.viewer}-delimiter\">#{svg_icon}</div>"}
102-
end
61+
# # TODO: left-wing, righ-wing staff
62+
#{:skip_sanitize, "<div class=\"#{@.viewer}-delimiter\">#{svg_icon}</div>"}
63+
#end
10364

10465
# IO.inspect(data, label: "parse linkTool")
10566
# TODO: parse the link-card info
106-
defpparse_block(%{"type"=>"linkTool","data"=>data})do
107-
link=get_in(data,["link"])
67+
#defp parse_block(%{"type" => "linkTool", "data" => data}) do
68+
# link = get_in(data, ["link"])
10869

109-
"<div class=\"#{@clazz.viewer}-linker\"><a href=\"#{link}\" target=\"_blank\">#{link}</a></div>"
110-
# |> IO.inspect(label: "linkTool ret")
111-
end
70+
#"<div class=\"#{@.viewer}-linker\"><a href=\"#{link}\" target=\"_blank\">#{link}</a></div>"
71+
# # |> IO.inspect(label: "linkTool ret")
72+
#end
11273

11374
# IO.inspect(data, label: "parse quote")
114-
defpparse_block(%{"type"=>"quote","data"=>data})do
115-
text=get_in(data,["text"])
75+
#defp parse_block(%{"type" => "quote", "data" => data}) do
76+
# text = get_in(data, ["text"])
11677

117-
"<div class=\"#{@clazz.viewer}-quote\">#{text}</div>"
118-
# |> IO.inspect(label: "quote ret")
119-
end
78+
#"<div class=\"#{@.viewer}-quote\">#{text}</div>"
79+
# # |> IO.inspect(label: "quote ret")
80+
#end
12081

12182
defpparse_block(%{"type"=>"code","data"=>data})do
12283
text=get_in(data,["text"])
@@ -128,7 +89,8 @@ defmodule Helper.Converter.EditorToHTML do
12889
end
12990

13091
defpparse_block(_block)do
131-
"<div class=\"#{@clazz.unknow_block}\">[unknow block]</div>"
92+
undown_block_class=@root_class["unknow_block"]
93+
~s("<div class="#{undown_block_class}">[unknow block]</div>")
13294
end
13395

13496
defstring_to_json(string),do:Jason.decode(string)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp