ページをリストアップするプラグイン ls.inc.php の拡張
説明
ページをリストアップするプラグイン ls.inc.php の拡張です。ls2.inc.php の拡張でもありそれの拡張であった旧 ls2_1.inc.php の拡張でもあります。
標準プラグイン ls2 との違い
- 相対パス的表示。
- 階層的リスト表示。
- 階層指定。
- 表示件数指定
- pukiwiki.ini.php で設定する $non_list の利用。
- 正規表現によるページのフィルタ
- 正規表現による除外ページ指定
- 更新日時表示
- New 表示
- 更新日時によるソート
- link オプション消去
- 複数ページ include
旧 ls2_1.inc.phpからの変更点
- #ls2_1(パターン,オプション) -> #lsx(prefix=パターン,オプション)
- #ls2_1(,オプション) -> #lsx(オプション)
- 相対指定が可能
- relative -> linkstr=relative (デフォルト)
- デフォルトで hierarchy
- datesort -> sort=date
- depth=2-5 -> depth=2:5
- depth=-1:-5 (最後から、最後から5番目まで) が可能に
- depth=-1+5 なども可能
- depth=(1,3,5:9) のように複数指定も可能
- number -> num
- number=10 (10個) ではなく num=1:10 (depth と同じ書式)
- title 系オプション -> contents=(contentsx のオプション)
- include (#include しているページ名もリスト) -> include=(include のオプション) (#include する)
- ls2_1 の include は contents=(include,depth=0) で見た目は同じになるかもしれない(見出しも探すので処理は重い)
- 実質消去され、各ページを include するオプションができたと思ってもらいたい
- compact 消去
- hierarchy が上階層のページを補完するようになったので用なし。
- display 消去
- inline 却下
- これ1つのために inline_before, after 等のオプションとインライン型プラグインサポートと、もう1つ表示エンジンを持たなければならない
- link 消去
- これのためにアクション型プラグインと、もう1つ小さいが表示エンジンを持たなければならないし、そもそも使わない
- アクション型プラグイン消去
- インライン型プラグイン消去
- filter, except
- ページ名全体ではなく、prefix を除いたページ名で評価
- tree=leaf|dir
変更なし
- non_list
- reverse
- date
- new
競合相手
書式
#lsx([オプション])
オプション名=bool なオプションは共通して、 オプション名, オプション名=true, オプション名=on でそのオプションが有効になり、オプション名=false, オプション名=off で無効になります。
- prefix=文字列
- リストするページ名の接頭辞。
省略時はカレントページ+"/"が指定されたことになる。
また / を指定した場合はすべてのページにマッチする。
相対指定(例えば Plugin ページにおける ./lsx.inc.php/ = Plugin/lsx.inc.php/)も可能。
- num=数字
- 表示件数指定。正数は前からN件目、負数は後ろからN件目の意味。
num=1:10 で先頭1件目から10件目までの意味。num=-10:-1 で後ろ10件目から後ろ1件目までの意味。num=2: で先頭2件目から最後までの意味。
num=5+2 で先頭5件目から、そこから2件先まで(5,6,7)の意味。
- tree=leaf|dir
- 末端ページ(leaf)、またはその逆(dir)のようなものを表示する。デフォルトは単純に無効。tree=dir は DOS コマンドの tree のようなニュアンス。
備考:ようなものなので、ページ名を意識して付けていない場合効果は薄いでしょう。
- non_list=bool
- pukiwiki.ini.php で定義される $non_list によるリスト排除。デフォルトで有効。
- except=正規表現
- リストしないページを正規表現にて指定。prefixを取り除いたページ名で判定。
ヒント: マッチングには mbstring が利用可能な場合 mb_ereg をそうでない場合 ereg を使用します。
except=Test|sample → Test または sample を含むページを除く。
- filter=正規表現
- ページパターンをさらに正規表現で限定する。prefixを取り除いたページ名で判定。
prefix=/ (全ての意味) にしてこちらだけを使うのもあり。
ヒント: マッチングには mbstring が利用可能な場合 mb_ereg をそうでない場合 ereg を使用します。
- new=bool
- 更新日付に対してNew!も表示。
備考:設定を再利用するため new プラグインを使用しています。
- contents=(オプション)
- ページ内の見出しもリストする。
備考:内部で contentsx プラグインを使用しているので、詳しいオプションは ../contentsx を参照してください。オプションを複数指定する場合は contents=(num=1,depth=1) のようにできます。contents=(num=1,depth=(1,2)) のように入れ子もできます*1。
- include=(オプション)
- ページを include する
備考:この場合ページリストは中止され、include だけされます。
備考:内部で includex プラグインを使用しています。詳しいオプションは ../includex を参照してください。オプションを複数指定する場合は include=(num=1:10,title=off) のようにできます
- linkstr=relative|absolute|basename|title|headline
- リンク文字列を制御できます。
relative で相対パス的文字列表示(デフォルト)。
absolute で絶対パス的文字列表示(ls2の動作)。
basename でページ階層化機能でのベース名部分、例:Note/Plugin/lsx.inc.php -> lsx.inc.php。
title で各ページの TITLE: 行で指定された文字列。
headline で各ページの第一見出し。
備考:title と headline は ../contentsx を使用します。インストールしておいてください。TITLE: とは PukiWiki Plus! において HTML のタイトル<title></title> を設定する書式です。
- link=page|anchor|off
- リンク形式。link=page は通常通りページへのリンク。link=anchor は #lsx(include) 用。取り込んだページタイトルへのアンカー。link=off はリンクしない。
ベータ機能
- tag=文字列
- /tag.inc.php で付けたタグを指定。tag=タグ1^タグ2 とすることで、共通ページを(積集合 ∩ のイメージ)、tag=タグ1-タグ2 とすることで差ページ(差集合のイメージ)をリスト
備考:hierarchy, prefix は強制的に off になります。ベータ機能です。たぶん将来的には別のプラグインに移送されます。
アルファ機能
- newpage=on|except
- on で新規作成ページのみを、except で新規作成ページ以外をリスト。デフォルトでは単純に無効。
備考:backup ファイルが作成されているかどうかで新規かどうかを判断しています。
- next
- num オプションで件数を制限した場合に、次の5件、前の5件を表示するためのリンクを表示する
動作例
以下のページ群があったとする。
- test
- test/a
- test/a/aa
- test/a/aa/aaa
- test/a/bb/bbb
- test/c/cc/ccc
test というページで記述したものとする。[] はリンクの意。
#lsx
#lsx(prefix=test/)
#lsx(hierarchy=off)
- [a]
- [a/aa]
- [a/aa/aaa]
- [a/bb/bbb]
- [c/cc/ccc]
#lsx(tree=leaf,hierarchy=off)
- [a/aa/aaa]
- [a/bb/bbb]
- [c/cc/ccc]
#lsx(tree=dir)
#lsx(depth=1)
#lsx(depth=1:2)
#lsx(depth=2+1)
#lsx(num=1:2)
#lsx(num=-1:-2)
#lsx(num=(1:2,4))
#lsx(except=cc|aaa$)
#lsx(date)
- [a] 2004-10-10 (日) 23:03:05
- [aa] 2004-11-30 (金) 12:11:43
- [aaa] 2004-03-03 (月) 16:04:05
- bb
- [bbb] 2004-12-26 (水) 23:55:55
- c
- cc
- [ccc] 2004-10-11 (月) 01:02:04
#lsx(sort=date,date,new)
- [a/bb/bbb] 2004-12-26 (水) 23:55:55 New
- [a/aa] 2004-11-30 (金) 12:11:43
- [c/cc/ccc] 2004-10-11 (月) 01:02:04
- [a] 2004-10-10 (日) 23:03:05
- [a/aa/aaa] 2004-03-03 (月) 16:04:05
#lsx(sort=date,new)
- [a/bb/bbb] New
- [a/aa]
- [c/cc/ccc]
- [a]
- [a/aa/aaa]
#lsx(depth=1:2,contents=(num=1))
#lsx(num=1:2,include)
#includex(a)
#includex(a/aa)
の結果が出力される。
FAQ
#ls または #ls2 を一度に置き換えたい
プラグインの置き換え用プラグインとして replaceplugin.inc.php を作成してありますので利用してみてください。
ひょっとして recent プラグイン変わりに使える?
**recent(10)
#lsx(prefix=/,sort=date,num=1:10)
のように使用すれば同じような動作にはなります。しかし recent プラグインはキャッシュ機構を持っていて動作が高速なのと特別な表示インターフェースを持っているので recent プラグインを使用することをおすめします。
ls 系プラグイン全般は実行毎に毎回全てのページ名を処理し直します。
ページが多い場合中々処理が重くなるので MenuBar に設置することはお奨めしません。
それでも MenuBar に設置したい場合は止めはしませんが、私ならば ecache.inc.php プラグインを使用して少しでも PukiWiki の軽量化を狙います。
#ecache(page=MenuBar){{
#lsx(prefix=/,depth=1,tree=dir)
}}
といいつつ、この Wiki では同じく ls 系の revulo:pagetree.inc.php を MenuBar に設置していたりします。ページ数が 100 もないので大丈夫でしょう。
popular プラグインでも同じような機能を使いたい
暫定版ですが、lsx を使用した popular プラグイン拡張 popularx を作ってあります。
もちろん lsx 必須です。
書式
#popularx(total|today|yesterday|recent[,lsx options])
- prefix=/ デフォルト
- hierarchy=off 固定
- num=1:10 デフォルト
- sort 使用不可 (popular 数でソート)
以下のファイルを右クリックから保存し、plugin ディレクトリにおいてください。常に開発版です。
&l(en){What's new};&l(ja){更新履歴};
viewcvs
TIPS: 気にしたことがなかったかもしれませんが、popular 系プラグインも ls 系プラグインと同等の処理時間がかかります。MenuBar に total,today,yesterday と3つ設置すれば3倍かかるかもしれません。上で記述 したように ecache.inc.php プラグインを使用して一時間毎更新にしたりすると良いのかもしれません。
sort の順序を指定したい
「読み」を設定し、sort=reading を指定すると、sort の順序を指定したような動作にすることが可能です。
「読み」は :config/PageReading ページで設定します。例えば
-[[Plugin/lsx.inc.php]] Plugin/00
-[[Plugin/includex.inc.php]] Plugin/01
のように設定すれば、通常の sort=name ではページ名の文字列順にソートするため、
- includex.inc.php
- lsx.inc.php
の順番になるのですが、sort=reading とすると「読み」の文字列順にソートするため、Plugin/00 と Plugin/01 を比べて
- lsx.inc.php
- includex.inc.php
となります。
「読み」の本来の用途は、漢字の読みを設定することによる50音順での sort のサポートです。
kakasi または chasen を用いた漢字の読みカナ自動設定は dev:PukiWiki/1.4/マニュアル/一覧表示の五十音順分類 を参照してください。
技術的詳細
リストHTMLについて
PukiWiki の標準ではリストで無茶なレベル指定(例: 2→1→3→2)がされた場合、最初のレベル2 <li> で
<ul><li style="padding-left:2*16px;margin-left:2*16px">
のような(意味の)HTML が出力されます。その際の 16px というのは default.ini.php で設定されているため、css の編集だけで見た目を変えることができなくなります。
この一見不思議な仕様により、BugTrack や質問箱、2ch のスレや個人のウェブページでたびたび「なぜ default.ini.php で設定されているのか」という同じ質問を見かけます。
しかし、それにも理由があります。その理由は dev:BugTrack2/126 dev:開発日記/2003-03-29 あたりが参考になります。
それが正しいのもわかるのですが、あまりにも不便なため、lsx ではそこは妥協して
<ul><li style="list-type:none"><ul><li>
のような HTML を出力するようにしています。これも XHTML valid です。PukiWiki 本体のほうでもそこは妥協してほしいと思っています。
関連
アイデア
- ページ新規作成、削除時に recent.dat のようにキャッシュを作れれば楽なのだが、無理。デフォルトプラグインがうらやましい。
- 毎回実行時に recent.dat の先頭をチェックして、キャッシュファイルより新しいのがあれば更新。
- non_list 取得できないなぁ。
- 全体で1つ(そこ%8