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の日本語環境をインストールすると入るページャーです。ない場合はlessに置き換えてください。

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にしているいうことですね。ターミナルからワンライナーで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のメタデータ解析でした。これぐらいなら、シェルスクリプトでササッと書いて作れますね。