From ce87f3623aa3c1717a1f55a5b71c18467597b402 Mon Sep 17 00:00:00 2001 From: Ryan Pandya Date: Mon, 19 Sep 2022 00:18:57 +0530 Subject: [PATCH] All the things I wanted to work, work. --- logsrv/apps/logsrv_api/lib/logsrv_api.ex | 24 ++++++++++++++-- logsrv/apps/logsrv_api/lib/logsrv_api/link.ex | 14 +++++++--- .../logsrv_web/controllers/post_controller.ex | 4 +-- .../templates/layout/root.html.heex | 4 +-- .../logsrv_web/templates/post/post.html.heex | 17 ++++++++--- .../lib/logsrv_web/views/post_view.ex | 28 ++++++++++++++++++- 6 files changed, 76 insertions(+), 15 deletions(-) diff --git a/logsrv/apps/logsrv_api/lib/logsrv_api.ex b/logsrv/apps/logsrv_api/lib/logsrv_api.ex index 5a32204..0698f77 100644 --- a/logsrv/apps/logsrv_api/lib/logsrv_api.ex +++ b/logsrv/apps/logsrv_api/lib/logsrv_api.ex @@ -90,7 +90,7 @@ defmodule LogsrvApi do end def forward_links(post) do - post.markdown + to_post = post.markdown |> String.split(~r/[\[\]]/, trim: true) |> Enum.map(&( if(String.match?(post.markdown, Regex.compile!("\\[\\[" <> &1 <> "\\]\\]"))) do @@ -105,10 +105,30 @@ defmodule LogsrvApi do end ) |> Enum.map(fn(str) -> {title, true} = str - case title |> to_slug |> @repo.get_by_slug do + to_link = case title |> to_slug |> @repo.get_by_slug do {:ok, page} -> page {:no_such_page, slug} -> %{LogsrvApi.Page.empty | slug: slug, public: post.public, title: slug |> to_title} end + + context = post.markdown |> String.split("\n") |> Enum.find(&(&1 |> String.contains?(title))) + + {to_link, context} + + end) + end + + def forward_pages(post) do + post |> forward_links + |> Enum.map(fn(tuple) -> + {to_link, context} = tuple + to_link.slug + end) + end + def forward_contexts(post) do + post |> forward_links + |> Enum.map(fn(tuple) -> + {to_link, context} = tuple + context end) end diff --git a/logsrv/apps/logsrv_api/lib/logsrv_api/link.ex b/logsrv/apps/logsrv_api/lib/logsrv_api/link.ex index 557a973..958d02d 100644 --- a/logsrv/apps/logsrv_api/lib/logsrv_api/link.ex +++ b/logsrv/apps/logsrv_api/lib/logsrv_api/link.ex @@ -2,7 +2,7 @@ defmodule LogsrvApi.Link do use GenServer alias LogsrvApi.{Filesystem,Page,Journal,Link} - defstruct from: nil, to: nil + defstruct from: nil, to: nil, context: "" def start_link(_opts) do GenServer.start_link(__MODULE__, :ok, [name: __MODULE__]) @@ -14,7 +14,12 @@ defmodule LogsrvApi.Link do post |> LogsrvApi.forward_links |> Enum.map(fn(fwd_link) -> - %Link{from: post, to: fwd_link} + {to_post, context} = fwd_link + %Link{ + from: post, + to: to_post, + context: context + } end) end) |> List.flatten {:ok, links} @@ -40,7 +45,8 @@ defmodule LogsrvApi.Link do #GenServer.call(__MODULE__, {:get_links_to, post}) end - def get_links_to!(post), do: get_links_to(post) |> LogsrvApi.just + def to(post), do: get_links_to(post) |> LogsrvApi.just + def from(post), do: get_links_from(post) |> LogsrvApi.just def handle_call({:links}, _from, links) do {:reply, {:ok, links}, links} @@ -67,6 +73,6 @@ defimpl Inspect, for: LogsrvApi.Link do else "" end - "%#{is_broken}Link{'#{link.from.title}' => '#{link.to.title}'}" + "%#{is_broken}Link{'#{link.from.title}' => '#{link.to.title}' @ \"#{link.context}\"}" end end diff --git a/logsrv/apps/logsrv_web/lib/logsrv_web/controllers/post_controller.ex b/logsrv/apps/logsrv_web/lib/logsrv_web/controllers/post_controller.ex index 342339e..4680fc8 100644 --- a/logsrv/apps/logsrv_web/lib/logsrv_web/controllers/post_controller.ex +++ b/logsrv/apps/logsrv_web/lib/logsrv_web/controllers/post_controller.ex @@ -19,7 +19,7 @@ defmodule LogsrvWeb.PostController do case status do :ok -> - render(conn, "post.html", post: post, backlinks: post |> Link.get_links_to!) + render(conn, "post.html", post: post, backlinks: post |> Link.to) _ -> not_found(conn) @@ -28,7 +28,7 @@ defmodule LogsrvWeb.PostController do def home(conn, _params) do # render(conn, "home.html") - show(conn, %{"id" => "contents"}) + show(conn, %{"id" => "home"}) end def not_found(conn) do diff --git a/logsrv/apps/logsrv_web/lib/logsrv_web/templates/layout/root.html.heex b/logsrv/apps/logsrv_web/lib/logsrv_web/templates/layout/root.html.heex index ad70a37..5fe1f98 100644 --- a/logsrv/apps/logsrv_web/lib/logsrv_web/templates/layout/root.html.heex +++ b/logsrv/apps/logsrv_web/lib/logsrv_web/templates/layout/root.html.heex @@ -1,5 +1,5 @@ - + @@ -12,7 +12,7 @@ diff --git a/logsrv/apps/logsrv_web/lib/logsrv_web/templates/post/post.html.heex b/logsrv/apps/logsrv_web/lib/logsrv_web/templates/post/post.html.heex index 18434ed..ae2cdf4 100644 --- a/logsrv/apps/logsrv_web/lib/logsrv_web/templates/post/post.html.heex +++ b/logsrv/apps/logsrv_web/lib/logsrv_web/templates/post/post.html.heex @@ -1,16 +1,25 @@

<%= @post.title %>

- <%= raw(@post.html) %> + <%= parse_links(@post) %>
-
+

Backlinks

    <%= for link <- @backlinks do %> -
  • <%= link.from.title %>
  • +
  • + +
    + <%= parse_links(link.from, link.context) %> +
    +
  • <% end %>
<%= if @backlinks |> length == 0 do %> -No backlinks. +No pages link to this one. <% end %>
\ No newline at end of file diff --git a/logsrv/apps/logsrv_web/lib/logsrv_web/views/post_view.ex b/logsrv/apps/logsrv_web/lib/logsrv_web/views/post_view.ex index 2090081..4cc3435 100644 --- a/logsrv/apps/logsrv_web/lib/logsrv_web/views/post_view.ex +++ b/logsrv/apps/logsrv_web/lib/logsrv_web/views/post_view.ex @@ -3,11 +3,37 @@ defmodule LogsrvWeb.PostView do import LogsrvApi.Journal def post_path(post) do - "/post/#{post.slug}" + post.slug end def cleanup(str) do str end + def parse_links(post) do + parse_links(post, post.html) + end + + def parse_links(post, content) do + output = content + |> String.split(~r/[\[\]]/, trim: true) + |> Enum.map(fn(str) -> + if String.match?( + " " <> (post |> LogsrvApi.forward_pages |> Enum.join(" ")) <> " ", + " #{str |> LogsrvApi.to_slug} " |> Regex.compile! + ) do + slug = str |> LogsrvApi.to_slug + {status, page} = slug |> LogsrvApi.Filesystem.get_by_slug + {no_exist, href} = case status do + :ok -> {"", slug} + :no_such_page -> {"bg-error", "javascript:;"} + end + "#{str}" + else + str + end + end) + raw(output |> List.to_string) + end + end