目次

pukiwiki

PHP で書かれた Wiki エンジンの一種。

公式には 1.4.7 から長期にわたってバージョンアップがなされていない。 添付ファイルの扱いが貧弱。 非日本語圏では普及していない。

nishimotz は dokuwiki を使うことが増えたが、pukiwiki も使い続けているので、気づいたことをメモしていくつもり。

PukiWiki Plus! (1.4.7ベースに国際化など)

PHP 5.4対応

github プロジェクト

あまり派生版を作りたくなかったがあまりに混沌としているので作りました

変更点

pukiwiki.ini.php

アクセス制限

書き込みのみ Basic 認証をかける pukiwiki.ini.php の例

$auth_users = array(
	'foo'	=> 'foo_passwd',
);
$auth_method_type = 'pagename';
$edit_auth = 1;
$edit_auth_pages = array(
	'/.*/'	=> 'foo',
);

テンプレート

新規作成するページが常に template というページを雛形にするための pukiwiki.ini.php の記述:

$auto_template_func = 1;
$auto_template_rules = array(
	// '((.+)\/([^\/]+))' => '\2/template'
	'.+' => 'template' // by nishimotz
);

複数行のプラグイン引数を可能に

後述する pre 機能を使うための pukiwiki.ini.php の記述:

define('PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK', 0);

便利な使い方

plugin ディレクトリの中身あれこれ

topicpath.inc.php

ヘッダーの hoge / hoge / hoge のような(リンクつきの)HTML文字列を生成している。

下記のように直すと、

[[hoge/hoge/hoge]]

のようになるので、他のページからリンクを貼るときにコピーペーストが楽になる。

// Show a link to $defaultpage or not
define('PLUGIN_TOPICPATH_TOP_DISPLAY', 0); // nishimotz
 
// 中略
 
// Separetor / of / topic / path
define('PLUGIN_TOPICPATH_TOP_SEPARATOR', '/'); // nishimotz
 
//
// 中略
//
 
return "[[" . join(PLUGIN_TOPICPATH_TOP_SEPARATOR, array_reverse($topic_path)) . "]]";  // nishimotz

newpage.inc.php

新規ページを押した階層をページ名のデフォルト階層にする。

function plugin_newpage_convert()
{
 
(omitted)
 
	$newpage = '';
 
	// by nishimotz begin
	if (isset($vars['refer']) && $vars['refer'] != 'FrontPage') {
	   $newpage = $vars['refer'] . '/';
	} 
	// end

attach.inc.php

非公開で利用するときには添付のパスワードを不要にしたい。

ファイルサイズの上限を大きくしたい。例えば 1MB から 10MB に。

先頭の下記の設定をいじる。

// Max file size for upload on script of PukiWikiX_FILESIZE
define('PLUGIN_ATTACH_MAX_FILESIZE', (1024 * 1024 * 10)); // default: 1MB
 
// 管理者だけが添付ファイルをアップロードできるようにする
define('PLUGIN_ATTACH_UPLOAD_ADMIN_ONLY', FALSE); // FALSE or TRUE
 
// 管理者だけが添付ファイルを削除できるようにする
define('PLUGIN_ATTACH_DELETE_ADMIN_ONLY', FALSE); // FALSE or TRUE

EUC-JP ファイル名のデコード

since 2013-10-09

Python 2.7 で。

なるべく将来性がありそうな書きかたをしてみた:

# coding: utf-8
from __future__ import unicode_literals, print_function
from os import walk
import unittest
 
def hexEucJpToString(src):
    c = int(len(src) / 2)
    ar = bytearray()
    for i in xrange(c):
        h = src[i*2 : (i+1)*2]
        ar.append(int('0x' + h, 16))
    return ar.decode('euc-jp')
 
if __name__ == '__main__':
    for root, dirs, files in walk(WIKI_DIR):
        for f in files:
            if not f.endswith('.txt'):
                continue
            name = hexEucJpToString(f.replace('.txt', ''))
            print(root + ' ' + f + ' ' + name)
 
class TestHexEucJpToString(unittest.TestCase):
    def testCases(self):
        self.assertEqual("日本語", hexEucJpToString("C6FCCBDCB8EC"))