############################################################################### # #
bbs2プラグインから投稿された記事の一覧を表示します。
#
# {{bbs2list 掲示板の名前,表示件数}}
#
# # 表示件数を省略すると10件ずつ表示されます。 # また、オプションで各記事のタイトルのみ表示することや、 # 更新順に表示することもできます。 #
#
# {{bbs2list 掲示板の名前,表示件数,title}}
#
# # この場合も表示件数を省略することができます。省略すると10件ずつ表示します。 #
#
# {{bbs2list 掲示板の名前,title}}
#
# # recentは、記事を更新順に表示します。(スレッド・フロート形式) # titleとrecentはどちらを先に指定しても良いです。 # この2つのオプションはそれぞれ独立に作用します。 #
#
# {{bbs2list 掲示板の名前,表示件数,recent,title}}
# {{bbs2list 掲示板の名前,title,recent}}
#
#
###############################################################################
package plugin::bbs::BBS2List;
use strict;
#==============================================================================
# コンストラクタ
#==============================================================================
sub new {
my $class = shift;
my $self = {};
return bless $self,$class;
}
#==============================================================================
# 記事の一覧を作成
#==============================================================================
sub paragraph {
my $self = shift;
my $wiki = shift;
my $cgi = $wiki->get_CGI();
my $name = shift;
# 引数のチェック
if($name eq ""){
return &Util::paragraph_error("掲示板の名前が指定されていません。");
}
# 2番目の引数が数字だった場合はそれを表示件数にする。
my $once = &Util::trim($_[0]);
$once = &Util::check_numeric($once) ? $once : 10;
# 残りのオプションを解析
my %option;
undef %option;
$option{lc &Util::trim($_)} = 1 foreach @_;
my $title = exists $option{'title'} ? 1 : 0;
my $recent = exists $option{'recent'} ? 1 : 0;
# 一覧を取得してWiki形式の文字列を組み立てる
my $i = 0;
my $buf = "";
my $page = $cgi->param("page");
my $cnt = $cgi->param("cnt");
if($cnt eq ""){ $cnt = 0; };
my $ref_list = $self->_get_content_list($wiki,$name,$title,$recent);
foreach my $item (@$ref_list){
if($i >= $cnt*$once){
if($title){
$buf .= "*".$item->{name}."\n";
} else {
$buf .= "{{include ".$item->{name}."}}\n";
}
}
$i++;
last if($i/$once == $cnt+1);
}
# ページ処理用のリンクを作成
$buf .= "\n[ ";
my $pagecnt = 1;
for($i=0;$i<=$#$ref_list;$i=$i+$once){
if($cnt==$pagecnt-1){
$buf .= $pagecnt." ";
} else {
$buf .= "[$pagecnt|".$wiki->config('script_name')."?page=".&Util::url_encode($page).
"&cnt=".($pagecnt-1)."] ";
}
$pagecnt++;
}
$buf .= "]\n";
return $buf;
}
#==============================================================================
# 記事の一覧を取得
#==============================================================================
sub _get_content_list {
my $self = shift;
my $wiki = shift;
my $name = shift;
my $title = shift;
my $recent = shift;
my @list = ();
my $qname = quotemeta($name);
foreach my $pagename ($wiki->get_page_list({-permit=>'show'})){
if($pagename =~ /^BBS-$qname\/([0-9]+)$/){
my $id = $1;
if($title){
my $content = $wiki->get_page($pagename);
if($content =~ /^!!(.*)$/m){
push(@list,{name=>$1,id=>$id});
}
} else {
push(@list,{name=>$pagename,id=>$id});
}
}
}
if($recent){
# 各スレッドの更新日時を取得
foreach (@list) {
$_->{last_modified} = $wiki->get_last_modified2("BBS-$name/$_->{id}");
}
# 更新日時(新着順)にソート
@list = sort { $b->{last_modified} <=> $a->{last_modified} } @list;
} else {
# recentの指定がないときはid(スレッド立てた順番)の降順
@list = sort { $b->{id} <=> $a->{id} } @list;
}
return \@list;
}
1;