lsx.inc.php

Top > Plugin > lsx.inc.php
First Edition. 05/16/2006
Last Modified. 12/08/2006
Tag: PukiWiki Plugin

ページをリストアップするプラグイン ls.inc.php の拡張

Table of Contents

説明

ページをリストアップするプラグイン ls.inc.php の拡張です。ls2.inc.php の拡張でもありそれの拡張であった旧 ls2_1.inc.php の拡張でもあります。

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

標準プラグイン ls2 との違い

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

などなど

競合相手

使い方

書式

#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)
#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 ではページ名の文字列順にソートするため、

の順番になるのですが、sort=reading とすると「読み」の文字列順にソートするため、Plugin/00 と Plugin/01 を比べて

となります。

「読み」の本来の用途は、漢字の読みを設定することによる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 系統版

技術的詳細

リスト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 関数です。

関連