プラグイン使用方法/本家より/lsx の変更点


プラグイン本家ページがなくなったので魚拓
出典:ttp://pukiwiki.sonots.com/?Plugin/lsx.inc.php
ページをリストアップするプラグイン ls.inc.php の拡張
Table of Contents
説明
標準プラグイン ls2 との違い
競合相手
使い方
書式
prefix=接頭辞 or 接頭辞
num=数字
depth=数字
hierarchy=bool
tree=leaf|dir
sort=name | date | reading | popular
popular=today | yesterday | recent | total
reverse=bool
non_list=bool
except=正規表現
filter=正規表現
date=bool
new=bool
contents=(オプション)
include=(オプション)
linkstr=relative | pagename | basename | title | firsthead
link=page | anchor | off
tag=文字列
newpage=on | off
next=bool
動作例(仕様)
FAQ
#ls または #ls2 を一度に置き換えたい
ひょっとして recent プラグイン変わりに使える?
MenuBar に設置しても良い?
popular プラグインでも同じような機能を使いたい
sort の順序を指定したい
旧 ls2_1.inc.phpからの変更点
ダウンロード
技術的詳細
リストHTMLについて
ソートについて
関連
説明 
ページをリストアップするプラグイン ls.inc.php の拡張です。ls2.inc.php の拡張でもありそれの拡張であった旧 ls2_1.inc.php の拡張でもあります。

ページ階層化機能 を使用している PukiWiki で便利です。

標準プラグイン ls2 との違い 
相対パス的表示。
階層的リスト表示。
階層指定。
表示件数指定
pukiwiki.ini.php で設定する $non_list の利用。
正規表現によるページのフィルタ
正規表現による除外ページ指定
更新日時表示
New 表示
更新日時によるソート
link オプション消去
複数ページ include
などなど

競合相手 
org:自作プラグイン/lls.inc.php - 横並びもできる階層型ページ一覧表示プラグイン
横並びは却下しました。横並びにしたい場合は CSS を頑張って編集してください。
org:自作プラグイン/treepagelist.inc.php - エクスプローラのようなツリーを実現します。
javascript (消失)
org:自作プラグイン/ls3.inc.php - お手軽な階層一覧表示
ページ名による階層表示ではなく、ページの先頭にリンクをおき、リンクされたページを子ページと判断するらしい。
org:自作プラグイン/listing.inc.php - 多機能ページ一覧表示
ページ名の一覧そのものよりも付加情報に着目しているように見受けられる。
org:自作プラグイン/pagetree.inc.php - JavaScript を使わないツリーメニュー
MenuBar での設置目的。このサイトでも使用している。
dev:BugTrack/745 - 他
使い方
書式 
#lsx([オプション])
#lsx(接頭辞[,オプション])
#lsx([オプション])
#lsx(接頭辞[,オプション])
option=bool なオプションは共通して、 option, option=true, option=on でそのオプションが有効になり、option=false, option=off で無効になります。

prefix=接頭辞 or 接頭辞 
リストするページ名の接頭辞。 省略時は カレントページ+"/" が指定されたことになる。また / を指定した場合はすべてのページにマッチする。

相対指定(例えば Plugin ページにおける ./lsx.inc.php/ == Plugin/lsx.inc.php/)も可能。

備考:どのオプションにもマッチしない文字列が指定された場合、接頭辞と認識されます。明示的に指定したい場合は prefix=接頭辞 と指定してください。#ls2 互換用。

num=数字 
表示件数指定。正数は前からN件目、負数は後ろからN件目の意味。

num=1:10 で先頭1件目から10件目までの意味。num=-10:-1 で後ろ10件目から後ろ1件目までの意味。num=2: で先頭2件目から最後までの意味。 num=5+2 で先頭5件目から、そこから2件先まで(5,6,7)の意味。

depth=数字 
下位階層指定。depth=1 が直下、depth=2 がそのまた下のイメージ。数字の指定は num と同じ書式。

hierarchy=bool 
階層的リスト表示。デフォルトで有効。

tree=leaf|dir 
末端ページ(leaf)、またはその逆(dir)のようなものを表示する。デフォルトは単純に無効。tree=dir は DOS コマンドの tree のようなニュアンス。

備考:ようなものなので、ページ名を意識して付けていない場合効果は薄いでしょう。

sort=name | date | reading | popular 
ソートの方法。

name - ページ名によるソート。デフォルト。
date - 更新日付(上が最新)によるソート。hierarchy は強制的に off になる。
reading - 「読み」によるソート。「読み」の設定は #c596f56a 参照
popular - 人気順によるソート。どの人気順を利用するかは popular オプションを使用する。
popular=today | yesterday | recent | total 
sort=popular のオプション。

today: 今日の人気
yesterday: 昨日の人気
recent: 最近(今日+昨日)の人気
total: トータルでの人気
reverse=bool 
逆順にソートする

non_list=bool 
pukiwiki.ini.php で定義される $non_list によるリスト排除。デフォルトで有効。

注意 この機能により、ページ名が : で始まるような(デフォルトの $non_list 設定)ページで #lsx と記述しても何も表示されません。non_list=off オプションを使用してください。

except=正規表現 
リストしないページを正規表現にて指定。prefixを取り除いたページ名で判定。

ヒント: マッチングには mbstring が利用可能な場合 mb_ereg をそうでない場合 ereg を使用します。 except=Test|sample → Test または sample を含むページを除く。

filter=正規表現 
ページパターンをさらに正規表現で限定する。prefixを取り除いたページ名で判定。 prefix=/ (全ての意味) にしてこちらだけを使うのもあり。

ヒント: マッチングには mbstring が利用可能な場合 mb_ereg をそうでない場合 ereg を使用します。

date=bool 
更新日付をページ名の横に表示。

new=bool 
更新日付に対してNew!も表示。

備考:設定を再利用するため new プラグインを使用しています。

contents=(オプション) 
ページ内の見出しもリストする。

備考:内部で contentsx プラグインを使用しているので、詳しいオプションは contentsx.inc.php を参照してください。オプションを複数指定する場合は contents=(num=1,depth=1) のようにできます。

include=(オプション) 
ページを include する。

備考:この場合ページリストは中止され、include だけされます。
備考:内部で includex プラグインを使用しています。詳しいオプションは includex.inc.php を参照してください。オプションを複数指定する場合は include=(num=1:10,titlestr=off) のようにできます

linkstr=relative | pagename | basename | title | firsthead 
リンク文字列を制御できます。

relative | relname - 相対パス的文字列表示(デフォルト)。
pagename | name | page | absolute - 絶対パス的文字列表示(ls2の動作)。
basename | base - ページ階層化機能でのベース名部分、例:Note/Plugin/lsx.inc.php -> lsx.inc.php。
title - 各ページの TITLE: 行で指定された文字列。
firsthead | headline - 各ページの第一見出しで指定された文字列
備考:title と headline は contentsx.inc.php を使用します。インストールしておいてください。TITLE: とは PukiWiki Plus! において HTML のタイトル<title></title> を設定する書式です。

link=page | anchor | off 
リンク形式。

page - 通常通りページへのリンク
anchor - #includex で取り込んだページタイトルへのアンカー。#lsx(include) 用。
off - リンクしない。
tag=文字列 
tag.inc.php で付けたタグを指定。

tag=タグ1^タグ2 とすることで、共通ページを(積集合 ∩ のイメージ)、tag=タグ1-タグ2 とすることで差ページ(差集合のイメージ)をリスト

備考:hierarchy, prefix は強制的に off になります。
備考: lsx のタグ機能はおまけのようなもので、過去のなごりに過ぎません。taglist.inc.php を使用してください。

newpage=on | off 
on で新規作成ページのみを、off で新規作成ページ以外をリスト。デフォルトでは単純にスルー。

備考:backup ファイルが作成されているかどうかで新規かどうかを判断しています。

next=bool 
ベータ機能

num オプションで件数を制限した場合に、次のN件、前のN件を表示するためのリンクを表示する

動作例(仕様) 
以下のページ群があったとする。

test
test/a
test/a/aa
test/a/aa/aaa
test/a/bb/bbb
test/c/cc/ccc
test というページで記述したものとする。[] はリンクの意。

#lsx
[a]
[aa]
[aaa]
bb
[bbb]
c
cc
[ccc]
#lsx(prefix=test/a/)
[aa]
[aaa]
bb
[bbb]
#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)
[a]
[aa]
bb
c
cc
#lsx(depth=1)
[a]
#lsx(depth=1:2)
[a]
[aa]
#lsx(depth=2+1)
a (←注目)
[aa]
[aaa]
bb
[bbb]
c
cc
[ccc]
#lsx(num=1:2)
[a]
[aa]
#lsx(num=-1:-2)
a
bb
[bbb]
c
cc
[ccc]
#lsx(num=(1:2,4))
[a]
[aa]
bb
[bbb]
#lsx(except=cc|aaa$)
[a]
[aa]
bb
[bbb]
#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))
[a]
見出し
[aa]
見出し
#lsx(num=1:2,include)
#includex(a)
#includex(a/aa)
の結果が出力される。

FAQ 
#ls または #ls2 を一度に置き換えたい 
プラグインの置き換え用プラグインとして replaceplugin.inc.php を作成してありますので利用してみてください。

ひょっとして recent プラグイン変わりに使える? 
**recent(10) [#xdee1fa7]
#lsx(prefix=/,sort=date,num=1:10)
のように使用すれば同じような動作にはなります。しかし recent プラグインはキャッシュ機構を持っていて動作が高速なのと特別な表示インターフェースを持っているので recent プラグインを使用することをおすめします。

MenuBar に設置しても良い? 
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 を作ってあります。 popularx.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/マニュアル/一覧表示の五十音順分類 を参照してください。:config/PageReading の設定はかき消されることはない(はず)です。

旧 ls2_1.inc.phpからの変更点 
追加

tree=leaf|dir
newpage
tag
next
linkstr リスト時の表示形式指定
link リスト時にリンクを貼るか否か
変更

#ls2_1(パターン,オプション) -> #lsx(prefix=パターン,オプション) or #lsx(パターン,オプション)
#ls2_1(,オプション) -> #lsx(オプション) でオーケー。
相対指定が可能
relative -> linkstr=relative (デフォルト)
link アクション型へのリンクを作る(削除) => link リスト時にリンクを貼るか否か(追加)
デフォルトで 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 のオプション)
プラグイン contentsx を呼ぶ
include (#include しているページ名もリスト) -> include=(include のオプション) (#include する)
ls2_1 の include は contents=(include,depth=0) で見た目は同じになるかもしれない(見出しも探すので処理は重い)
実質消去され、各ページを include するオプションができたと思ってもらいたい
compact 消去
hierarchy が上階層のページを補完するようになったので用なし。
display 消去
inline 却下
これ1つのために inline_before, after 等のオプションとインライン型プラグインサポートと、もう1つ表示エンジンを持たなければならない
インライン型プラグイン消去
filter, except
ページ名全体ではなく、prefix を除いたページ名で評価
変更なし

non_list
reverse
date
new
ダウンロード 
v2.0 系統版

Sonots PukiWiki Plugin Collection に含まれています。

lsx-vX.XX.zip をダウンロードし、plugin ディレクトリ以下に展開してください。
同時梱包されているその他のプラグインは上述ページ内の「Release Notes」リンクから参照できます。

旧 v1.0 系統版

リビジョン	日付	マニュアル
rev310 
lsx.inc.php 
contentsx.inc.php 
includex.inc.php	06/08/2007	Manual/Plugin/lsx.inc.php/rev310 
Manual/Plugin/contentsx.inc.php/rev310 
Manual/Plugin/includex.inc.php/rev310 
技術的詳細 
リスト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 本体のほうでもそこは妥協してほしいと思っています。

ソートについて 
/ はページ階層を意味する特別な文字列なので、特別な意味を持たせたソートをする必要があります。単純に sort すると

Hoge
Hoge/ほげ
Hogeほげ
となってほしい所が(上位階層のページ直後に、子ページが来て欲しい)、

Hoge
Hogeほげ
Hoge/ほげ
のようにソートされることがあります。マルチバイト文字列を含む場合、特に顕著です(具体例は失念。「ほげ」は例どおりにいかないが。)

sort 関数の場合は、以下のようにすることで簡単に対応可能です。

$array = str_replace('/', "\0", $array);
sort($array, SORT_STRING);
$array = str_replace("\0", '/', $array);
しかし、natcasesort の場合は、これではうまくいかなかったので、多少面倒くさい処理をして対応しました。 sonots.class.php#natcasesort_filenames で可能です。肝は explode('/', $filename) してからの sonots.class.php#r_cmp 関数です。

関連 
dev:PukiWiki/1.4/ちょっと便利に/更新日順に表示できるls2プラグイン -- 更新日順に表示できるls2 プラグイン(実現)
org:欲しいプラグイン/172 -- ls拡張 階層下の特定パターンを列挙(実現)
org:欲しいプラグイン/176 -- 更新状況で並び替え(ソート)(実現)
org:続・質問箱/318 -- 見出しオプションで見出し1だけ(実現)
org:続・質問箱/462 -- ls2使用時の下位層ページへのリンク表示「○○○/×××」の「○○○/」の部分を消すには?(実現)
org:続・質問箱/471 - -見出しオプションで見出し一覧の表示件数を制限するには?(実現)
org:続・質問箱/603 -- 複数ページを代表して更新履歴を表示させる(実現)
dev:morikawa -- ひとつ下の階層の一覧だけ表示する ls3 プラグイン(実現)
org:質問箱/63 -- 階層図出来ませんかね?(実現)
org:PukiWiki/mbstring無しのPHPでの動作 - レンタルサーバなどで mbstring がサポートされていない場合は jcode.phpで代用するという手もあります。