recent,popular等で長いページ名を見やすく†
- ページ: BugTrack
- 投稿者: Lick
- 優先順位: 低
- 状態: 提案
- カテゴリー: プラグイン
- 投稿日: 2004-09-10 (金) 09:50:19
- バージョン:
メッセージ†
階層が深くなると表示されるファイル名が長くなるのでそれだけでmenuが見づらくなってしまいます。
一つ一つ対象外にしていけばいいのですが量が多いとそれもままなりません。
そこで、一定階層以下の物はrecentなどの対象に含めないように短縮表記を行うようにしてはどうでしょうか。
自分で短縮表示したくなったので、本件の改造をしてみました。 (2007-06-21 ぃぉぃぉ)
Win2k、WinXP + anhttpd1.40p + php5.2.3にて確認
#recent()に第二引数を追加し、"short"、"abbreviate"が渡されると短縮表示とする。第二引数が無い場合には、従来通りの表示とする。
"short"†
最後の/より後のみ表示する。/がない場合は全部。
"abbreviate"†
深さが3以上の場合は
最初/.../おわり
という表示をする。文字列の長さは見ていない。深さが2以下の場合はそのまま表示する。
改造内容†
引数部†
- usage
20c20
< define('PLUGIN_RECENT_USAGE', '#recent(number-to-show)');
---
> define('PLUGIN_RECENT_USAGE', '#recent(number-to-show[, short | abbreviate])');
- format check
33c33
< if (! is_numeric($args[0]) || isset($args[1])) {
---
> if (! is_numeric($args[0]) || isset($args[2])) {
表示部†
- 第二引数が'short'の場合、最後の/より後ろのみを表示する。(ポップアップ表示ではフルでページ名が表示される)
- 第二引数が'abbreviate'の場合、最初の/以前 + ... + 最後の/以降を表示する。/が一個以下なら全て表示する。
71c71,92
< if($page == $vars['page']) {
---
> switch(isset($args[1]) ? $args[1] : '')
> {
> case 'short':
> $strtmp = explode("/", $s_page);
> $disp_pagename = array_pop($strtmp);
> break;
> case 'abbreviate':
> $strtmp = explode("/", $s_page);
> $depth = count($strtmp);
> if($depth >= 3)
> {
> $disp_pagename = $strtmp[0] . '/.../' . $strtmp[$depth - 1];
> }
> else
> {
> $disp_pagename = $s_page;
> }
> break;
> default:
> $disp_pagename = $s_page;
> }
> if($page === $vars['page']) {
73c94
< $items .= ' <li>' . $s_page . '</li>' . "\n";
---
> $items .= ' <li>' . $disp_pagename . '</li>' . "\n";
78c99
< ' title="' . $s_page . $passage . '">' . $s_page . '</a></li>' . "\n";
---
> ' title="' . $s_page . $passage . '">' . $disp_pagename . '</a></li>' . "\n";
コメント†
- こんにちは。コメントありがとうございます :) 階層の概念をベースにしてPukiWikiを構築している方向けにはそれで良いと思うのですが、そうしない事もできるので(そもそも階層の概念は擬似的なものなので)、標準機能に含めてもデフォルトでONにするのはちょっと難しいですね。でも簡単にそうできたっていいわけですから、パッチは下さい :) -- henoheno
- 提案の論点は「ページ名が長い場合にMenuBarに表示させたrecentが見づらくなる」であるという認識で。短いページ名のもの以外recentに出さないという方向性以外にも、ページ名を省略して表示するという手も考えられるのではないでしょうか。例えばHoge/Fuga/Hanya なら、Hanyaしか表示しないとか、Hoge/.../Hanya の様にページ名を省略して表示するとか。 -- にぶんのに
- 短縮形というのも素敵なアイデアですね。URLの表記も ttp:example.com/.../fuga.php?foo=bar の様に短縮してくれると良いなぁ、と以前から思っています。 -- henoheno
- 短縮表記ですか。そうしてもいいですね。そもそも対象に含めないのはちょっと・・・と自分でも思っていたところですから。 -- Lick
- 短縮表記に関してはls3プラグインなんかが参考になったりするかもしれない。 --
- むむぅ、あれみたいに階層名をばっさり切ってしまうと困るかもしれませんね。 --
- 短縮する部分は、次のように正規表現の方がソースはすっきりするのですが、実行時間を比較すると正規表現(preg_replace)を使用した方が数倍遅かったので上のようにしました。(Win2k、WinXPのPHP 5.2.3で確認) -- ぃぉぃぉ
- 'short' : $disp_pagename = preg_replace("#.*/(.*)#", "$1", $s_page);
- 'abbreviate' : $disp_pagename = preg_replace("#(.*?/).*(/.*?)#", "$1...$2", $s_page);
- いくつかの問題点をあげます。 --
- isset($args[1]) をしていないので、第二引数を省略した時、switch($args[1]) のところで、$args[1] が存在しないというエラーが表示される*1。
- こちらの環境(PHP5.2.3)ではエラーが出てくれないんですけど、PHPのバージョンとか関係あるのかな?php.iniに
error_reporting = E_ALL
って設定はしてあるんですけど。 -- ぃぉぃぉ
- あ~、こっちの環境(PHP 4.3.11)では出たんですけどね~。それとも、他の設定の違い?って、しまった!!
E_ALL にしたのは、cvs:index.phpです。こっちのphp.ini のerror_reporting はデフォのままでした。
設定できる場所が複数あるのに、どこを変えたかを書き忘れてました。
おわびと言えるほどではないですが、# contents を追記しておきました。 --
- そんなところに設定があったのですね。php.iniの設定が上書きされていたってことか...。気付いていませんでした。index.phpのerror_reportingをE_ALLにしたら、Warningでました。失礼しました。
全ての環境で問題なく動くことは理想的だと思うので、ご指摘助かります。php入れ替えてまで動作確認する手間はなかなかとれませんので。とりあえず、動作確認した環境は書いておくべきでした。
#contents追記ありがとうございます。 -- ぃぉぃぉ
- if($depth >= 2) としているので、配列が2個(/が1個)の時にも省略記号が挿入されてしまう。
- お恥ずかしい^^; ご指摘の二つ、修正しました。ご指摘、ご確認ありがとうございます。 -- ぃぉぃぉ