主にPukiWikiの改造に関するTips

§1 編集ボックスのサイズを変える

編集画面に表示される編集ボックスは若干小さいように思える。 大きくするには、default.ini.phpの以下の場所を書き換える。

/////////////////////////////////////////////////
// テキストエリアのカラム数
$cols = 80; // ←120くらいに変更

/////////////////////////////////////////////////
// テキストエリアの行数
$rows = 20; // ←30くらいに変更

§2 管理者のみが編集できるようにする

閲覧者にはコンテンツの編集を許可せず、管理者のみが編集できるようにする方法。 PukiWikiのRead-Onlyモードとして紹介されている。 要点は、

  • PKWK_READONLYを1として閲覧者には閲覧のみを許可する
  • index.phpをコピー・リネームし、PKWK_READONLYを0とすることで、編集用のindex.php仮にindex_edit.phpとする)を用意する

編集する場合は、index_edit.phpからWikiにアクセスすればOK。 もちろん、index.phpからアクセスした場合は編集できなくなっている。 さらにindex_edit.phpに対して認証による制限を加えれば、なおよし。

§3 現在表示しているページの名前を取得する

関数内で使用する場合は、$varsをglobalにする。

global $vars;
$pageName = $vars["page"];

「階層1/階層2/ページ名」の形式で得られるので、適宜切り分けて編集する。

§4 添付ファイルとしてアップロードできる最大サイズを大きくする

まずは、/etc/php.iniのうち次の三つの値を変更して、postされるデータとして受け付ける最大サイズを設定する。

memory_limit = 16M // -> 8Mより変更
post_max_size = 16M // -> 8Mより変更
upload_max_filesize = 8M // -> 2Mより変更

ここで、「memory_limit > post_max_size > upload_max_filesize」の関係になっていなければならないので注意。 変更したらApacheを再起動する。 つづいて、attatch.inc.phpを変更。 以下の二カ所を変更する。

// Max file size for upload on PHP (PHP default: 2MB)
ini_set('upload_max_filesize', '8M'); // -> /etc/php.iniに併せて2Mから8Mに変更

// Max file size for upload on script of PukiWikiX_FILESIZE
define('PLUGIN_ATTACH_MAX_FILESIZE', (8192 * 1024)); // default: 1MB -> 今回設定したい値として、8Mに変更

これで、最大8MBytesまでのファイルを添付ファイルとしてアップロードできるようになる。

§5 添付ファイル名からページ名と元のファイル名を取得する

添付ファイル名は「encode($page) . "_" . encode($file)」という基準で命名される。 文字列を変換する関数encodeとそれを逆変換する関数decodeは次のようになっている。

// ページ名のエンコード
function encode($key)
{
    return ($key == '') ? '' : strtoupper(bin2hex($key));
    // Equal to strtoupper(join('', unpack('H*0', $key)));
    // But PHP 4.3.10 says 'Warning: unpack(): Type H: outside of string in ...'
}

// ページ名のデコード
function decode($key)
{
    // Warning: pack(): Type H: illegal hex digit ...
    return preg_match('/^[0-9a-f]+$/i', $key) ? pack('H*', $key) : $key;
}

なので、アンダーバー(_)を区切りにしてページ名とファイル名に分割したあと、decodeしてやればそれぞれが取得できる。 ちなみに、encode、decode関数の処理をVB.NETで書くと以下の通り。

Function Encode(ByVal encoding As Encoding, ByVal str As String) As String

    Dim encoded As String = String.Empty
    Dim bytes As Byte() = encoding.GetBytes(str)

    For Each b As Byte In bytes

        encoded += b.ToString("X2")

    Next

    Return encoded

End Function

Function Decode(ByVal encoding As Encoding, ByVal str As String) As String

    Dim decoded As String = String.Empty
    Dim bytes As Byte() = DirectCast(Array.CreateInstance(GetType(Byte), str.Length \ 2), Byte())

    For i As Integer = 0 To str.Length - 1 Step 2

        bytes(i \ 2) = Convert.ToByte(str.Chars(i) + str.Chars(i + 1), 16)

    Next i

    Return encoding.GetString(bytes)

End Function

strに変換/逆変換したい文字列、encodingにはPukiWikiで使用している文字コードを設定する。 EUC-JPならEncoding.GetEncoding(51932)、UTF8ならEncoding.UTF8など。

§6 Namazuで検索できるようにする(やりかけ)

§7 index.phpと同じディレクトリにrobots.txtを置く

そのままrobots.txtを置くだけだと、デフォルトで用意されている.htaccessの内容が下記のようになっているため、403 Forbiddenになってしまう。

## Access control needs 'AllowOverride Limit' at httpd.conf.
<FilesMatch "\.(ini\.php|lng\.php|txt|gz|tgz|zip)$">
        Order allow,deny
        Deny from all
</FilesMatch>

## Using zlib.output_compression per directory (via .htaccess),
## needs 'AllowOverride Options' at httpd.conf.
#php_flag zlib.output_compression On

つまり、iniやらtxtやらといった拡張子をもつファイルへはアクセスできないようになっている。 このままの状態で検索エンジンなどがrobots.txtを参照しようとすると、大量のエラーログが残ってしまうため気分が悪い。 なので、FilesMatchディレクティブの下辺りに、下記のような記述を追加してrobots.txtへのアクセスを許可し、robots.txtを置く。

<Files robots.txt>
        Order deny,allow
        Allow from all
</Files>

あとは、robots.txtの内容を適当に書く。 ちなみに、icoは拡張子のリストに含まれていないので、favicon.icoは特に気にせずそのままおいておくだけでOK。

§8 チルダを使わないでも改行させる

pukiwiki.ini.phpの$line_breakを1に設定する。

/////////////////////////////////////////////////
// Convert linebreaks into <br />
$line_break = 1;

この値を1にすることで、チルダを使用しないでも改行が自動的に<br />へと変換されるようになる。