Top > Pukiwiki
Last-modified: Thu, 19 Aug 2010 23:48:15 JST

Pukiwikiメモ Edit

管理/Pukiwiki改造とカブリ有り。いつか統合か。

Table of Contents


コード解読でとってもいいページを見つけた。
http://www.geocities.jp/sugachan1973/doc/funto52.html
ここの作者の前向きな努力には頭が下がります。

Plugin作成 Edit

形式 Edit

以下の関数を必要なだけ、name.inc.phpというファイルに書く。Pukiwiki Plus!なら、extend/pluginフォルダに入れるとオーバーライドできる。

関数名呼び出し方
plugin_name_convert()#name()HTMLテキスト
#name(){{

}}
plugin_name_inline()&name(){}
plugin_name_action()?cmd=name
?plugin=name
array('msg','body)

referかpageでページを指定して、actionタイプの返り値の'body'の値を''にしておけば、そのページの内容が勝手に読みこまれる。referとpageの両方を設定すると、pageが優先される。

他に、plugin_name_init()があるが、まぁ、他の時に。

引数 Edit

func_get_args()、func_num_args()で取得する。

プラグインに渡される引数で(プラグイン関数内で、func_get_args()で入手する)、 ()引数はhtmlspecialcharsでサニタイズ。インラインタイプの{}引数は不要。


複数行引数(マルチライン)は{{ }}の内容が最後の引数に入ってくる。改行の意味として"\r"が含まれて引数となる(通常は"\n"。わざわざ変換してる?)。1行であっても、最後に"\r"が入っているので、これを判断すれば、マルチラインかわかる。

convert_html()は複数行を受け付ける。ページ全体を変換する

$body = convert_html(get_source($pagename));

という書き方がよく見られる。wiki記法では、改行は"\n"となっている。

添付ファイルにアクセスする Edit

refプラグインのソースを見ると、こんな手順か(主要部を抜粋してある)。

if (preg_match('#^(.+)/([^/]+)$#', $name, $matches)) {
	if ($matches[1] == '.' || $matches[1] == '..') {
		$matches[1] .= '/'; // Restore relative paths
	}
	$name = $matches[2];
	$page = get_fullname(strip_bracket($matches[1]), $page); // strip is a compat
	$file = UPLOAD_DIR . encode($page) . '_' . encode($name);
	$is_file = is_file($file);
} else {
	// Simple single argument
	$file = UPLOAD_DIR . encode($page) . '_' . encode($name);
	$is_file = is_file($file);
}

最初のif文は、スラッシュが含まれるかどうかの判断。スラッシュが無い場合は、else側へ行って、今のページの添付ファイルを探す。 get_fullnameは相対パスを処理してくれる。添付ファイルは、UPLOAD_DIRにエンコードされたページ名とファイル名で「ページ名_ファイル名」で保存されている。

その他 Edit

get_source($pagename)でwikiの文章が取り出せる。"\r"は排除される。

convert_html()は、配列も受け取れる。上記のget_source($pagename)は、通常、配列を返している(第3引数で選べる。ファイルの読み方をfread()とfire()で切り替えている)。そして、get_source()の最後の部分で"\r"は除去されている。配列ではない"\n"を含む文字列をconvert_html()に渡しても、内部で"\n"を区切りにして、行ごとの配列に変えてから処理をおこなっている。このページが詳しい。

convert_html()は行単位の編集になるので、行中の一部分のwiki記法をhtmlに変換したものが欲しければ、make_link()関数を使う。名前からして、ハイパーリンクを作成する関数だと思っていたのだが、強調などのインラインな構文はこの関数が行っている(よって、convert_html()から何回も呼ばれている)。名前と機能が乖離している気がするが、初期はハイパーリンクだけを処理する関数だったのかもしれない(勝手な想像)。

is_page($page)でページがあるか確認。


plugin_name_action()を呼び出す場合、クエリストリングでcmd=nameとplugin=nameの区別は無いみたいだが(あるのか?)、arg_check('read')がtrueかチェックしているのをよく見るが、cmd=readとなっていることを保証できる?

pluginとcmdは同時に使用できないようになっていて、このページを読むと、pluginの場合は、arg_check()は常にfalseだ。


ページ名一覧の取得はget_existpages()。Pukiwiki Plus!の場合は、readableなものだけ列挙してくれるauth::get_existpages()を使うべき。


社内のインフラ間の通信手段にlib/proxy.phpの中にあるhttp_request()がけっこう使えそう。urlbookmark.inc.phpのplugin_urlbookmark_get_title()が参考の一歩目になるか。


[TODO] クエリストリングのreferとpageの違い

ごちゃまぜ Edit

2008/01/29 アドレスを短く Edit

通常のページ閲覧では、URLが「・・・pukiwiki/index.php?ページ名」となる。毎度表示されるindex.phpの部分を無くす方法が用意されていて、 pukiwiki.ini.phpの次の行のコメントを外すだけでできる。

// Shorten $script: Cut its file name (default: not cut)
$script_directory_index = 'index.php';

ただし、webサーバ側で、ファイル名を省略したURLに対して、index.phpが呼ばれるような設定になっていないとダメ(サーバがApacheならば、DirectoryIndexで検索を)。

変更しても、以前のURLも受け付けてくれるのでリンク切れの問題は起きない。URLは短いほうがよいと思ってるので、デフォルトになっていても構わないです。

2008/04/27 Joomla!に浮気してみて Edit

ページの分割が楽そう。pukiwikiだと、ページが大きくなると、別ページ作成だから。そして、ページ名の最後に1,2,...をつけたり、lsプラグインなどで上手く並んで欲しいので、1.ファイル名、2.ファイル名...にしてみたり。

しかし、Joomlaは現段階ではやめる。重くて使いにくい。特にjavascriptのところ。Operaだと少し軽めか。将来のためにウォッチだけは続ける。

ということで、pukiwikiを使ったまま、どうにか不満点を解消しなくてはいけない。 今必要だと思っているのは、

  • ページ更新日時だけではなく、ページ作成日時の表示
  • clendar_viewerプラグインで(includeプラグインでも)、「続きを読む」のように途中で切れるようにする

など、か。

2008/05/19 ページの読み取り認証 Edit

WordPressに浮気してみて、WordPressにある良さそうな昨日を実装したいという状況で、「未公開」というページの状態を実装したい。

今は、ページ名で、読み取り制限を掛けている。下書きの状態では、ページ名に特定のキーワードを入れて、そのキーワードが含まれるページは閲覧できないようにしてある。ところが、ページ名というのは、リンク名にもなる。このため、下書きのページ同士のリンクがあると、清書が終わって公開するときにリンク名を修正しなくてはいけない。

なので、ページの内容で制限をかける方法をためしてみたが、コメントを別ページに書き込む設定にしていたりと、そのままでは対応できないものがある(そのままではコメントページは見れる状態になってしまう)。簡単にはいかないものだ。

検索をかけると、ページ名とページの内容の両方で制限を書ける方法がpwiki:質問箱3/590に書いてある。PukiWiki Plus!ベースでもできるか調べる必要あり。

2008/05/23 SafeMode Edit

ページのソースを見せたくない場合(バックアップファイルも含めて)、SafeModeへの設定が有効。Plus!の場合、upkさんのこのページを読んで、ReadOnlyよりも緩い禁止だと思うと理解しやすい。

設定のレベルは、強制モード(1)にしてしまうと、httpアクセスではまったく見れなくなってしまう。管理もhttpでやるなら、2~4に設定かな。

pcommentを使っている場合は、PKWK_CRETE_PAGEは無効にしておかないと書き込めない。代わりにedit_authをつかっておけばいいかと。

2008/05/23 non_list Edit

pukiwiki.ini.php の$non_listに、特定のページ名を加えておけば、ページ一覧で表示されなくなる。その下の、$serch_non_listをゼロにしておけば、検索もされなくなる。

セミコロンで始まるページや、MenuBarに関するページなど、管理用のページを$non_listに設定しています。検索でも出てこなくしていますが、管理者としては、見えた方がページにたどり着きやすい。(改造は大変なので)妥協案として、管理用に用意したページに、upkさん作成の$non_listの対象ページを一覧するプラグインを使わせていただいています。

階層の子ページを一覧する#lsプラグインなんかは、non_listに対応しておらず、表示対象としてしまう。sonotsさん作成の#lsxプラグインなど、対応したプラグインの導入が必要か。

2008/05/25 Plus! ajaxのプレビュー Edit

div#realview の幅をスキンの ページが表示される$body部分の幅と同じにしておくと、プレビューで改行位置まで正確に見れる(もちろん、そのブラウザでなら、というだけではあるが)。

2008/06/19 Edit

Firefox3のテストをしていると、Firefoxとは関係ないのだがいくつか気になる点があるので修正する。


ページ冒頭に以下の警告がでたりでなかったり。Operaでもたまに発生する。IEでも発生したことがあったような、なかったような…

Warning: putenv() [function.putenv]: Safe Mode warning: Cannot set environment variable 'LC_ALL' - it's not in the allowed list in /*(INSTALL DIR)*/lib/init.php on line 64

検索をすると、「pwikiplus:質問箱/275」が出てくる。lib/init.phpで手修正した。今のところ警告は出ていない。

レンタルサーバがXREAの場合に関する記述が
http://www.luntf.com/
にあり。


コメント欄が本文にめり込んでいくのを防ぐため、コメント欄のdiv要素にclear:bothを追加。

2009/03/23 rules.ini.phpについて Edit

本文に特定の文字(列)があったら置き換えるような方法が用意されている。

  • ソース保存時に置換 $str_rules
    • ソースが置換されてしまう
  • 閲覧時に置換 $datetime_rules
    • 現在の時刻を表示するような使い方になっている
  • 閲覧時に置換 $filter_rules
    • Pukiwiki Plus!のみのもの
    • includeプラグインなど、本文を他のプラグインで使用するときに、存在するとまずい表記などを消すために使われている

そして、コード修正まですれば、Sonots'さんの改造 convwiki_rules もある。
http://lsx.sourceforge.jp/?Hack%2Fconvwiki_rules
wiki記法を拡張できるイメージ

メモ Edit

自前でデータベースから拾ってきたデータを表にして表示するプラグインを書いていたが、wiki記法で書いた表にconvert_html()していると、むちゃくちゃ遅い。自分でhtmlを吐き出すようにすると、かなり高速化できる。もちろん、convert_html()が高速なら、やりたくないんだけどね。

2010/08/16 キャッシュに関して Edit

余りにも遅いところがあるので、キャッシュしたくなる場合に関する話題。標準機能として、ページ間のリンクは、.rel/.refファイルに記録されている。

キャッシュ変更が必要になると思われる場合は、簡単に考えて、

  1. ページ内容が変更されたとき
  2. ページが削除されたとき
  3. ページ名が変更になったとき

ページの削除は、文字なしのページに変更した、と考えると、ページ内容の変更に含まれる。実際、plugin/edit.inc.phpの中では、ページ削除の場合も変更の場合も、同じpage_write()を呼び出している。ただし、文字無しのページとなった場合は、wiki/フォルダのページ内容を保持したファイルは削除される特別処理になっていて、page_write()から呼び出されるfile_write()の中で処理が分岐している。ただ、edit.inc.phpの中でも少し分岐があり、2箇所でpage_write()が呼び出されている。



コメント

適当に書いて頂いて構いません。スパム対策があるので、書き込めない場合があります。また、ボタンを押した後にしばらく時間がかかります。

新規コメント(ラジオボタンで親コメント選択可)
お名前
  • NNbAXwxNlWLzVLKY -- igrurewe 2014-05-16 (金) 20:27:52