############################################################################### # #

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;