I thought about this with a colleague the other day. Here's a sketch of how it might work, if anyone wants to implement it.
Ingredients:
- A
page_links join table (two columns, something like: source_page and linked_page)
- An observer on the wiki page model
- A method on the wiki page parser that gives an array of links
On save, the source page would delete all its rows in page_links, parse the new page content for links, and update the join table with which pages are now linked.
To display "what links here", all that would be needed is a query to give all page_links rows with a linked_page of the currently viewed page. The pages that link to that page are the source_page values in the result of that query.
Example:
page_links has no rows.
I create a page called "foo" with this content:
This is a page about foo. Related topics: [[bar]], [[baz]].
page_links then has:
| source_page |
linked_page |
| foo |
bar |
| foo |
baz |
Then, I create a page named "bar":
This is a page about bar.
To find the pages that link to "bar", I query for page_links with a linked_page of "bar". Result:
| source_page |
linked_page |
| foo |
bar |
So, "foo" is the only page that links to "bar".