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.

Commitba9ec83

Browse files
committed
refactor(cite-task): fmt
1 parentd5a0672 commitba9ec83

File tree

1 file changed

+71
-70
lines changed

1 file changed

+71
-70
lines changed

‎lib/groupher_server/cms/delegates/cite_tasks.ex‎

Lines changed: 71 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -161,14 +161,14 @@ defmodule GroupherServer.CMS.Delegate.CiteTasks do
161161
defpparse_cited_info_per_block(content,%{"id"=>block_id,"data"=>%{"text"=>text}})do
162162
links=Floki.find(text,"a[href]")
163163

164-
do_parse_cited_info(content,block_id,links)
164+
do_parse_cited_info_per_block(content,block_id,links)
165165
end
166166

167167
# links Floki parsed fmt
168168
# content means both article and comment
169169
# e.g:
170170
# [{"a", [{"href", "https://coderplanets.com/post/195675"}], []},]
171-
defpdo_parse_cited_info(content,block_id,links)do
171+
defpdo_parse_cited_info_per_block(content,block_id,links)do
172172
Enum.reduce(links,[],fnlink,acc->
173173
caseparse_valid_cited(content.id,link)do
174174
{:ok,cited}->List.insert_at(acc,0,shape_cited(content,cited,block_id))
@@ -189,6 +189,75 @@ defmodule GroupherServer.CMS.Delegate.CiteTasks do
189189
end
190190
end
191191

192+
# return fmt: %{type: :comment | :article, content: %Comment{} | Article}
193+
# 要考虑是否有 comment_id 的情况,如果有,那么 就应该 load comment 而不是 article
194+
defpparse_cited({"a",attrs,_})do
195+
with{:ok,link}<-parse_link(attrs),
196+
true<-is_site_article_link?(link)do
197+
# IO.inspect(link, label: "parse link")
198+
# IO.inspect(is_comment_link?(link), label: "is_comment_link")
199+
200+
caseis_comment_link?(link)do
201+
true->load_cited_comment_from_url(link)
202+
false->load_cited_article_from_url(link)
203+
end
204+
end
205+
end
206+
207+
@doc"""
208+
parse link from Floki parse result
209+
210+
e.g:
211+
[{"href", "https://coderplanets.com/post/190220", "bla", "bla"}] ->
212+
{:ok, "https://coderplanets.com/post/190220"}
213+
"""
214+
defpparse_link(attrs)do
215+
with{"href",link}<-Enum.find(attrs,fn{a,_v}->a=="href"end)do
216+
{:ok,link}
217+
else
218+
_->{:error,"invalid fmt"}
219+
end
220+
end
221+
222+
# 检测是否是站内文章的链接
223+
defpis_site_article_link?(url)do
224+
Enum.any?(@valid_article_prefix,&String.starts_with?(url,&1))
225+
end
226+
227+
defpis_comment_link?(url)do
228+
with%{query:query}<-URI.parse(url)do
229+
notis_nil(query)andString.starts_with?(query,"comment_id=")
230+
end
231+
end
232+
233+
defpload_cited_comment_from_url(url)do
234+
%{query:query}=URI.parse(url)
235+
236+
trydo
237+
comment_id=URI.decode_query(query)|>Map.get("comment_id")
238+
239+
with{:ok,comment}<-ORM.find(Comment,comment_id)do
240+
{:ok,%{type::comment,content:comment}}
241+
end
242+
rescue
243+
_->{:error,"load comment error"}
244+
end
245+
end
246+
247+
# get cited article from url
248+
# e.g: https://coderplanets.com/post/189993 -> ORM.find(Post, 189993)
249+
defpload_cited_article_from_url(url)do
250+
%{path:path}=URI.parse(url)
251+
path_list=path|>String.split("/")
252+
thread=path_list|>Enum.at(1)|>String.downcase()|>String.to_atom()
253+
article_id=path_list|>Enum.at(2)
254+
255+
with{:ok,info}<-match(thread),
256+
{:ok,article}<-ORM.find(info.model,article_id)do
257+
{:ok,%{type::article,content:article}}
258+
end
259+
end
260+
192261
# cite article in comment
193262
# 在评论中引用文章
194263
defpshape_cited(%Comment{}=comment,%{type::article,content:cited},block_id)do
@@ -263,74 +332,6 @@ defmodule GroupherServer.CMS.Delegate.CiteTasks do
263332
|>Map.put(info.foreign_key,article.id)
264333
end
265334

266-
# 要考虑是否有 comment_id 的情况,如果有,那么 就应该 load comment 而不是 article
267-
defpparse_cited({"a",attrs,_})do
268-
with{:ok,link}<-parse_link(attrs),
269-
true<-is_site_article_link?(link)do
270-
# IO.inspect(link, label: "parse link")
271-
# IO.inspect(is_comment_link?(link), label: "is_comment_link")
272-
273-
caseis_comment_link?(link)do
274-
true->load_cited_comment_from_url(link)
275-
false->load_cited_article_from_url(link)
276-
end
277-
end
278-
end
279-
280-
@doc"""
281-
parse link from Floki parse result
282-
283-
e.g:
284-
[{"href", "https://coderplanets.com/post/190220", "bla", "bla"}] ->
285-
{:ok, "https://coderplanets.com/post/190220"}
286-
"""
287-
defpparse_link(attrs)do
288-
with{"href",link}<-Enum.find(attrs,fn{a,_v}->a=="href"end)do
289-
{:ok,link}
290-
else
291-
_->{:error,"invalid fmt"}
292-
end
293-
end
294-
295-
# 检测是否是站内文章的链接
296-
defpis_site_article_link?(url)do
297-
Enum.any?(@valid_article_prefix,&String.starts_with?(url,&1))
298-
end
299-
300-
defpis_comment_link?(url)do
301-
with%{query:query}<-URI.parse(url)do
302-
notis_nil(query)andString.starts_with?(query,"comment_id=")
303-
end
304-
end
305-
306-
defpload_cited_comment_from_url(url)do
307-
%{query:query}=URI.parse(url)
308-
309-
trydo
310-
comment_id=URI.decode_query(query)|>Map.get("comment_id")
311-
312-
with{:ok,comment}<-ORM.find(Comment,comment_id)do
313-
{:ok,%{type::comment,content:comment}}
314-
end
315-
rescue
316-
_->{:error,"load comment error"}
317-
end
318-
end
319-
320-
# get cited article from url
321-
# e.g: https://coderplanets.com/post/189993 -> ORM.find(Post, 189993)
322-
defpload_cited_article_from_url(url)do
323-
%{path:path}=URI.parse(url)
324-
path_list=path|>String.split("/")
325-
thread=path_list|>Enum.at(1)|>String.downcase()|>String.to_atom()
326-
article_id=path_list|>Enum.at(2)
327-
328-
with{:ok,info}<-match(thread),
329-
{:ok,article}<-ORM.find(info.model,article_id)do
330-
{:ok,%{type::article,content:article}}
331-
end
332-
end
333-
334335
defpresult({:ok,%{update_cited_info:result}}),do:{:ok,result}
335336

336337
defpresult({:error,:update_cited_info,_result,_steps})do

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp