mirror of
https://github.com/narrrl/narl-workspace.git
synced 2026-11-03 16:41:27 +01:00
A document links to another by its path, `[the plan](/n/work/plan)`, or now by its title, `[[Plan]]` or `[[Plan|the plan]]`. What each document links to is kept in a new `links` table, rebuilt whenever its text is written: from the browser, over the mount, or by an import. A title is looked for in the linking document's space first, then in every other. Renaming or moving a document, or a folder above it, rewrites the links to it in every document that has one, in the same transaction: the path to the new one, a title to the new name, with the label left as it was. Each rewritten document keeps a revision of what it said before. A link to something in the trash keeps its row, so it follows the thing when it is restored somewhere else. A document created, or renamed, under a title that a link was waiting for is found by that link from then on. The reader draws `[[titles]]` as links, and a title no document has yet as a dimmed one that offers to write that document. `gf` follows either from the editor, and `[[` there completes titles from the search. `gb` and `:backlinks` list the documents that link to the open one, with the line each does it on; the line under the title counts them. A share page shows these links as plain text, as it does every /n/ link. The documents written before this are indexed once, when the server starts and finds the table empty.
18 lines
874 B
SQL
18 lines
874 B
SQL
-- The links between documents, as their text writes them: a `/n/...` path,
|
|
-- or a `[[title]]`. Rebuilt from a document's text whenever it is written,
|
|
-- and read the other way round: for what links to a document, and for the
|
|
-- texts to rewrite when what they link to is renamed or moved.
|
|
--
|
|
-- Nothing fills it for the documents already written; the server indexes
|
|
-- them all when it starts and finds it empty (see `links::backfill`).
|
|
CREATE TABLE links (
|
|
from_id INTEGER NOT NULL REFERENCES nodes (id) ON DELETE CASCADE,
|
|
kind TEXT NOT NULL CHECK (kind IN ('path', 'wiki')),
|
|
-- What the link says: the path after `/n/`, or the title in the brackets.
|
|
target TEXT NOT NULL,
|
|
to_id INTEGER NOT NULL REFERENCES nodes (id) ON DELETE CASCADE,
|
|
PRIMARY KEY (from_id, kind, target)
|
|
) WITHOUT ROWID;
|
|
|
|
CREATE INDEX idx_links_to ON links (to_id);
|