PukiWiki/Wikiファイル名の調べ方

ちょっとしたPukiWikiのTipsです。(2022-10-01、追記:2022-10-10)


Linux、PHP環境の場合のメモになります。


wiki/*.txt を直接参照したい時のTips

PukiWikiで作成した本文は
「wiki/呪文みたいな文字列.txt」に保存されます。

で、呪文を解読する方法は

$ php -r 'echo strtoupper(bin2hex(strval("MenuBar"))) . ".txt\n";'
4D656E75426172.txt
(つまり "MenuBar" のファイルは wiki/4D656E75426172.txt になります)

lib/func.php にある encode 関数がファイル名を取得するやつです。
そこに書いてある内容をphpコマンドで実行したのが上記です。

その逆が
同じく lib/func.php にある
decode、の中の pkwk_hex2bin関数なので、同じように真似して

 $ php -r 'echo pack("H*", (string)"4D656E75426172") . "\n";'
 MenuBar
(つまり wiki/4D656E75426172.txt というのは "MenuBar" のファイルです)

ちゃんとこれを調べるまでは、
本文に出てくる単語を grep コマンドで探しては複数ファイルがヒットしていた私です。

(ただ、それはそれで想定外の場所に更新もれが見つかったりして助かったりもしていたのですが)

これを何度も繰り返すなら、シェル関数として .bashrc とかの起動スクリプトに仕込んでしまうのも良いかと。

# こんなシェル関数を記述する
wiki (){
  if [ -z "$1" ]; then return; 
  elif `echo $1 | grep -q ".txt"` && [ $? -eq 0 ]; then
    str=`echo "$1" | sed -e "s/\(.*\)\.txt/\1/"`
    str=`printf 'echo pack("H*", (string)"%s"); echo "\n";' $str`
    php -r "$str"
  else
    str=`printf 'echo strtoupper(bin2hex(strval("%s"))); echo ".txt\n";' $1`
    php -r "$str"
  fi
}
$ wiki MenuBar
4D656E75426172.txt
  
$ wiki 4D656E75426172.txt
MenuBar


注意点として、
この wiki/*.txt を直接編集してしまうと、PukiWikiの履歴機能やタイムスタンプ機能と連携できなくなってしまいます、たぶん。
サイトの更新には PukiWikiの更新機能を使いましょう。

・・・とはいえ、Wikiとしてではなくホームページとして個人利用している私の場合は、
新規作成以外はいっそ wiki/*.txt を直接更新した方が楽だなーと思っています。

(Webブラウザ経由で書くよりも、viコマンドの方が楽なんです。
 検索するのも grep コマンドが早いですし、
 バックアップは PukiWikiディレクトリ丸ごと tar zcvf で取得したい派ですし。)

同じような運用をしたい方に向けて、
小ネタを以下にメモします。


wiki/*.txt を直接更新したい派に向けたTips


最終更新一覧には「履歴」と「差分」のリンクも表示されますが、
ホームページとして使っている私には、順番だけ表示してくれれば十分です。*1

試しに削ってみました。

(lib/file.php 637行目あたり)
function get_recentchanges_line($page, $time, $is_diff)
{
    global $do_backup;
    (中略)
    //$line = '-' . $lastmod . ' - ' . $diff_backup . ' [[' . $page . ']]' . "\n";
    $line = '-' . $lastmod . ' - ' . '[[' . $page . ']]' . "\n";
    return $line;
}

ページの更新タイミングでRecentChangesが上書きされて、
履歴と差分へのリンクが消えると思います。

そして、ここに表示される時刻はどうやら cache/recent.dat に入っているようです。

(cache/recent.dat の記述例)
1662616526      PukiWiki/カレンダーに祝日を入れる

数字の部分はUnix時間なので、
それを時刻表示にしたい場合は、こんなかんじです。

$ php -r 'echo date("Y/m/d H:i:s\n", 1662616526 + (3600*9));'
2022/09/08 14:55:26

9時間足したのはGMTと日本の時差のぶんです。

以上、ご参考まで。


*1 Wikiとして使うなら、複数人で更新するために履歴も差分も必要な情報だと思うので、削ったらダメだと思います。