Practice of Programming

プログラム とか Linuxとかの話題

カテゴリたためるプラグイン


FSWikiでカテゴリが多くなると、見ため大変なんで、カテゴリを畳めるプラグイン
ずっと前に作った奴ですが...。ちょっと、微妙なんで本家にはあげない。

見ためはこんな感じで、"Test" がカテゴリで、"+ Test"の部分をクリックすると、


==============================================


+ Test
==============================================

下記のようになる、イメージ。


==============================================


+ Test
==============================================

で、この開いた、閉じた状態をクッキーに記録するもの。
はてな、普通のファイルのアップロードできないようなので、コードさらしときます。


plugin/category/Install.pm のパッチ

RCS file: /cvsroot/fswiki/fswiki/plugin/category/Install.pm,v
retrieving revision 1.2
diff -u -r1.2 Install.pm
--- Install.pm  4 Aug 2003 15:07:43 -0000       1.2
+++ Install.pm  28 Jul 2006 18:24:37 -0000
@@ -11,7 +11,8 @@
        $wiki->add_paragraph_plugin("category_list","plugin::category::CategoryList","HTML");
        $wiki->add_inline_plugin("category","plugin::category::Category","HTML");
        $wiki->add_handler("CATEGORY","plugin::category::CategoryHandler");
-       
+        $wiki->add_paragraph_plugin("category_list_fold","plugin::category::CategoryListFold","HTML");
+
        # ページの保存時、削除時にキャッシュを更新
        $wiki->add_hook("save_after","plugin::category::CategoryCache");
        $wiki->add_hook("delete"    ,"plugin::category::CategoryCache");


plugin/category/CategoryListFold.pm

###############################################################################
#
# <p>カテゴリの一覧を表示します。カテゴリで折り畳んだ表示にでき、
# 折り畳んだ状態をCookieで保存しています。カテゴリが多いWiki向けです。
# </p>
# <pre>
# {{category_list_fold}}
# </pre>
#
###############################################################################
package plugin::category::CategoryListFold;
use strict;

#==============================================================================
# コンストラクタ
#==============================================================================
sub new {
        my $class = shift;
        my $self = {};
        return bless $self,$class;
}

#==============================================================================
# パラグラフメソッド
#==============================================================================
sub paragraph {
  my $self = shift;
  my $wiki = shift;
  my $cachefile = $wiki->config('log_dir')."/category.cache";
  if(!(-e $cachefile)){
    &plugin::category::CategoryCache::create_cache($wiki);
  }
  my $result = &Util::load_config_hash(undef,$cachefile);
  my %param;
  my @category;
  my @category_name;
  my $cnt;
  foreach my $category (sort keys %$result){
      $cnt++;
      my @pages = map { {PAGE_NAME => $_ } } (sort(split(/\t/, $result->{$category})));
      push @category,
      {
        #  id => $cnt,
          category_name => $category,
          page => \@pages,
      };
      push @category_name, $category;
  }
  $param{category} = \@category;
  my $t = new HTML::Template(filename => $wiki->config('tmpl_dir') . "/" . "category_list_fold.tmpl");
  $t->param(theme_dir => $wiki->config('theme_uri'));
  $t->param(%param);
  # $t->param(category_list => join ", ", map "'$_'", 1 .. $cnt);
  $t->param(category_list => join ", ", map "'$_'", map CGI::escape($_->{category_name}), @category);
  return $t->output;
}

1;

tmpl/category_list_fold.tmpl

<script type="text/javascript" src="<TMPL_VAR NAME="THEME_DIR">/cookies.js"></script>
<script>
function exMenu(tName) {
        tMenu = document.getElementById(tName).style;
        if (tMenu.display == 'none')
                tMenu.display = "block";
        else
                tMenu.display = "none";
}
function exMenu2(tName) {
        tMenu = document.getElementById(tName).style;
                tMenu.display = "block";
}

function exMenu3(tName) {
        tMenu = document.getElementById(tName).style;
        var expire = getExpDate(30, 0, 0);
        if (tMenu.display == 'none'){
                tMenu.display = "block";
                setCookie('category_' + tName, 1, expire);
        }
        else
        {
                tMenu.display = "none";
                deleteCookie('category_' + tName);
        }
}

function extract_category(){
        var category_name = new Array(<TMPL_VAR category_list>);
        var i;
        for (i = 0; category_name[i]; i++){
		tName = category_name[i];
		if (getCookie('category_' + tName) == 1) {
          		document.getElementById(tName).style.display = "block";
          	} else {
		        document.getElementById(tName).style.display = "none";
		}
        }

}

</script>
<TMPL_LOOP CATEGORY>
<div>
    <!-- a href="javascript:exMenu3('<TMPL_VAR NAME="CATEGORY_NAME">');" onMouseClick="javascript:exMenu3('<TMPL_VAR NAME="CATEGORY_NAME">');">+</a -->
    <span onClick="javascript:exMenu3('<TMPL_VAR NAME="CATEGORY_NAME" ESCAPE="URL">');">+ <TMPL_VAR CATEGORY_NAME></span>
</div>
    <ul id="<TMPL_VAR NAME="CATEGORY_NAME" ESCAPE="URL">" style="display:none">
        <TMPL_LOOP PAGE>
        &nbsp;<li><a href="?page=<TMPL_VAR NAME="PAGE_NAME" ESCAPE="URL">"><TMPL_VAR PAGE_NAME></a>
        </TMPL_LOOP>
    </ul>
</TMPL_LOOP>

<script>
extract_category();
</script>

theme/cookies.js

なし

これは、JavaScript & DHTML クックブックのものです。
http://www.oreilly.com/catalog/jvdhtmlckbk/ からダウンロードできます。ただ、ライセンスとか詳しくは知りません。
自分で調べて使ってください。