Skip to content
This repository was archived by the owner on Nov 8, 2022. It is now read-only.

Commit ba9ec83

Browse files
committed
refactor(cite-task): fmt
1 parent d5a0672 commit ba9ec83

File tree

1 file changed

+71
-70
lines changed

1 file changed

+71
-70
lines changed

lib/groupher_server/cms/delegates/cite_tasks.ex

+71-70
Original file line numberDiff line numberDiff line change
@@ -161,14 +161,14 @@ defmodule GroupherServer.CMS.Delegate.CiteTasks do
161161
defp parse_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-
defp do_parse_cited_info(content, block_id, links) do
171+
defp do_parse_cited_info_per_block(content, block_id, links) do
172172
Enum.reduce(links, [], fn link, acc ->
173173
case parse_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+
defp parse_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+
case is_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+
defp parse_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+
defp is_site_article_link?(url) do
224+
Enum.any?(@valid_article_prefix, &String.starts_with?(url, &1))
225+
end
226+
227+
defp is_comment_link?(url) do
228+
with %{query: query} <- URI.parse(url) do
229+
not is_nil(query) and String.starts_with?(query, "comment_id=")
230+
end
231+
end
232+
233+
defp load_cited_comment_from_url(url) do
234+
%{query: query} = URI.parse(url)
235+
236+
try do
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+
defp load_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
defp shape_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-
defp parse_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-
case is_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-
defp parse_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-
defp is_site_article_link?(url) do
297-
Enum.any?(@valid_article_prefix, &String.starts_with?(url, &1))
298-
end
299-
300-
defp is_comment_link?(url) do
301-
with %{query: query} <- URI.parse(url) do
302-
not is_nil(query) and String.starts_with?(query, "comment_id=")
303-
end
304-
end
305-
306-
defp load_cited_comment_from_url(url) do
307-
%{query: query} = URI.parse(url)
308-
309-
try do
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-
defp load_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
defp result({:ok, %{update_cited_info: result}}), do: {:ok, result}
335336

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

0 commit comments

Comments
 (0)