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.

Commit26fd8ed

Browse files
author
mydearxym
committed
chore(editorjs): common markdown parse
1 parent9fb5ca5 commit26fd8ed

File tree

2 files changed

+359
-42
lines changed

2 files changed

+359
-42
lines changed

‎lib/helper/converter/md_to_editor.ex‎

Lines changed: 151 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,12 @@ defmodule Helper.Converter.MdToEditor do
2626
defpparse_block({type,_opt,content})
2727
whentypein@supported_headerdo
2828
content_text=
29-
Enum.reduce(content,[],fncontent_item,acc->
29+
Enum.reduce(content,"",fncontent_item,acc->
3030
parsed=parse_inline(type,content_item)
31-
acc++parsed
31+
acc<>parsed
3232
end)
3333

3434
# IO.inspect(content_text, label: "h-type content_text")
35-
3635
[_,level]=String.split(type,"h")
3736
level=String.to_integer(level)
3837

@@ -46,11 +45,28 @@ defmodule Helper.Converter.MdToEditor do
4645
end
4746

4847
# parse markdown paragraph to editor's paragraph
48+
# parse image
49+
defpparse_block({"p",_opt,[{"img",[{"src",src},_alt],[]}]})do
50+
%{
51+
type:"image",
52+
data:%{
53+
file:%{
54+
url:src
55+
},
56+
caption:"",
57+
withBorder:false,
58+
stretched:false,
59+
withBackground:false
60+
}
61+
}
62+
end
63+
4964
defpparse_block({"p",_opt,content})do
5065
content_text=
51-
Enum.reduce(content,[],fncontent_item,acc->
66+
Enum.reduce(content,"",fncontent_item,acc->
5267
parsed=parse_inline("p",content_item)
53-
acc++parsed
68+
69+
acc<>parsed
5470
end)
5571

5672
%{
@@ -61,33 +77,150 @@ defmodule Helper.Converter.MdToEditor do
6177
}
6278
end
6379

80+
defpparse_block({"ul",[],content})do
81+
caseis_checklist_ul?(content)do
82+
# normal ul list
83+
false->
84+
items=
85+
Enum.reduce(content,[],fncontent_item,acc->
86+
parsed=parse_inline(content_item)
87+
acc++[parsed]
88+
end)
89+
90+
%{
91+
type:"list",
92+
data:%{
93+
style:"unordered",
94+
items:items
95+
}
96+
}
97+
98+
# checklist
99+
true->
100+
items=
101+
Enum.reduce(content,[],fncontent_item,acc->
102+
parsed=parse_inline(content_item)
103+
104+
acc++
105+
[
106+
%{
107+
# 4 表示 [ ] 或 [x] 占用的 4 个 size
108+
"text"=>String.slice(parsed,4,byte_size(parsed)),
109+
"checked"=>String.starts_with?(parsed,["[x] ","[X] "])
110+
}
111+
]
112+
end)
113+
114+
%{
115+
type:"checklist",
116+
data:%{
117+
items:items
118+
}
119+
}
120+
end
121+
end
122+
123+
defpparse_block({"ol",[],content})do
124+
items=
125+
Enum.reduce(content,[],fncontent_item,acc->
126+
parsed=parse_inline(content_item)
127+
acc++[parsed]
128+
end)
129+
130+
%{
131+
type:"list",
132+
data:%{
133+
style:"ordered",
134+
items:items
135+
}
136+
}
137+
end
138+
139+
defpparse_block({"blockquote",_opt,content})do
140+
%{
141+
type:"quote",
142+
data:%{
143+
text:parse_inline(content)
144+
}
145+
}
146+
end
147+
148+
defpparse_block({"hr",_opt,_content})do
149+
%{
150+
type:"delimiter",
151+
data:{}
152+
}
153+
end
154+
64155
defpparse_block({_type,_opt,_content})do
65156
# IO.inspect(name, label: "parse block")
66157
# IO.inspect(content, label: "content")
67158
%{}
68159
end
69160

70161
# 字符串直接返回,作为 editor.js 中的 text/data/code 等字段
71-
defpparse_inline(content)whenis_binary(content)do
72-
content
162+
defpparse_inline(content)whenis_binary(content),do:content
163+
defpparse_inline([_type,content]),do:parse_inline(content)
164+
defpparse_inline([content])whenis_binary(content),do:parse_inline(content)
165+
166+
defpparse_inline({"strong",[],content})do
167+
"<b>#{parse_inline(content)}</b>"
73168
end
74169

75-
# TODO: editor.js 暂时不支持 del 标签,所以直接返回字符串内容即可
76-
defpparse_inline({"del",[],[content]})do
77-
content
170+
# NOTE: editor.js 暂时不支持 del 标签,所以直接返回字符串内容即可
171+
# TODO: del -> editor.s marker
172+
defpparse_inline({"del",[],[content]}),do:content
173+
# NOTE: earmark parse italic as em
174+
defpparse_inline({"em",[],[content]}),do:inline_res("em",content)
175+
defpparse_inline({"em",[],content}),do:inline_res("em",content)
176+
defpparse_inline([{"em",[],content}]),do:inline_res("em",content)
177+
178+
defpparse_inline({"li",[],content})whenis_list(content)do
179+
line=
180+
Enum.reduce(content,"",fncontent_item,acc->
181+
acc<>parse_inline(content_item)
182+
end)
183+
184+
line
78185
end
79186

80-
defpparse_inline(_type,content)whenis_binary(content)do
81-
content
187+
defpparse_inline({"li",[],content}),do:parse_inline(content)
188+
189+
defpparse_inline([{"p",[],content}])do
190+
line=
191+
Enum.reduce(content,"",fncontent_item,acc->
192+
acc<>parse_inline(content_item)
193+
end)
194+
195+
line
82196
end
83197

84-
defpparse_inline(type,{_type,_opt,[content]})
85-
whentypein@supported_headerdo
198+
defpparse_inline({"code",[{"class","inline"}],content}),do:inline_res("code",content)
199+
defpparse_inline([{"code",[{"class","inline"}],content}]),do:inline_res("code",content)
200+
201+
defpparse_inline({"a",[{"href",href}],[content]})do
202+
"<a href=\"#{href}\">#{content}</a>"
203+
end
204+
205+
defpinline_res("em",content),do:"<i>#{parse_inline(content)}</i>"
206+
207+
defpinline_res("code",content),
208+
do:"<code class=\"inline-code\">#{parse_inline(content)}</code>"
209+
210+
defpparse_inline(_type,content)whenis_binary(content),do:content
211+
212+
defpparse_inline(header,{_type,_opt,[content]})
213+
whenheaderin@supported_headerdo
86214
parse_inline(content)
87215
end
88216

89-
# defp parse_inline({type, _opt, content})
90-
# when type == "h1" or type == "h2" or type == "h3" do
91-
# content
92-
# end
217+
# when header in @supported_header do
218+
defpparse_inline("p",content),do:parse_inline(content)
219+
220+
# 判断是否为 editorjs 的 checklist
221+
defpis_checklist_ul?(content)whenis_list(content)do
222+
Enum.all?(content,fn{"li",[],li_item}->
223+
li_item|>Enum.at(0)|>String.starts_with?(["[ ] ","[x] ","[X] "])
224+
end)
225+
end
93226
end

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp