自作ブログ内でリンク先記事に被リンクを表示するトラックバック的機能を設計します。ブログ機能のアイデアに書いた機能の 1 つです。
まず言葉の整理です。記事 A に [[記事 B]]
などと記述した場合、A→B というリンクが貼られることになります。このとき、記事 A を「リンク元の記事」、記事 B を「リンク先の記事」と呼ぶことにします。
ブログ内トラックバックの基本的な仕様は、自作ブログ内の他記事へリンクを貼った場合に、リンク先の記事(記事 B)に、リンク元の記事(記事 A)へのリンクを表示します。表示は次のような感じにしようと思います。
# ブログ機能のアイデア
…
…
## この記事を参照している記事
- 「ブログ開発:ブログ内トラックバック」
現状、次のようなファイル構成になっています。
ublog/
articles/
<タイトル>.md
ids/
<article-id> (symlink ../articles/<タイトル>.md)
images/
<画像>.jpg
最低限必要な情報は、リンク先の記事 ID からリンク元の記事の一覧を得るための情報です。これは リンク先の記事/linked_from/リンク元の記事
というようなデータ構造になるでしょう。
ただ、現状のファイル構成では性能に関する潜在的な問題があります。トップページで記事を新しい順に並べるために ids/* をすべて読み取る(全記事のファイル内容を読む)必要があるということです。記事ファイルの先頭にあるフロントマター(記事データの設計を参照)の created(作成日)を参照し、その逆順にソートする処理が必要なのです。今は記事が少ないので顕在化していませんが、記事が増えるにしたがい、性能劣化が必ず起きます。この問題も解決できるような新たなデータ構造を考えたいです。(MySQL のようなデータベースシステムを使うのも解決策ですが、今回はファイルシステムで上手いことやりたいなと思っています。)
次のようなファイル構成を考えました。
ublog/
articles/
<タイトル>.md
ids/
<article-id>/
article (symlink ../../articles/<タイトル>.md)
linked_from/
<article-id>
link_to/
<article-id>
by-year-created/
<year>/
<article-id> (symlink ../../ids/<article-id>
images/
<画像>.jpg/png/…
linked_from はリンク元の記事が羅列されたディレクトリです。このディレクトリの内容に基づいて「この記事を参照している記事」のリストを生成します。
link_to はリンク先の記事が羅列されたディレクトリです。この情報は記事の更新時に役立ちます。記事の更新でリンクが増える場合は、素直にリンク先の記事の linked_from に ID を追加するだけで完了です。
一方、リンクが削除される場合、リンク先の記事の linked_from から更新された記事を削除する必要がありますが、それをどうやるかが問題です。更新後の記事だけを見ても(リンクが削除されているため)どの記事の linked_from を更新すれば良いか分かりません。そこで、link_to に含まれるファイルと更新された記事の差分を取ることで、削除すべきリンクを検出できます。link_to 無しでは、すべての記事の linked_from を調べなければなりません。
記事のデプロイ時は次の処理を行います。
記事表示時は今までの記事表示(Markdown から HTML への変換)に加え、記事の末尾に被リンクを表示します。具体的には、表示対象の記事の linked_from/ にあるシンボリックリンクを、記事タイトルとともに箇条書きで表示します。
by-year-created は記事の created 日付の「年」毎に分類するためのディレクトリです。ブログのトップページは created の新しい順に記事が並ぶので、このディレクトリが活躍するでしょう。記事一覧をページ分割した後になりますが、by-year-created ディレクトリを新しい方から読み込んでいき、1 ページ分の記事が収集されればそこで処理を終えます。こうすることで、全記事を読み取って created でソートする、ということをしなくて済みます。