add backlinks
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing

This commit is contained in:
shibao 2025-02-15 06:00:37 +00:00
parent 6c2aba84ef
commit 0c5442f0cd
25 changed files with 502 additions and 147 deletions

View File

@ -1,4 +1,5 @@
# v0.1.19 # v0.1.19
- Add backlinks
- Fix visibility issues with multiple users - Fix visibility issues with multiple users
# v0.1.18 # v0.1.18

BIN
home.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 340 KiB

View File

@ -88,6 +88,42 @@ defmodule Memex.Contexts do
) )
end end
@doc """
Returns the list of contexts that link to a particular slug.
## Examples
iex> backlink(%User{id: 123})
[%Context{}, ...]
iex> backlink("[other-context]", %User{id: 123})
[%Context{content: "[other-context]"}, ...]
"""
@spec backlink(String.t(), User.t()) :: [Context.t()]
def backlink(link, %{id: user_id}) when user_id |> is_binary() do
link = link |> String.replace("[", "\\[") |> String.replace("]", "\\]")
link_regex = "(^|[^\[])#{link}($|[^\]])"
Repo.all(
from c in Context,
where: fragment("? ~ ?", c.content, ^link_regex),
order_by: c.slug
)
end
def backlink(link, _invalid_user) do
link = link |> String.replace("[", "\\[") |> String.replace("]", "\\]")
link_regex = "(^|[^\[])#{link}($|[^\]])"
Repo.all(
from c in Context,
where: fragment("? ~ ?", c.content, ^link_regex),
where: c.visibility == :public,
order_by: c.slug
)
end
@doc """ @doc """
Gets a single context. Gets a single context.

View File

@ -86,6 +86,42 @@ defmodule Memex.Notes do
) )
end end
@doc """
Returns the list of notes that link to a particular slug.
## Examples
iex> backlink(%User{id: 123})
[%Note{}, ...]
iex> backlink("[other-note]", %User{id: 123})
[%Note{content: "[other-note]"}, ...]
"""
@spec backlink(String.t(), User.t()) :: [Note.t()]
def backlink(link, %{id: user_id}) when user_id |> is_binary() do
link = link |> String.replace("[", "\\[") |> String.replace("]", "\\]")
link_regex = "(^|[^\[])#{link}($|[^\]])"
Repo.all(
from n in Note,
where: fragment("? ~ ?", n.content, ^link_regex),
order_by: n.slug
)
end
def backlink(link, _invalid_user) do
link = link |> String.replace("[", "\\[") |> String.replace("]", "\\]")
link_regex = "(^|[^\[])#{link}($|[^\]])"
Repo.all(
from n in Note,
where: fragment("? ~ ?", n.content, ^link_regex),
where: n.visibility == :public,
order_by: n.slug
)
end
@doc """ @doc """
Gets a single note. Gets a single note.

View File

@ -142,6 +142,50 @@ defmodule Memex.Pipelines do
) )
end end
@doc """
Returns the list of pipelines that link to a particular slug.
## Examples
iex> backlink(%User{id: 123})
[%Pipeline{}, ...]
iex> backlink("[other-pipeline]", %User{id: 123})
[%Pipeline{description: "[other-pipeline]"}, ...]
"""
@spec backlink(String.t(), User.t()) :: [Pipeline.t()]
def backlink(link, %{id: user_id}) when user_id |> is_binary() do
link = link |> String.replace("[", "\\[") |> String.replace("]", "\\]")
link_regex = "(^|[^\[])#{link}($|[^\]])"
Repo.all(
from p in Pipeline,
left_join: s in assoc(p, :steps),
where:
fragment("? ~ ?", p.description, ^link_regex) or
fragment("? ~ ?", s.content, ^link_regex),
distinct: true,
order_by: p.slug
)
end
def backlink(link, _invalid_user) do
link = link |> String.replace("[", "\\[") |> String.replace("]", "\\]")
link_regex = "(^|[^\[])#{link}($|[^\]])"
Repo.all(
from p in Pipeline,
left_join: s in assoc(p, :steps),
where:
fragment("? ~ ?", p.description, ^link_regex) or
fragment("? ~ ?", s.content, ^link_regex),
where: p.visibility == :public,
distinct: true,
order_by: p.slug
)
end
@doc """ @doc """
Creates a pipeline. Creates a pipeline.

View File

@ -1,6 +1,6 @@
defmodule MemexWeb.ContextLive.Show do defmodule MemexWeb.ContextLive.Show do
use MemexWeb, :live_view use MemexWeb, :live_view
alias Memex.Contexts alias Memex.{Contexts, Pipelines}
@impl true @impl true
def mount(_params, _session, socket) do def mount(_params, _session, socket) do
@ -23,7 +23,9 @@ defmodule MemexWeb.ContextLive.Show do
socket socket
|> assign( |> assign(
context: context, context: context,
page_title: page_title(live_action, context) page_title: page_title(live_action, context),
context_backlinks: Contexts.backlink("[#{context.slug}]", current_user),
pipeline_backlinks: Pipelines.backlink("[[#{context.slug}]]", current_user)
) )
{:noreply, socket} {:noreply, socket}

View File

@ -11,6 +11,27 @@
<.context_content context={@context} /> <.context_content context={@context} />
<div
:if={@context_backlinks ++ @pipeline_backlinks != []}
class="flex flex-wrap justify-end items-center self-end"
>
<p><%= gettext("Backlinked by:") %></p>
<.link
:for={backlink <- @context_backlinks}
class="m-1 hover:underline"
patch={~p"/context/#{backlink}"}
>
<%= gettext("[%{slug}]", slug: backlink.slug) %>
</.link>
<.link
:for={backlink <- @pipeline_backlinks}
class="m-1 hover:underline"
patch={~p"/pipeline/#{backlink}"}
>
<%= gettext("[[%{slug}]]", slug: backlink.slug) %>
</.link>
</div>
<p class="self-end"> <p class="self-end">
<%= gettext("Visibility: %{visibility}", visibility: @context.visibility) %> <%= gettext("Visibility: %{visibility}", visibility: @context.visibility) %>
</p> </p>

View File

@ -1,5 +1,5 @@
<div class="mx-auto flex flex-col justify-center items-stretch space-y-4 max-w-lg"> <div class="flex flex-col justify-center items-stretch mx-auto space-y-4 max-w-lg">
<h1 class="title text-primary-400 text-xl"> <h1 class="text-xl title text-primary-400">
<%= gettext("memEx") %> <%= gettext("memEx") %>
</h1> </h1>
@ -31,7 +31,7 @@
</p> </p>
</li> </li>
<li class="flex flex-col justify-center items-center text-right space-y-2"> <li class="flex flex-col justify-center items-center space-y-2 text-right">
<.link navigate={~p"/faq"} class="btn btn-primary"> <.link navigate={~p"/faq"} class="btn btn-primary">
<%= gettext("read more on how to use memEx") %> <%= gettext("read more on how to use memEx") %>
</.link> </.link>
@ -41,7 +41,7 @@
<hr class="hr" /> <hr class="hr" />
<ul class="flex flex-col space-y-4"> <ul class="flex flex-col space-y-4">
<h2 class="title text-primary-400 text-lg"> <h2 class="text-lg title text-primary-400">
<%= gettext("features") %> <%= gettext("features") %>
</h2> </h2>
@ -71,12 +71,21 @@
<%= gettext("accessible from any internet-capable device") %> <%= gettext("accessible from any internet-capable device") %>
</p> </p>
</li> </li>
<li class="flex flex-col justify-center items-center space-y-2">
<b class="whitespace-nowrap">
<%= gettext("backlinks:") %>
</b>
<p>
<%= gettext("view referencing items from the referenced item") %>
</p>
</li>
</ul> </ul>
<hr class="hr" /> <hr class="hr" />
<ul class="flex flex-col justify-center space-y-4"> <ul class="flex flex-col justify-center space-y-4">
<h2 class="title text-primary-400 text-lg"> <h2 class="text-lg title text-primary-400">
<%= gettext("instance information") %> <%= gettext("instance information") %>
</h2> </h2>
@ -124,7 +133,7 @@
<hr class="hr" /> <hr class="hr" />
<ul class="flex flex-col space-y-2"> <ul class="flex flex-col space-y-2">
<h2 class="title text-primary-400 text-lg"> <h2 class="text-lg title text-primary-400">
<%= gettext("get involved") %> <%= gettext("get involved") %>
</h2> </h2>

View File

@ -1,6 +1,6 @@
defmodule MemexWeb.NoteLive.Show do defmodule MemexWeb.NoteLive.Show do
use MemexWeb, :live_view use MemexWeb, :live_view
alias Memex.Notes alias Memex.{Contexts, Notes, Pipelines}
@impl true @impl true
def mount(_params, _session, socket) do def mount(_params, _session, socket) do
@ -22,8 +22,11 @@ defmodule MemexWeb.NoteLive.Show do
socket = socket =
socket socket
|> assign( |> assign(
context_backlinks: Contexts.backlink("[[#{note.slug}]]", current_user),
note_backlinks: Notes.backlink("[#{note.slug}]", current_user),
note: note, note: note,
page_title: page_title(live_action, note) page_title: page_title(live_action, note),
pipeline_backlinks: Pipelines.backlink("[[[#{note.slug}]]]", current_user)
) )
{:noreply, socket} {:noreply, socket}

View File

@ -11,6 +11,34 @@
<.note_content note={@note} /> <.note_content note={@note} />
<div
:if={@note_backlinks ++ @context_backlinks ++ @pipeline_backlinks != []}
class="flex flex-wrap justify-end items-center self-end"
>
<p><%= gettext("Backlinked by:") %></p>
<.link
:for={backlink <- @note_backlinks}
class="m-1 hover:underline"
patch={~p"/note/#{backlink}"}
>
<%= gettext("[%{slug}]", slug: backlink.slug) %>
</.link>
<.link
:for={backlink <- @context_backlinks}
class="m-1 hover:underline"
patch={~p"/context/#{backlink}"}
>
<%= gettext("[[%{slug}]]", slug: backlink.slug) %>
</.link>
<.link
:for={backlink <- @pipeline_backlinks}
class="m-1 hover:underline"
patch={~p"/pipeline/#{backlink}"}
>
<%= gettext("[[[%{slug}]]]", slug: backlink.slug) %>
</.link>
</div>
<p class="self-end"> <p class="self-end">
<%= gettext("Visibility: %{visibility}", visibility: @note.visibility) %> <%= gettext("Visibility: %{visibility}", visibility: @note.visibility) %>
</p> </p>

View File

@ -23,6 +23,7 @@ defmodule MemexWeb.PipelineLive.Show do
socket socket
|> assign( |> assign(
page_title: page_title(live_action, pipeline), page_title: page_title(live_action, pipeline),
pipeline_backlinks: Pipelines.backlink("[#{pipeline.slug}]", current_user),
pipeline: pipeline, pipeline: pipeline,
steps: pipeline |> Steps.list_steps(current_user) steps: pipeline |> Steps.list_steps(current_user)
) )

View File

@ -11,6 +11,17 @@
<.pipeline_content pipeline={@pipeline} /> <.pipeline_content pipeline={@pipeline} />
<div :if={@pipeline_backlinks != []} class="flex flex-wrap justify-end items-center self-end">
<p><%= gettext("Backlinked by:") %></p>
<.link
:for={backlink <- @pipeline_backlinks}
class="m-1 hover:underline"
patch={~p"/pipeline/#{backlink}"}
>
<%= gettext("[%{slug}]", slug: backlink.slug) %>
</.link>
</div>
<p class="self-end"> <p class="self-end">
<%= gettext("Visibility: %{visibility}", visibility: @pipeline.visibility) %> <%= gettext("Visibility: %{visibility}", visibility: @pipeline.visibility) %>
</p> </p>

View File

@ -40,12 +40,12 @@ msgid "create invite"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/index.html.heex:50 #: lib/memex_web/live/context_live/index.html.heex:50
#: lib/memex_web/live/context_live/show.html.heex:30 #: lib/memex_web/live/context_live/show.html.heex:51
#: lib/memex_web/live/note_live/index.html.heex:50 #: lib/memex_web/live/note_live/index.html.heex:50
#: lib/memex_web/live/note_live/show.html.heex:30 #: lib/memex_web/live/note_live/show.html.heex:58
#: lib/memex_web/live/pipeline_live/index.html.heex:52 #: lib/memex_web/live/pipeline_live/index.html.heex:52
#: lib/memex_web/live/pipeline_live/show.html.heex:30 #: lib/memex_web/live/pipeline_live/show.html.heex:41
#: lib/memex_web/live/pipeline_live/show.html.heex:101 #: lib/memex_web/live/pipeline_live/show.html.heex:112
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "delete" msgid "delete"
msgstr "" msgstr ""
@ -56,12 +56,12 @@ msgid "delete user"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/index.html.heex:40 #: lib/memex_web/live/context_live/index.html.heex:40
#: lib/memex_web/live/context_live/show.html.heex:20 #: lib/memex_web/live/context_live/show.html.heex:41
#: lib/memex_web/live/note_live/index.html.heex:40 #: lib/memex_web/live/note_live/index.html.heex:40
#: lib/memex_web/live/note_live/show.html.heex:20 #: lib/memex_web/live/note_live/show.html.heex:48
#: lib/memex_web/live/pipeline_live/index.html.heex:40 #: lib/memex_web/live/pipeline_live/index.html.heex:40
#: lib/memex_web/live/pipeline_live/show.html.heex:20 #: lib/memex_web/live/pipeline_live/show.html.heex:31
#: lib/memex_web/live/pipeline_live/show.html.heex:90 #: lib/memex_web/live/pipeline_live/show.html.heex:101
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "edit" msgid "edit"
msgstr "" msgstr ""
@ -112,7 +112,7 @@ msgstr ""
msgid "save" msgid "save"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:116 #: lib/memex_web/live/pipeline_live/show.html.heex:127
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "add step" msgid "add step"
msgstr "" msgstr ""
@ -145,24 +145,24 @@ msgid "copy invite link for %{invite_name}"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/index.html.heex:48 #: lib/memex_web/live/context_live/index.html.heex:48
#: lib/memex_web/live/context_live/show.html.heex:28 #: lib/memex_web/live/context_live/show.html.heex:49
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "delete %{context_slug}" msgid "delete %{context_slug}"
msgstr "" msgstr ""
#: lib/memex_web/live/note_live/index.html.heex:48 #: lib/memex_web/live/note_live/index.html.heex:48
#: lib/memex_web/live/note_live/show.html.heex:28 #: lib/memex_web/live/note_live/show.html.heex:56
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "delete %{note_slug}" msgid "delete %{note_slug}"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/index.html.heex:49 #: lib/memex_web/live/pipeline_live/index.html.heex:49
#: lib/memex_web/live/pipeline_live/show.html.heex:28 #: lib/memex_web/live/pipeline_live/show.html.heex:39
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "delete %{pipeline_slug}" msgid "delete %{pipeline_slug}"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:99 #: lib/memex_web/live/pipeline_live/show.html.heex:110
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "delete %{step_title}" msgid "delete %{step_title}"
msgstr "" msgstr ""
@ -187,7 +187,7 @@ msgstr ""
msgid "edit %{pipeline_slug}" msgid "edit %{pipeline_slug}"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:88 #: lib/memex_web/live/pipeline_live/show.html.heex:99
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "edit %{step_title}" msgid "edit %{step_title}"
msgstr "" msgstr ""
@ -197,12 +197,12 @@ msgstr ""
msgid "edit invite for %{invite_name}" msgid "edit invite for %{invite_name}"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:78 #: lib/memex_web/live/pipeline_live/show.html.heex:89
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "move %{step_title} down" msgid "move %{step_title} down"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:62 #: lib/memex_web/live/pipeline_live/show.html.heex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "move %{step_title} up" msgid "move %{step_title} up"
msgstr "" msgstr ""

View File

@ -40,12 +40,12 @@ msgid "create invite"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/index.html.heex:50 #: lib/memex_web/live/context_live/index.html.heex:50
#: lib/memex_web/live/context_live/show.html.heex:30 #: lib/memex_web/live/context_live/show.html.heex:51
#: lib/memex_web/live/note_live/index.html.heex:50 #: lib/memex_web/live/note_live/index.html.heex:50
#: lib/memex_web/live/note_live/show.html.heex:30 #: lib/memex_web/live/note_live/show.html.heex:58
#: lib/memex_web/live/pipeline_live/index.html.heex:52 #: lib/memex_web/live/pipeline_live/index.html.heex:52
#: lib/memex_web/live/pipeline_live/show.html.heex:30 #: lib/memex_web/live/pipeline_live/show.html.heex:41
#: lib/memex_web/live/pipeline_live/show.html.heex:101 #: lib/memex_web/live/pipeline_live/show.html.heex:112
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "delete" msgid "delete"
msgstr "" msgstr ""
@ -56,12 +56,12 @@ msgid "delete user"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/index.html.heex:40 #: lib/memex_web/live/context_live/index.html.heex:40
#: lib/memex_web/live/context_live/show.html.heex:20 #: lib/memex_web/live/context_live/show.html.heex:41
#: lib/memex_web/live/note_live/index.html.heex:40 #: lib/memex_web/live/note_live/index.html.heex:40
#: lib/memex_web/live/note_live/show.html.heex:20 #: lib/memex_web/live/note_live/show.html.heex:48
#: lib/memex_web/live/pipeline_live/index.html.heex:40 #: lib/memex_web/live/pipeline_live/index.html.heex:40
#: lib/memex_web/live/pipeline_live/show.html.heex:20 #: lib/memex_web/live/pipeline_live/show.html.heex:31
#: lib/memex_web/live/pipeline_live/show.html.heex:90 #: lib/memex_web/live/pipeline_live/show.html.heex:101
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "edit" msgid "edit"
msgstr "" msgstr ""
@ -112,7 +112,7 @@ msgstr ""
msgid "save" msgid "save"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:116 #: lib/memex_web/live/pipeline_live/show.html.heex:127
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "add step" msgid "add step"
msgstr "" msgstr ""
@ -145,24 +145,24 @@ msgid "copy invite link for %{invite_name}"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/index.html.heex:48 #: lib/memex_web/live/context_live/index.html.heex:48
#: lib/memex_web/live/context_live/show.html.heex:28 #: lib/memex_web/live/context_live/show.html.heex:49
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "delete %{context_slug}" msgid "delete %{context_slug}"
msgstr "" msgstr ""
#: lib/memex_web/live/note_live/index.html.heex:48 #: lib/memex_web/live/note_live/index.html.heex:48
#: lib/memex_web/live/note_live/show.html.heex:28 #: lib/memex_web/live/note_live/show.html.heex:56
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "delete %{note_slug}" msgid "delete %{note_slug}"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/index.html.heex:49 #: lib/memex_web/live/pipeline_live/index.html.heex:49
#: lib/memex_web/live/pipeline_live/show.html.heex:28 #: lib/memex_web/live/pipeline_live/show.html.heex:39
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "delete %{pipeline_slug}" msgid "delete %{pipeline_slug}"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:99 #: lib/memex_web/live/pipeline_live/show.html.heex:110
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "delete %{step_title}" msgid "delete %{step_title}"
msgstr "" msgstr ""
@ -187,7 +187,7 @@ msgstr ""
msgid "edit %{pipeline_slug}" msgid "edit %{pipeline_slug}"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:88 #: lib/memex_web/live/pipeline_live/show.html.heex:99
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "edit %{step_title}" msgid "edit %{step_title}"
msgstr "" msgstr ""
@ -197,12 +197,12 @@ msgstr ""
msgid "edit invite for %{invite_name}" msgid "edit invite for %{invite_name}"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:78 #: lib/memex_web/live/pipeline_live/show.html.heex:89
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "move %{step_title} down" msgid "move %{step_title} down"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:62 #: lib/memex_web/live/pipeline_live/show.html.heex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "move %{step_title} up" msgid "move %{step_title} up"
msgstr "" msgstr ""

View File

@ -17,9 +17,9 @@ msgstr ""
msgid "Reconnecting..." msgid "Reconnecting..."
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/show.html.heex:15 #: lib/memex_web/live/context_live/show.html.heex:36
#: lib/memex_web/live/note_live/show.html.heex:15 #: lib/memex_web/live/note_live/show.html.heex:43
#: lib/memex_web/live/pipeline_live/show.html.heex:15 #: lib/memex_web/live/pipeline_live/show.html.heex:26
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Visibility: %{visibility}" msgid "Visibility: %{visibility}"
msgstr "" msgstr ""
@ -29,7 +29,7 @@ msgstr ""
msgid "accessible from any internet-capable device" msgid "accessible from any internet-capable device"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:85 #: lib/memex_web/live/home_live.html.heex:94
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "admins:" msgid "admins:"
msgstr "" msgstr ""
@ -118,12 +118,12 @@ msgstr ""
msgid "features" msgid "features"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:149 #: lib/memex_web/live/home_live.html.heex:158
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "help translate" msgid "help translate"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:80 #: lib/memex_web/live/home_live.html.heex:89
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "instance information" msgid "instance information"
msgstr "" msgstr ""
@ -133,7 +133,7 @@ msgstr ""
msgid "invite disabled" msgid "invite disabled"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:105 #: lib/memex_web/live/home_live.html.heex:114
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "invite only" msgid "invite only"
msgstr "" msgstr ""
@ -217,7 +217,7 @@ msgstr ""
msgid "provide context around a single topic and hotlink to your notes" msgid "provide context around a single topic and hotlink to your notes"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:104 #: lib/memex_web/live/home_live.html.heex:113
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "public signups" msgid "public signups"
msgstr "" msgstr ""
@ -227,12 +227,12 @@ msgstr ""
msgid "register" msgid "register"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:101 #: lib/memex_web/live/home_live.html.heex:110
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "registration:" msgid "registration:"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:160 #: lib/memex_web/live/home_live.html.heex:169
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "report bugs or request features" msgid "report bugs or request features"
msgstr "" msgstr ""
@ -288,12 +288,12 @@ msgstr ""
msgid "users" msgid "users"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:111 #: lib/memex_web/live/home_live.html.heex:120
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "version:" msgid "version:"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:138 #: lib/memex_web/live/home_live.html.heex:147
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "view the source code" msgid "view the source code"
msgstr "" msgstr ""
@ -350,11 +350,11 @@ msgid "%{slug} created"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/index.ex:65 #: lib/memex_web/live/context_live/index.ex:65
#: lib/memex_web/live/context_live/show.ex:42 #: lib/memex_web/live/context_live/show.ex:44
#: lib/memex_web/live/note_live/index.ex:65 #: lib/memex_web/live/note_live/index.ex:65
#: lib/memex_web/live/note_live/show.ex:42 #: lib/memex_web/live/note_live/show.ex:45
#: lib/memex_web/live/pipeline_live/index.ex:65 #: lib/memex_web/live/pipeline_live/index.ex:65
#: lib/memex_web/live/pipeline_live/show.ex:77 #: lib/memex_web/live/pipeline_live/show.ex:78
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{slug} deleted" msgid "%{slug} deleted"
msgstr "" msgstr ""
@ -367,11 +367,11 @@ msgid "%{slug} saved"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/index.ex:25 #: lib/memex_web/live/context_live/index.ex:25
#: lib/memex_web/live/context_live/show.ex:49 #: lib/memex_web/live/context_live/show.ex:51
#: lib/memex_web/live/note_live/index.ex:25 #: lib/memex_web/live/note_live/index.ex:25
#: lib/memex_web/live/note_live/show.ex:49 #: lib/memex_web/live/note_live/show.ex:52
#: lib/memex_web/live/pipeline_live/index.ex:24 #: lib/memex_web/live/pipeline_live/index.ex:24
#: lib/memex_web/live/pipeline_live/show.ex:123 #: lib/memex_web/live/pipeline_live/show.ex:124
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "edit %{slug}" msgid "edit %{slug}"
msgstr "" msgstr ""
@ -422,7 +422,7 @@ msgstr ""
msgid "what is this?" msgid "what is this?"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:48 #: lib/memex_web/live/pipeline_live/show.html.heex:59
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{position}. %{title}" msgid "%{position}. %{title}"
msgstr "" msgstr ""
@ -432,7 +432,7 @@ msgstr ""
msgid "%{title} created" msgid "%{title} created"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.ex:95 #: lib/memex_web/live/pipeline_live/show.ex:96
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{title} deleted" msgid "%{title} deleted"
msgstr "" msgstr ""
@ -442,17 +442,17 @@ msgstr ""
msgid "%{title} saved" msgid "%{title} saved"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.ex:125 #: lib/memex_web/live/pipeline_live/show.ex:126
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "add step to %{slug}" msgid "add step to %{slug}"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:42 #: lib/memex_web/live/pipeline_live/show.html.heex:53
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "no steps" msgid "no steps"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:37 #: lib/memex_web/live/pipeline_live/show.html.heex:48
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "steps:" msgid "steps:"
msgstr "" msgstr ""
@ -598,7 +598,7 @@ msgstr ""
msgid "uses: %{uses_count}" msgid "uses: %{uses_count}"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:128 #: lib/memex_web/live/home_live.html.heex:137
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "get involved" msgid "get involved"
msgstr "" msgstr ""
@ -721,3 +721,38 @@ msgstr ""
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "(This note is empty)" msgid "(This note is empty)"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/show.html.heex:18
#: lib/memex_web/live/note_live/show.html.heex:18
#: lib/memex_web/live/pipeline_live/show.html.heex:15
#, elixir-autogen, elixir-format
msgid "Backlinked by:"
msgstr ""
#: lib/memex_web/live/context_live/show.html.heex:24
#: lib/memex_web/live/note_live/show.html.heex:24
#: lib/memex_web/live/pipeline_live/show.html.heex:21
#, elixir-autogen, elixir-format, fuzzy
msgid "[%{slug}]"
msgstr ""
#: lib/memex_web/live/context_live/show.html.heex:31
#: lib/memex_web/live/note_live/show.html.heex:31
#, elixir-autogen, elixir-format
msgid "[[%{slug}]]"
msgstr ""
#: lib/memex_web/live/note_live/show.html.heex:38
#, elixir-autogen, elixir-format
msgid "[[[%{slug}]]]"
msgstr ""
#: lib/memex_web/live/home_live.html.heex:77
#, elixir-autogen, elixir-format
msgid "backlinks:"
msgstr ""
#: lib/memex_web/live/home_live.html.heex:80
#, elixir-autogen, elixir-format
msgid "view referencing items from the referenced item"
msgstr ""

View File

@ -66,12 +66,12 @@ msgid "are you sure you want to make %{invite_name} unlimited?"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/index.html.heex:47 #: lib/memex_web/live/context_live/index.html.heex:47
#: lib/memex_web/live/context_live/show.html.heex:27 #: lib/memex_web/live/context_live/show.html.heex:48
#: lib/memex_web/live/note_live/index.html.heex:47 #: lib/memex_web/live/note_live/index.html.heex:47
#: lib/memex_web/live/note_live/show.html.heex:27 #: lib/memex_web/live/note_live/show.html.heex:55
#: lib/memex_web/live/pipeline_live/index.html.heex:47 #: lib/memex_web/live/pipeline_live/index.html.heex:47
#: lib/memex_web/live/pipeline_live/show.html.heex:27 #: lib/memex_web/live/pipeline_live/show.html.heex:38
#: lib/memex_web/live/pipeline_live/show.html.heex:98 #: lib/memex_web/live/pipeline_live/show.html.heex:109
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "are you sure?" msgid "are you sure?"
msgstr "" msgstr ""
@ -86,7 +86,7 @@ msgstr ""
msgid "language updated successfully." msgid "language updated successfully."
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:90 #: lib/memex_web/live/home_live.html.heex:99
#, elixir-autogen, elixir-format, fuzzy #, elixir-autogen, elixir-format, fuzzy
msgid "register to setup memEx" msgid "register to setup memEx"
msgstr "" msgstr ""

View File

@ -15,9 +15,9 @@ msgstr ""
msgid "Reconnecting..." msgid "Reconnecting..."
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/show.html.heex:15 #: lib/memex_web/live/context_live/show.html.heex:36
#: lib/memex_web/live/note_live/show.html.heex:15 #: lib/memex_web/live/note_live/show.html.heex:43
#: lib/memex_web/live/pipeline_live/show.html.heex:15 #: lib/memex_web/live/pipeline_live/show.html.heex:26
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Visibility: %{visibility}" msgid "Visibility: %{visibility}"
msgstr "" msgstr ""
@ -27,7 +27,7 @@ msgstr ""
msgid "accessible from any internet-capable device" msgid "accessible from any internet-capable device"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:85 #: lib/memex_web/live/home_live.html.heex:94
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "admins:" msgid "admins:"
msgstr "" msgstr ""
@ -116,12 +116,12 @@ msgstr ""
msgid "features" msgid "features"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:149 #: lib/memex_web/live/home_live.html.heex:158
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "help translate" msgid "help translate"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:80 #: lib/memex_web/live/home_live.html.heex:89
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "instance information" msgid "instance information"
msgstr "" msgstr ""
@ -131,7 +131,7 @@ msgstr ""
msgid "invite disabled" msgid "invite disabled"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:105 #: lib/memex_web/live/home_live.html.heex:114
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "invite only" msgid "invite only"
msgstr "" msgstr ""
@ -215,7 +215,7 @@ msgstr ""
msgid "provide context around a single topic and hotlink to your notes" msgid "provide context around a single topic and hotlink to your notes"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:104 #: lib/memex_web/live/home_live.html.heex:113
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "public signups" msgid "public signups"
msgstr "" msgstr ""
@ -225,12 +225,12 @@ msgstr ""
msgid "register" msgid "register"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:101 #: lib/memex_web/live/home_live.html.heex:110
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "registration:" msgid "registration:"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:160 #: lib/memex_web/live/home_live.html.heex:169
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "report bugs or request features" msgid "report bugs or request features"
msgstr "" msgstr ""
@ -286,12 +286,12 @@ msgstr ""
msgid "users" msgid "users"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:111 #: lib/memex_web/live/home_live.html.heex:120
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "version:" msgid "version:"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:138 #: lib/memex_web/live/home_live.html.heex:147
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "view the source code" msgid "view the source code"
msgstr "" msgstr ""
@ -348,11 +348,11 @@ msgid "%{slug} created"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/index.ex:65 #: lib/memex_web/live/context_live/index.ex:65
#: lib/memex_web/live/context_live/show.ex:42 #: lib/memex_web/live/context_live/show.ex:44
#: lib/memex_web/live/note_live/index.ex:65 #: lib/memex_web/live/note_live/index.ex:65
#: lib/memex_web/live/note_live/show.ex:42 #: lib/memex_web/live/note_live/show.ex:45
#: lib/memex_web/live/pipeline_live/index.ex:65 #: lib/memex_web/live/pipeline_live/index.ex:65
#: lib/memex_web/live/pipeline_live/show.ex:77 #: lib/memex_web/live/pipeline_live/show.ex:78
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{slug} deleted" msgid "%{slug} deleted"
msgstr "" msgstr ""
@ -365,11 +365,11 @@ msgid "%{slug} saved"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/index.ex:25 #: lib/memex_web/live/context_live/index.ex:25
#: lib/memex_web/live/context_live/show.ex:49 #: lib/memex_web/live/context_live/show.ex:51
#: lib/memex_web/live/note_live/index.ex:25 #: lib/memex_web/live/note_live/index.ex:25
#: lib/memex_web/live/note_live/show.ex:49 #: lib/memex_web/live/note_live/show.ex:52
#: lib/memex_web/live/pipeline_live/index.ex:24 #: lib/memex_web/live/pipeline_live/index.ex:24
#: lib/memex_web/live/pipeline_live/show.ex:123 #: lib/memex_web/live/pipeline_live/show.ex:124
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "edit %{slug}" msgid "edit %{slug}"
msgstr "" msgstr ""
@ -420,7 +420,7 @@ msgstr ""
msgid "what is this?" msgid "what is this?"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:48 #: lib/memex_web/live/pipeline_live/show.html.heex:59
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{position}. %{title}" msgid "%{position}. %{title}"
msgstr "" msgstr ""
@ -430,7 +430,7 @@ msgstr ""
msgid "%{title} created" msgid "%{title} created"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.ex:95 #: lib/memex_web/live/pipeline_live/show.ex:96
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{title} deleted" msgid "%{title} deleted"
msgstr "" msgstr ""
@ -440,17 +440,17 @@ msgstr ""
msgid "%{title} saved" msgid "%{title} saved"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.ex:125 #: lib/memex_web/live/pipeline_live/show.ex:126
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "add step to %{slug}" msgid "add step to %{slug}"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:42 #: lib/memex_web/live/pipeline_live/show.html.heex:53
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "no steps" msgid "no steps"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:37 #: lib/memex_web/live/pipeline_live/show.html.heex:48
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "steps:" msgid "steps:"
msgstr "" msgstr ""
@ -596,7 +596,7 @@ msgstr ""
msgid "uses: %{uses_count}" msgid "uses: %{uses_count}"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:128 #: lib/memex_web/live/home_live.html.heex:137
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "get involved" msgid "get involved"
msgstr "" msgstr ""
@ -719,3 +719,38 @@ msgstr ""
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "(This note is empty)" msgid "(This note is empty)"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/show.html.heex:18
#: lib/memex_web/live/note_live/show.html.heex:18
#: lib/memex_web/live/pipeline_live/show.html.heex:15
#, elixir-autogen, elixir-format
msgid "Backlinked by:"
msgstr ""
#: lib/memex_web/live/context_live/show.html.heex:24
#: lib/memex_web/live/note_live/show.html.heex:24
#: lib/memex_web/live/pipeline_live/show.html.heex:21
#, elixir-autogen, elixir-format
msgid "[%{slug}]"
msgstr ""
#: lib/memex_web/live/context_live/show.html.heex:31
#: lib/memex_web/live/note_live/show.html.heex:31
#, elixir-autogen, elixir-format
msgid "[[%{slug}]]"
msgstr ""
#: lib/memex_web/live/note_live/show.html.heex:38
#, elixir-autogen, elixir-format
msgid "[[[%{slug}]]]"
msgstr ""
#: lib/memex_web/live/home_live.html.heex:77
#, elixir-autogen, elixir-format
msgid "backlinks:"
msgstr ""
#: lib/memex_web/live/home_live.html.heex:80
#, elixir-autogen, elixir-format
msgid "view referencing items from the referenced item"
msgstr ""

View File

@ -41,12 +41,12 @@ msgid "create invite"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/index.html.heex:50 #: lib/memex_web/live/context_live/index.html.heex:50
#: lib/memex_web/live/context_live/show.html.heex:30 #: lib/memex_web/live/context_live/show.html.heex:51
#: lib/memex_web/live/note_live/index.html.heex:50 #: lib/memex_web/live/note_live/index.html.heex:50
#: lib/memex_web/live/note_live/show.html.heex:30 #: lib/memex_web/live/note_live/show.html.heex:58
#: lib/memex_web/live/pipeline_live/index.html.heex:52 #: lib/memex_web/live/pipeline_live/index.html.heex:52
#: lib/memex_web/live/pipeline_live/show.html.heex:30 #: lib/memex_web/live/pipeline_live/show.html.heex:41
#: lib/memex_web/live/pipeline_live/show.html.heex:101 #: lib/memex_web/live/pipeline_live/show.html.heex:112
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "delete" msgid "delete"
msgstr "" msgstr ""
@ -57,12 +57,12 @@ msgid "delete user"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/index.html.heex:40 #: lib/memex_web/live/context_live/index.html.heex:40
#: lib/memex_web/live/context_live/show.html.heex:20 #: lib/memex_web/live/context_live/show.html.heex:41
#: lib/memex_web/live/note_live/index.html.heex:40 #: lib/memex_web/live/note_live/index.html.heex:40
#: lib/memex_web/live/note_live/show.html.heex:20 #: lib/memex_web/live/note_live/show.html.heex:48
#: lib/memex_web/live/pipeline_live/index.html.heex:40 #: lib/memex_web/live/pipeline_live/index.html.heex:40
#: lib/memex_web/live/pipeline_live/show.html.heex:20 #: lib/memex_web/live/pipeline_live/show.html.heex:31
#: lib/memex_web/live/pipeline_live/show.html.heex:90 #: lib/memex_web/live/pipeline_live/show.html.heex:101
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "edit" msgid "edit"
msgstr "" msgstr ""
@ -113,7 +113,7 @@ msgstr ""
msgid "save" msgid "save"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:116 #: lib/memex_web/live/pipeline_live/show.html.heex:127
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "add step" msgid "add step"
msgstr "" msgstr ""
@ -146,24 +146,24 @@ msgid "copy invite link for %{invite_name}"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/index.html.heex:48 #: lib/memex_web/live/context_live/index.html.heex:48
#: lib/memex_web/live/context_live/show.html.heex:28 #: lib/memex_web/live/context_live/show.html.heex:49
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "delete %{context_slug}" msgid "delete %{context_slug}"
msgstr "" msgstr ""
#: lib/memex_web/live/note_live/index.html.heex:48 #: lib/memex_web/live/note_live/index.html.heex:48
#: lib/memex_web/live/note_live/show.html.heex:28 #: lib/memex_web/live/note_live/show.html.heex:56
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "delete %{note_slug}" msgid "delete %{note_slug}"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/index.html.heex:49 #: lib/memex_web/live/pipeline_live/index.html.heex:49
#: lib/memex_web/live/pipeline_live/show.html.heex:28 #: lib/memex_web/live/pipeline_live/show.html.heex:39
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "delete %{pipeline_slug}" msgid "delete %{pipeline_slug}"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:99 #: lib/memex_web/live/pipeline_live/show.html.heex:110
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "delete %{step_title}" msgid "delete %{step_title}"
msgstr "" msgstr ""
@ -188,7 +188,7 @@ msgstr ""
msgid "edit %{pipeline_slug}" msgid "edit %{pipeline_slug}"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:88 #: lib/memex_web/live/pipeline_live/show.html.heex:99
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "edit %{step_title}" msgid "edit %{step_title}"
msgstr "" msgstr ""
@ -198,12 +198,12 @@ msgstr ""
msgid "edit invite for %{invite_name}" msgid "edit invite for %{invite_name}"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:78 #: lib/memex_web/live/pipeline_live/show.html.heex:89
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "move %{step_title} down" msgid "move %{step_title} down"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:62 #: lib/memex_web/live/pipeline_live/show.html.heex:73
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "move %{step_title} up" msgid "move %{step_title} up"
msgstr "" msgstr ""

View File

@ -16,9 +16,9 @@ msgstr ""
msgid "Reconnecting..." msgid "Reconnecting..."
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/show.html.heex:15 #: lib/memex_web/live/context_live/show.html.heex:36
#: lib/memex_web/live/note_live/show.html.heex:15 #: lib/memex_web/live/note_live/show.html.heex:43
#: lib/memex_web/live/pipeline_live/show.html.heex:15 #: lib/memex_web/live/pipeline_live/show.html.heex:26
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Visibility: %{visibility}" msgid "Visibility: %{visibility}"
msgstr "" msgstr ""
@ -28,7 +28,7 @@ msgstr ""
msgid "accessible from any internet-capable device" msgid "accessible from any internet-capable device"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:85 #: lib/memex_web/live/home_live.html.heex:94
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "admins:" msgid "admins:"
msgstr "" msgstr ""
@ -117,12 +117,12 @@ msgstr ""
msgid "features" msgid "features"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:149 #: lib/memex_web/live/home_live.html.heex:158
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "help translate" msgid "help translate"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:80 #: lib/memex_web/live/home_live.html.heex:89
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "instance information" msgid "instance information"
msgstr "" msgstr ""
@ -132,7 +132,7 @@ msgstr ""
msgid "invite disabled" msgid "invite disabled"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:105 #: lib/memex_web/live/home_live.html.heex:114
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "invite only" msgid "invite only"
msgstr "" msgstr ""
@ -216,7 +216,7 @@ msgstr ""
msgid "provide context around a single topic and hotlink to your notes" msgid "provide context around a single topic and hotlink to your notes"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:104 #: lib/memex_web/live/home_live.html.heex:113
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "public signups" msgid "public signups"
msgstr "" msgstr ""
@ -226,12 +226,12 @@ msgstr ""
msgid "register" msgid "register"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:101 #: lib/memex_web/live/home_live.html.heex:110
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "registration:" msgid "registration:"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:160 #: lib/memex_web/live/home_live.html.heex:169
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "report bugs or request features" msgid "report bugs or request features"
msgstr "" msgstr ""
@ -287,12 +287,12 @@ msgstr ""
msgid "users" msgid "users"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:111 #: lib/memex_web/live/home_live.html.heex:120
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "version:" msgid "version:"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:138 #: lib/memex_web/live/home_live.html.heex:147
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "view the source code" msgid "view the source code"
msgstr "" msgstr ""
@ -349,11 +349,11 @@ msgid "%{slug} created"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/index.ex:65 #: lib/memex_web/live/context_live/index.ex:65
#: lib/memex_web/live/context_live/show.ex:42 #: lib/memex_web/live/context_live/show.ex:44
#: lib/memex_web/live/note_live/index.ex:65 #: lib/memex_web/live/note_live/index.ex:65
#: lib/memex_web/live/note_live/show.ex:42 #: lib/memex_web/live/note_live/show.ex:45
#: lib/memex_web/live/pipeline_live/index.ex:65 #: lib/memex_web/live/pipeline_live/index.ex:65
#: lib/memex_web/live/pipeline_live/show.ex:77 #: lib/memex_web/live/pipeline_live/show.ex:78
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{slug} deleted" msgid "%{slug} deleted"
msgstr "" msgstr ""
@ -366,11 +366,11 @@ msgid "%{slug} saved"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/index.ex:25 #: lib/memex_web/live/context_live/index.ex:25
#: lib/memex_web/live/context_live/show.ex:49 #: lib/memex_web/live/context_live/show.ex:51
#: lib/memex_web/live/note_live/index.ex:25 #: lib/memex_web/live/note_live/index.ex:25
#: lib/memex_web/live/note_live/show.ex:49 #: lib/memex_web/live/note_live/show.ex:52
#: lib/memex_web/live/pipeline_live/index.ex:24 #: lib/memex_web/live/pipeline_live/index.ex:24
#: lib/memex_web/live/pipeline_live/show.ex:123 #: lib/memex_web/live/pipeline_live/show.ex:124
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "edit %{slug}" msgid "edit %{slug}"
msgstr "" msgstr ""
@ -421,7 +421,7 @@ msgstr ""
msgid "what is this?" msgid "what is this?"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:48 #: lib/memex_web/live/pipeline_live/show.html.heex:59
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{position}. %{title}" msgid "%{position}. %{title}"
msgstr "" msgstr ""
@ -431,7 +431,7 @@ msgstr ""
msgid "%{title} created" msgid "%{title} created"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.ex:95 #: lib/memex_web/live/pipeline_live/show.ex:96
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "%{title} deleted" msgid "%{title} deleted"
msgstr "" msgstr ""
@ -441,17 +441,17 @@ msgstr ""
msgid "%{title} saved" msgid "%{title} saved"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.ex:125 #: lib/memex_web/live/pipeline_live/show.ex:126
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "add step to %{slug}" msgid "add step to %{slug}"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:42 #: lib/memex_web/live/pipeline_live/show.html.heex:53
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "no steps" msgid "no steps"
msgstr "" msgstr ""
#: lib/memex_web/live/pipeline_live/show.html.heex:37 #: lib/memex_web/live/pipeline_live/show.html.heex:48
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "steps:" msgid "steps:"
msgstr "" msgstr ""
@ -597,7 +597,7 @@ msgstr ""
msgid "uses: %{uses_count}" msgid "uses: %{uses_count}"
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:128 #: lib/memex_web/live/home_live.html.heex:137
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "get involved" msgid "get involved"
msgstr "" msgstr ""
@ -720,3 +720,38 @@ msgstr ""
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "(This note is empty)" msgid "(This note is empty)"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/show.html.heex:18
#: lib/memex_web/live/note_live/show.html.heex:18
#: lib/memex_web/live/pipeline_live/show.html.heex:15
#, elixir-autogen, elixir-format
msgid "Backlinked by:"
msgstr ""
#: lib/memex_web/live/context_live/show.html.heex:24
#: lib/memex_web/live/note_live/show.html.heex:24
#: lib/memex_web/live/pipeline_live/show.html.heex:21
#, elixir-autogen, elixir-format, fuzzy
msgid "[%{slug}]"
msgstr ""
#: lib/memex_web/live/context_live/show.html.heex:31
#: lib/memex_web/live/note_live/show.html.heex:31
#, elixir-autogen, elixir-format
msgid "[[%{slug}]]"
msgstr ""
#: lib/memex_web/live/note_live/show.html.heex:38
#, elixir-autogen, elixir-format
msgid "[[[%{slug}]]]"
msgstr ""
#: lib/memex_web/live/home_live.html.heex:77
#, elixir-autogen, elixir-format
msgid "backlinks:"
msgstr ""
#: lib/memex_web/live/home_live.html.heex:80
#, elixir-autogen, elixir-format
msgid "view referencing items from the referenced item"
msgstr ""

View File

@ -67,12 +67,12 @@ msgid "are you sure you want to make %{invite_name} unlimited?"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/index.html.heex:47 #: lib/memex_web/live/context_live/index.html.heex:47
#: lib/memex_web/live/context_live/show.html.heex:27 #: lib/memex_web/live/context_live/show.html.heex:48
#: lib/memex_web/live/note_live/index.html.heex:47 #: lib/memex_web/live/note_live/index.html.heex:47
#: lib/memex_web/live/note_live/show.html.heex:27 #: lib/memex_web/live/note_live/show.html.heex:55
#: lib/memex_web/live/pipeline_live/index.html.heex:47 #: lib/memex_web/live/pipeline_live/index.html.heex:47
#: lib/memex_web/live/pipeline_live/show.html.heex:27 #: lib/memex_web/live/pipeline_live/show.html.heex:38
#: lib/memex_web/live/pipeline_live/show.html.heex:98 #: lib/memex_web/live/pipeline_live/show.html.heex:109
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "are you sure?" msgid "are you sure?"
msgstr "" msgstr ""
@ -87,7 +87,7 @@ msgstr ""
msgid "language updated successfully." msgid "language updated successfully."
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:90 #: lib/memex_web/live/home_live.html.heex:99
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "register to setup memEx" msgid "register to setup memEx"
msgstr "" msgstr ""

View File

@ -66,12 +66,12 @@ msgid "are you sure you want to make %{invite_name} unlimited?"
msgstr "" msgstr ""
#: lib/memex_web/live/context_live/index.html.heex:47 #: lib/memex_web/live/context_live/index.html.heex:47
#: lib/memex_web/live/context_live/show.html.heex:27 #: lib/memex_web/live/context_live/show.html.heex:48
#: lib/memex_web/live/note_live/index.html.heex:47 #: lib/memex_web/live/note_live/index.html.heex:47
#: lib/memex_web/live/note_live/show.html.heex:27 #: lib/memex_web/live/note_live/show.html.heex:55
#: lib/memex_web/live/pipeline_live/index.html.heex:47 #: lib/memex_web/live/pipeline_live/index.html.heex:47
#: lib/memex_web/live/pipeline_live/show.html.heex:27 #: lib/memex_web/live/pipeline_live/show.html.heex:38
#: lib/memex_web/live/pipeline_live/show.html.heex:98 #: lib/memex_web/live/pipeline_live/show.html.heex:109
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "are you sure?" msgid "are you sure?"
msgstr "" msgstr ""
@ -86,7 +86,7 @@ msgstr ""
msgid "language updated successfully." msgid "language updated successfully."
msgstr "" msgstr ""
#: lib/memex_web/live/home_live.html.heex:90 #: lib/memex_web/live/home_live.html.heex:99
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "register to setup memEx" msgid "register to setup memEx"
msgstr "" msgstr ""

View File

@ -1,8 +1,8 @@
# memEx # memEx
![old screenshot](https://gitea.bubbletea.dev/shibao/memEx/raw/branch/stable/home.png) ![home page screenshot](https://gitea.bubbletea.dev/shibao/memEx/raw/branch/stable/home.png)
memEx is an easy way to digitize the structured processes of your life. A structured personal knowledge base, inspired by zettlekasten and org-mode.
- Notes: Document notes about individual items or concepts - Notes: Document notes about individual items or concepts
- Contexts: Provide context around a single topic and hotlink to individual - Contexts: Provide context around a single topic and hotlink to individual
@ -14,6 +14,7 @@ memEx is an easy way to digitize the structured processes of your life.
- Multi-user: Built with sharing and collaboration in mind - Multi-user: Built with sharing and collaboration in mind
- Privacy: Privacy controls on a per-note, context or pipeline basis - Privacy: Privacy controls on a per-note, context or pipeline basis
- Convenient: Accessible from any internet-capable device - Convenient: Accessible from any internet-capable device
- Backlinks: View referencing items from the referenced item
# Installation # Installation

View File

@ -108,6 +108,25 @@ defmodule Memex.ContextsTest do
assert Contexts.get_context_by_slug("c", user) == context assert Contexts.get_context_by_slug("c", user) == context
end end
test "backlink/2 returns contexts with backlinks", %{user: user} do
context_fixture(%{slug: "a", visibility: :public}, user)
assert Contexts.backlink("[a]", user) == []
context = context_fixture(%{slug: "b", content: "[a]", visibility: :unlisted}, user)
assert Contexts.backlink("[a]", user) == [context]
assert Contexts.backlink("[b]", user) == []
end
test "backlink/2 only returns public contexts for empty user", %{user: user} do
context_fixture(%{slug: "a", visibility: :public}, user)
context_fixture(%{slug: "b", content: "[a]", visibility: :unlisted}, user)
context_fixture(%{slug: "c", content: "[a]", visibility: :private}, user)
assert Contexts.backlink("[a]", nil) == []
context = context_fixture(%{slug: "d", content: "[a]", visibility: :public}, user)
assert Contexts.backlink("[a]", nil) == [context]
end
test "create_context/1 with valid data creates a context", %{user: user} do test "create_context/1 with valid data creates a context", %{user: user} do
valid_attrs = %{ valid_attrs = %{
content: "some content", content: "some content",

View File

@ -109,6 +109,25 @@ defmodule Memex.NotesTest do
assert Notes.get_note_by_slug("c", user) == note assert Notes.get_note_by_slug("c", user) == note
end end
test "backlink/2 returns notes with backlinks", %{user: user} do
note_fixture(%{slug: "a", visibility: :public}, user)
assert Notes.backlink("[a]", user) == []
note = note_fixture(%{slug: "b", content: "[a]", visibility: :unlisted}, user)
assert Notes.backlink("[a]", user) == [note]
assert Notes.backlink("[b]", user) == []
end
test "backlink/2 only returns public notes for empty user", %{user: user} do
note_fixture(%{slug: "a", visibility: :public}, user)
note_fixture(%{slug: "b", content: "[a]", visibility: :unlisted}, user)
note_fixture(%{slug: "c", content: "[a]", visibility: :private}, user)
assert Notes.backlink("[a]", nil) == []
note = note_fixture(%{slug: "d", content: "[a]", visibility: :public}, user)
assert Notes.backlink("[a]", nil) == [note]
end
test "create_note/1 with valid data creates a note", %{user: user} do test "create_note/1 with valid data creates a note", %{user: user} do
valid_attrs = %{ valid_attrs = %{
content: "some content", content: "some content",

View File

@ -108,6 +108,25 @@ defmodule Memex.PipelinesTest do
assert Pipelines.get_pipeline_by_slug("c", user) == pipeline assert Pipelines.get_pipeline_by_slug("c", user) == pipeline
end end
test "backlink/2 returns pipelines with backlinks", %{user: user} do
pipeline_fixture(%{slug: "a", visibility: :public}, user)
assert Pipelines.backlink("[a]", user) == []
pipeline = pipeline_fixture(%{slug: "b", description: "[a]", visibility: :unlisted}, user)
assert Pipelines.backlink("[a]", user) == [pipeline]
assert Pipelines.backlink("[b]", user) == []
end
test "backlink/2 only returns public pipelines for empty user", %{user: user} do
pipeline_fixture(%{slug: "a", visibility: :public}, user)
pipeline_fixture(%{slug: "b", description: "[a]", visibility: :unlisted}, user)
pipeline_fixture(%{slug: "c", description: "[a]", visibility: :private}, user)
assert Pipelines.backlink("[a]", nil) == []
pipeline = pipeline_fixture(%{slug: "d", description: "[a]", visibility: :public}, user)
assert Pipelines.backlink("[a]", nil) == [pipeline]
end
test "create_pipeline/1 with valid data creates a pipeline", %{user: user} do test "create_pipeline/1 with valid data creates a pipeline", %{user: user} do
valid_attrs = %{ valid_attrs = %{
description: "some description", description: "some description",