仕組み
以下のような仕組みでできる範囲の機能でよしとする。
基本的な仕組み
- 記事は所定のディレクトリ内に1記事1ファイルとして保存する
- 記事を事前に読み取って作ったindexファイルで一覧表示やタグ検索、日付検索を実現する
- 記事を事前に読み取って内容を集めて作ったsearchファイルでキーワード検索を実現する
記事のフォーマット
記事を書くファイルは、メールやHTTPメッセージのようにヘッダと本文の形式にする。
WordPressでいう以下の部分を表現したい。
ヘッダ部分に日付、タイトル、タグ、作者などを書き、続いて本文を書くことにする。
ヘッダと本文の区切りは改行2個にする。最初に現れた改行2個でヘッダと本文を分ける。
ヘッダの形式はJSONにする。
メールのように「Subject: xxxxxx」「Date: yyyy-mm-dd」とするのも考えたが、「{"title":"xxxxxxxxxx"}」のほうが書きやすいし解析はjson_encodeで済む。
例)
{ "title": "記事のタイトル", "date": "2022-11-11", "tags": ["tag1", "tag2"], "author": "xxxx" } 記事の本文。 記事の本文。 ## 中見出し - 記事の本文。 - 記事の本文。 - 記事の本文。
このデータを使ってWebサイトを表示する側はphpで作る。
やることは以下のようになる。
// ファイルの内容を取得 $a = file_get_contents('/所定のディレクトリ/ファイル名'); // 改行2個で分ける $b = explode("\n\n", $a, 2); // 1個目はヘッダ $header = json_decode($b[0]); // 2個目は本文 $body = markdown_to_html($b[1]);
index
所定のディレクトリをスキャンして記事の一覧を作っておきたい。
全記事をスキャンしてヘッダを取得して年月順に並び変えて……といったことをリアルタイムで毎回行うのは非効率なので避けたい。
記事の情報を新着順に配列にしてJSON形式で保存しておけば、記事の一覧は json_decode(index);
するだけで済む。
search
検索もバラバラの記事ファイルをいちいち開いて中を調べて……といったことは避けたい。
所定のディレクトリをスキャンして記事のファイル名と記事の本文を並べた検索用ファイルを作っておきたい。
先頭にファイル名、タブなどで区切った後に、本文の改行を除去したものをずるずるとつなげておけば、ファイル内を検索して行頭を見ることで記事のファイル名がわかる仕組み。
記事が増えたときの負荷は気になるが、シンプルにphpで実装すると以下のようなことで済む。
$a = file('search'); foreach ($a as $v) { $x = explode("\t", $v, 2); if (strpos($x[1], '検索キーワード') !== false) { // マッチした } }
index と検索用ファイルを作っておく利点
- 無駄な負荷を避けたい
- indexを更新するまで書きかけが公開されないようにする
リアルタイムで記事ファイルをスキャンされると、書きかけのものまで表示されかねない。(下書きフラグなどで対応してもよいかもしれないが。)