新規作成 | 管理 | 差分 | 検索 | FrontPage | ページ一覧 | 更新履歴 | RSS

PlugIn/机上のソース - by たろう

管理

by たろう

もともとは机上で考えたソースをメモ代わりに記録しておいたページだったんですが、自宅マシンにも会社マシン(ぉぃ)にも実験環境を作ったので、作成予定のアイディアリストの場にします。-たろう

#あとはリナザウ内だな(笑)>plugin実験環境

あ、昔から「名前付け」が苦手な人間なので、そのplugin名は…と思ったらつっこんでください。あと、内容の突っ込みも歓迎

とりあえず、PlugIn/新作投稿に投稿済み

kobitoシステム

管理
さすがにPlugIn/新作投稿に投稿できないかも…

$plugin->def("kobito",
  "kobitoシステム(偽)",
  sub {
    return qq(<div class="kobito"><IMG alt=kobito src="kobito.gif">), @_, qq(</div>);
  }
);

##(kobito てすとデス)

アラヤダ。失礼シチャウワ。ナンデ新作ニ投稿デキナイノヨ。

ジャア、トウロクシテクダサイ

CSS 追加ダケデヤッテミマシタ。アッ。ドコカデ見たタ CSS ダゾ!?

CSSニ画像指定ガデキルナンテシラナカッタンダモン…

背景画像トシテ no-repeat デ 指定スルノサ

lambdaノジャクテンハッケン。せりふニすぺーすヲイレラレナイ‥‥‥

「なぞノ小動物」トハ失礼ナ!!アタシタチハ働キ者ノ小人ナノヨ。プンスカプン。

epoch?

管理
PlugIn/date-stampの逆っていうのでしょうか…

引数の日付をepochに変換する

set-cookie

管理
自分のとこにあった古いネタを見て、これpluginで簡単にできそうかな?…と思ってめも

(set-cookie a $a)

2003-07-23 (Wed) 16:05:40 (SHIMADA) : Cookieのセットって、HTTPヘッダになにか出力するんでしたっけ? プラグインの評価をヘッダ出力のタイミングにあわせるとか、いろいろ調整する必要がありますね。

そうでした…直接CookieにSetは難しいですね… ということで、似たようなことができるように実験場でPersonalDB?を用意して、ごりごりすることにしました…

get-cookie

管理
(get-cookie a)

password

管理
パスワードFormに正しいパスワードを入力すると、Cookieに値を入れる

これで隠しページなのができます…当然、includeでは見えてしまうのですが(笑)

includeするとpluginは非表示になるとかなら使えるかな?

古いやつ

管理

from-to

管理
(numbering 30) 1から指定した数字までのリストを出力

SHIMADA案:

(from-to 0 5) => 0 1 2 3 4 5

repeat-times

管理
指定した個数分同じ文字列のリストを出力

(repeat-times 3 abc)

abc abc abc

と出力

SHIMADA案:

(repeat-times hoge 3) => hoge hoge hoge

たろう改案:

(repeat-times 3 hoge abc test) => hoge abc test hoge abc test hoge abc test

search-page

管理
(serach-page foo (pages)) 検索文字列fooを含むページ名のリストを出力

とりあえずしくだいってことで。

単に grep でオッケーじゃないかな。--SHIMADA

あれ?grepってリストの中から検索文字列にマッチングした要素のみを取り出すものと思っていました

(grep 'test' 'abc' 'abctest' 'testabc' atestbc')は('abctest' 'testabc' atestbc')になると…

search-pageはページの中に検索文字列が含まれているページ名を…あ、説明文がおかしいんだ!!

「内容に検索文字列fooを含むページのリストを出力」かな?

search-paragraph

管理

read-by-part

管理
(read-by-part PlugIn 3):(read PlugIn#i3)と同じ

$plugin->def("read-by-part",
 "受け取ったパラグラフ名の内容を文字列で返す",
  sub {
    my $page = shift;
    my $id = shift;
    return "" unless $page;
    return "" if $page eq $form{mypage};
    return "" if $page eq 'RecentChanges';
    return "" unless $id;
    my @parts = map { 
                  s/^(\*+)/'!' x length($1)/mge;
                  CGI::escapeHTML($_);
                 } read_by_part($page);
    return $parts[$id];
  }
);

(read ページ#iN)で出力できるのでちょいと仕様を変えようかなと思っております。

(read-by-part ページ) => ページの第1パラグラフ ページの第2パラグラフ ページの第3パラグラフ …って感じに

(read ページ#iN)と同じように出力するには
(head 1 (tail N (read-by-part ページ)))
と書く

last-days

管理

days->day-of-week

管理
(たろう):2003-06-29 (Sun) 08:55:37公開

source-paragraph

管理
(source-paragraph PlugIn#i3)

$plugin->def("source-paragraph",
 "受け取ったパラグラフ名の内容をリストで返す",
  sub {
    my @targets = @_;
    return "" unless @targets;
    my @ret;
    foreach my $target (@targets) {
      (my $page,my $id) = split /#i/,$target;
      next if $page eq $form{mypage};
      next if $page eq 'RecentChanges';
      my @parts = map { 
                    s/^(\*+)/'!' x length($1)/mge;
                    CGI::escapeHTML($_);
                   } read_by_part($page);
      @ret = split /\n/,$parts[$id];
      push @ret, "\n\n----\n\n";
    }
    return @ret;
  }
);

COMMENT

管理
(SHIMADA): 最初から行単位にばらしてしまう source / source-paragraph よりも (read ページ) (read ページ#iN) (read-by-part ページ n) で対象をひとかたまりの文字列として読みこんで、必要なら split '\n' でばらす、というやりかたのほうが好みかなあ。

split, substr, sprintf, length, ... Perl の文字列関数はひととおり定義しておいたほうがいいかも。

(たろう):あ、そうかsplitがあればいいのか…結構内部でsplit /\n/,$line;を使っているのに「splitを用意する」という考えが無かった(笑)…僕も、必要にあわせてsplitでばらす方が好きですね

ということで、用意してみた(笑)

read作って気が付いたのですが、sourceって結局join '\n'でつなげちゃうんですよね(笑)

(join '\n' (split '\n' (read ページ)))

なんか笑える。

read

管理
(read PlugIn)

(read PlugIn#i3)

$plugin->def("read",
 "受け取ったページ名・パラグラフ名の内容を文字列で返す",
  sub {
    my @targets = @_;
    return "" unless @targets;
    my @ret;
    foreach my $target (@targets) {
      (my $page,my $id) = split /#i/,$target;
      next if $page eq $form{mypage};
      next if $page eq 'RecentChanges';
      if ($id) {
        my @parts = map { 
                      s/^(\*+)/'!' x length($1)/mge;
                      CGI::escapeHTML($_);
                     } read_by_part($page);
        push @ret,$parts[$id];
      }else{
        my $text = $database{$page};
        $text =~ s/^(\*+)/'!' x length($1)/mge;
        CGI::escapeHTML($text);
        push @ret, $text;
      }
    }
    return @ret;
  }
);

あ、やば。$read_by_partじゃなくてread_by_partだ…ということで、こっそり直す

かな?

(SHIMADA): CGI::escapeHTML() は引数を直接変更しないで新しい文字列を返すだけなので

      }else{
        my $text = $database{$page};
        $text =~ s/^(\*+)/'!' x length($1)/mge;
-       CGI::escapeHTML($text);
-       push @ret, $text;
+       push @ret, CGI::escapeHTML($text);
      }

となります。

mapの中だとうまくいくのは、 escapeHTML()がブロックの中の最後の文なので、 その返した文字列が map の値になるからです。