Bluditはコンテンツのメタデータをjsonで管理している

nogajun
nogajun

_ フラットファイルCMSのBluditのコンテンツは、 bl-content フォルダ以下にあります。ページは、 bl-content/pages/ の下に (フレンドリーURL)/index.txt という形で保存されています。

 bludit
 ├ bl-content
 │ ├ databases (コンテンツのメタデータ。phpという拡張子ですがjsonで保存)
 │ │ ├ plugins (プラグインそれぞれのデータ)
 │ │ ├ categories.php
 │ │ ├ pages.php
 │ │ ├ security.php
 │ │ ├ site.php
 │ │ ├ syslog.php
 │ │ ├ tags.php
 │ │ └ users.php
 │ ├ pages (コンテンツの実体)
 │ │ └ フレンドリーURL
 │ │   └ index.txt
 │ ├ tmp
 │ ├ uploads
 │ └ workspaces
    (以下略)

自分の記憶では、ごく初期は、ほかの静的サイトジェネレーターのようにコンテンツのテキストの中にメタデータが埋め込まれていたと記憶してましたが、今はコンテンツとメタデータを分離されていて bl-content/databases/ 以下にjsonで保存、管理しています。

データを変換する場合、どうやってメタデータを生成すればいいのか気になったので調べてみました。

データを解析してみる

メタデータは、jsonですがphpの拡張子が付いています。pages.phpを見るとphpとして実行されないように1行目にこういう行があります。

 <?php defined('BLUDIT') or die('Bludit CMS.'); ?>

そしてjsonは圧縮されているのでかなり読みづらくなってます。とりあえず読むにはjqを使って整形するのが良さそうです。こんな感じで見てみました。lvはDebianの日本語環境をインストールすると入るページャーです。

 $ sed 1d pages.php | jq . | lv

そうするとこんなふうになりました。

 {
     "gallery": {
         "title": "gallery",
         "description": "",
         "username": "admin",
         "tags": [],
         "type": "static",
         "date": "2021-10-06 19:29:02",
         "dateModified": "2021-10-06 19:30:55",
         "position": 8,
         "coverImage": "",
         "category": "",
         "md5file": "d41d8cd98f00b204e9800998ecf8427e",
         "uuid": "a6957a9e0ae50865c6ef293dbf1b4974",
         "allowComments": true,
         "template": "",
         "noindex": false,
         "nofollow": false,
         "noarchive": false,
         "custom": [
             false
         ]
     },
 (以下略)

これはわかりやすいですね。ちょっと気になるのがmd5fileとuuidフィールドですが、 bl-kernel/pages.class.php を見るとこなっていました

 // Checksum MD5
            $row['md5file'] = md5_file(PATH_PAGES.$key.DS.FILENAME);

md5はindex.txtのmd5を求めていますね。

 function generateUUID() {
         return md5( uniqid().time() );
 }

uuidは、uuidと時間からmd5を求めたものをuuidにしているいうことですね。ワンライナーで試すとこんな感じ。

 $ php -r 'echo md5(uniqid().time())."\n";'

そしてpages.class.phpには頭にこういう部分がありまして…

 protected $dbFields = array(
                 'title'=>'',
                 'description'=>'',
                 'username'=>'',
                 'tags'=>array(),
                 'type'=>'published', // published, static, draft, sticky, scheduled, autosave
                 'date'=>'',
                 'dateModified'=>'',
                 'position'=>0,
                 'coverImage'=>'',
                 'category'=>'',
                 'md5file'=>'',
                 'uuid'=>'',
                 'allowComments'=>true,
                 'template'=>'',
                 'noindex'=>false,
                 'nofollow'=>false,
                 'noarchive'=>false,
                 'custom'=>array()
 );

これ見たら一発でわかるやーん!

まとめ

きれいにオチがついたところでBluditのメタデータ解析でした。これぐらいなら、シェルスクリプトでササッと書いて作れますね。