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

PlugIn/新作投稿 - プラグインの新作はこちらまで

管理

プラグインの新作はこちらまで

新作(新しいものは上に追加)

管理

収録済み

管理

tag-links/search関連処理改良案[済]

管理
ページが増えれば増えるほど、全文検索処理は時間がかかってしますので(っていうか、Clockworksではそろそろ困ってきました、笑)

ある程度、検索範囲が分かっているならば指定できるようにしてみました。

(tag-links 2003-09-08 Schedule MyPage?)

ScheduleとMyPage?のみ検索範囲になります…範囲を指定していない場合はこれまでと一緒で全ページが対象

PlugIn/tag-links PlugIn/search-page PlugIn/search-paragraph の各ページに転記しました。- rica 2003-09-10 (Wed) 10:12:19

joke [一応済]

管理
こちらのまね -- たろう2003-08-01 (Fri) 16:01:20

$plugin->def("joke",
  "流れる…(非推奨タグ仕様)",
  sub {
    return "<marquee>@_</marquee>";
  }
);

バックスラッシュについて [済]

管理

S式の中ではシングルクォート( ' )の中で \n で改行を使えますが、バックスラッシュ自身( \ )を表現できていませんでした。下記の修正でバックスラッシュを使った正規表現 '\\d' などが使えるようになります。

TinyReader?.pm Line 64-74

   elsif (/\G\s*\'((?:[^\'\\]|\\.)*)\'/gcs) {
       my $str = $1;

       # Unescape
       $str =~ s/\\\n//g;    # escaped newlines disappear
       $str =~ s/\\'/'/g;    # unescape quote
       $str =~ s/\\n/\n/g;   # unescape newline
+      $str =~ s/\\\\/\\/g;  # mere backslash
       push(@$form, $str);
       last if !@stack;
   }
   elsif (/\G\s*([^\s();']*)/gcs) {

プラグインではありませんが。--SHIMADA 2003-07-31 (Thu) 14:41:17

修正しました。- rica 2003-07-31 (Thu) 20:20:11

exist? [済]

管理

$plugin->def("exist?",
  "ページが存在するか?",
  sub {
    my $name = shift;
    return undef if ($fixedpage{$name});
    return defined($database{$name});
  }
);

(if (exist? InterWikiName)
  インターウィキできます
  インターウィキできません)

そのページが存在するかどうかによって処理を切り替えることができます。--SHIMADA 2003-07-30 (Wed) 14:13:21

puzzle-row [済]

管理

$plugin->def('puzzle-row',
  'PuzzleWiki風のテーブルレイアウト用',
  sub {
    '<table><tr><td valign="top">' .
    join('</td><td valign="top">', @_) .
    '</td></tr></table>';
  }
);

使用例

(map-n 4 puzzle-row
       (map (lambda ($page)
              (replace ',' ''
                       (cat '[[' $page ' edit:' $page ']]' (br)
                            (shorten (read $page)))))
            (head 12 (pages)))

なんか、ちゃんとできないと気が済まなくて。(笑)--SHIMADA 2003-07-29 (Tue) 19:03:38

先生! いきなり「収録済み」のところに書いてますっ(汗)。- rica 2003-07-29 (Tue) 19:43:14

あーっと、それもお約束ってことで‥‥‥。(汗 --SHIMADA 2003-07-30 (Wed) 00:27:36

comma [済]

管理

$plugin->def('comma',
  '数字がカンマ付にする',
  sub {
    my $str = shift;
    1 while $str =~ s/(.*\d)(\d\d\d)/$1,$2/;
    $str;
  }
);

使用例

12,345

日本語が壊れているのはお約束です。--SHIMADA 2003-07-29 (Tue) 14:50:12

不具合直しました。→ テーブル整形の不具合について
反映させました。- rica 2003-07-29 (Tue) 17:12:29

list[済]

管理

リストリファレンスを返す

$plugin->def("list",
  "リストリファレンス返す",
  sub { [ @_ ]; }
);

使用例

 (def tabulate/head ヘッダつきの表を作る
   (lambda ($title)
     (let (($col (count $title)))
	(tabulate $col (bold $title) $_rest_))))

リストリファレンスの扱いにはちょっとクセがあります。

$title という仮引数にリストリファレンスが代入されますが、 ボディ部で $title を参照する際、デリファレンスされる (PlugIn/lambda参照)ため、 count(), bold() に渡される時点ではただのリストになっています。--SHIMADA

(tabulate/head (list 日付 内容)
  2003/7/27 日曜日だった
  2003/7/28 月曜日のはず
)

日付内容
2003/7/27日曜日だった
2003/7/28月曜日のはず

edit-form(修正版)[済]

管理

$plugin->def("edit-form",
  "追記編集フォーム",
  sub {
    my $page = shift;
    my $cookedpage = CGI::escapeHTML($page);
    my $lastmod = get_info($page, $info_LastModified);
    my @parts = read_by_part($page);
    my $part = scalar(@parts) + 1;
    return "\n " .
qq|<form action="wiki.cgi" method="post">| .
qq|<input type="hidden" name="myLastModified" value="$lastmod">| .
qq|<input type="hidden" name="mypage" value="$cookedpage">| .
qq|<input type="hidden" name="mypart" value="$part">| .
qq|<textarea cols="60" rows="10" name="mymsg">| .
qq|</textarea><br>| .
qq|<input type="checkbox" name="mytouch" value="on" checked="checked">タイムスタンプを更新<br>| .
qq|<input type="submit" name="mypreview_edit" value="プレビュー">| .
qq|<input type="submit" name="mypreview_write" value="保存する"><br>    | .
qq|</form>|;
    }
);

全体が pre ブロックになるように、行頭に空白をあけて1行に出力されるようにしてみました。 あとページ名以外の引数はなくしました。 --SHIMADA 2003-07-27 (Sun) 20:47:38

set! [済]

管理

$plugin->special("set!",
  "変数への破壊的に代入",
  sub {
    my ($var, $val) = @_;
    die "$var is not a variable." unless $var =~ /^\$.+/;
    ($val) = $plugin->evl($val);
    $plugin->set_var($var, $val);
  }
);

Plugim.pmに下記のメソッドを追加(lookup_varの下あたりにでも)

sub set_var {
  my ($self, $var, $val) = @_;
  foreach my $e (@{$self->{env}}) {
    if (defined($e->{$var})) {
      $e->{$var} = $val;
      return ();
    }
  }
  die "Undefined variable: $var";
}

↑は PlugIn/set! には載せなくていいです。

使用例

(let (($a 0))
  $a
  (set! $a 1)
  $a
  (set! $a (+ $a 5))
  $a)
=> 0 1 6

※ set! は値を返しません。

let で宣言していない変数を set! しようとするとエラーになります。

(let (($a 0))
  (set! $b 1))
=> [Error] (set! $b 1): Undefined variable: $b at ../../lib/Plugin.pm line 154.

date[済]

管理

$plugin->def("date",
  "通日から年-月-日の文字列を作ります",
  sub {
    my $arg = shift;
    my $time;
    if ($arg) {
      $time = $arg * 60 * 60 * 24;
    }
    else {
      $time = time;
    }
    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($time);
    $year += 1900 if $year < 1900;
    $mon += 1;
    return sprintf("%04d-%02d-%02d", $year,$mon,$mday);
  }
);

解説

引数は通日です。通日は (day-number) で作ります。 引数を省略すると PlugIn/today と全く同じ動作になります。

使用例

明日の日付

##(date (+1 (day-number)))

=> 2021-04-22

Hash関連[済]

管理

$plugin->def("make-hash-table",
  "ハッシュリファレンスを返す",
   sub { return {}; }
);

$plugin->def("gethash",
   "ハッシュから値を取り出す",
   sub {
     my ($key, $hashref) = @_;
     die "$hashref is not a hash-table" unless ref($hashref) eq 'HASH';

     $hashref->{$key};
   }
);

$plugin->def("puthash",
   "ハッシュに値を入れる",
   sub {
     my ($key, $hashref, $val) = @_;
     die "$hashref is not a hash-table" unless ref($hashref) eq 'HASH';

     $hashref->{$key} = $val;
   }
);

progn [済]

管理

$plugin->special("progn",
  "最後に評価した式の値を返す",
  sub {
    my @result;
    while (my $form = shift) {
      @result = $plugin->evl($form);
    }
    @result;
  }
);

(make-hash-table)
=> HASH(0x1c84080)

(let (($h (make-hash-table)))
  (progn
    (puthash foo $h 100)
    (+ 100 (gethash foo $h))))
=> 200

prognとbeginどっちがいいかな。(答え:どっちでもいい) --SHIMADA 2003-07-24 (Thu) 07:07:32

def [済]

管理

プラグインをその場で定義しちゃう

$plugin->def("def",
  "プラグインを定義する",
  sub {
    my ($name, $doc, $proc) = @_;
    die "$proc is not a procedure!" unless ref($proc) eq 'CODE';
    $plugin->def($name, $doc, $proc);
    return ();
  }
);

使用例

(def fact 階乗を求める
   (lambda ($n)
     (if (lt? $n 2)
       1
       (* $n (fact (-1 $n))))))
=>

※defは値を返さない

##(grep fact (plugins))
=> fact (階乗を求める)

##(fact 4)
=> 24

##(def hr '水平線を出力する(できません)' (lambda () '<hr>'))
=>

##(hr)
=> <hr>

解説

そのページだけで使えるプラグインを定義します。

本体をちょっと改造すれば、PluginDefinition のような名前で特定のページを決めて、そこにたくさんプラグインを定義しておいて、各ページ共通で使えるようになるでしょう。

ちなみにHTMLタグを出力するプラグインは作れません(エスケープされるため)。

※プラグインが反映されればUndefined pluginエラーはなくなるはずです。--SHIMADA 2003-07-23 (Wed) 10:50:52

if [別実装で反映]

管理
よくわかっていませんが…

$plugin->def("if",
  "第一引数が真の場合第二引数、偽の場合第3引数を返す",
  sub {
    my $pred = shift;
    my @cont = @_;
    if ($pred) {
       return $cont[0];
    }else{
       return $cont[1];
    }
  }
);
だと問題が発生するのでしょうか? -たろう 2003-07-03 (Thu) 16:12:10

##(if (eq (this-page) FrontPage) 'ここはトップページですね' 'ここはトップページではありませんね')

##(split '\n' (if 1 (join '\n' 1 2 3 4) (join '\n' 5 6 7 8)))

とか…でも、splitとjoinを組み合わせるのは美しくないですし、区切り文字に気をつけないといけないのはちと大変かも(笑)

区切り文字を気にせずにリストを一まとまりの値にまとめるpackとそれを解くunpackというのはどうでしょう?…まあ、split、joinとさほど変わりませんが…

…で、これはこれでよいのでしょうか…- rica 2003-07-03 (Thu) 18:54:03

ちょっと保留にさせてもらっていいですか? この話題は PlugIn/スペシャルフォーム で続けたいと思います。--SHIMADA 2003-07-04 (Fri) 00:09:23

tag-links [済]

管理
SHIMADAさんとこのwikiにはあって、こちらにはなかったので作ってみました-たろう 2003-07-03 (Thu) 16:59:07

なんかこれ使い方次第で便利そうなんで、気になっていたんですよね…

使い方はdocument:tag-links参照

$plugin->def("tag-links",
  "タグの値別にページへのリンクを列挙する",
  sub {
    my $tag = shift;
    my (%has);
    foreach my $page (keys %database) {
      next if $page eq $form{mypage};
      my $txt = $database{$page};
      my @matches = ($txt =~ /^$tag:\s*(.+)$/gm) or next;
      foreach my $val (@matches) {
        if (defined $has{$val}) {
          push @{$has{$val}}, $page;
        }else {
          $has{$val} = [$page];
        }
      }
    }
    my @result = ();
    my @keys = sort { $has{$a}[0] cmp $has{$b}[0] } keys %has;
    foreach my $val (@keys) {
      my @hits = map { "[[$_]] " } @{$has{$val}};
      push @result, CGI::escapeHTML($val) . " @hits";
    }
    return @result;
  }
);

when [済]

管理

条件判断シリーズを考えました。たろうさんがもうちょっと簡単にカレンダーを書けるように。(違) --SHIMADA

$plugin->def("when",
  "第一引数が真の場合、第二引数以降を返す",
  sub {
    my $pred = shift;
    my @cont = @_;
    $pred ? @cont : "";
  }
);

##(when (eq (this-page) FrontPage) 'ここはトップページですね')

解説

whenif a then b です。else は今の枠組みの中では実現できない気がします。

IF foo... THEN bar... ELSE baz...

は、

(when (foo...) bar...)
(when (not (foo ...) baz...)

と両方並べるしかないかも。

when も最初できないと思っていたのですが、いまのプラグインには副作用(データ変更や変数代入など)がないので、できることに気づきました。--SHIMADA

…で、これはこれでよいのでしょうか…- rica 2003-07-03 (Thu) 18:54:03

あ、これはいいですよ。--SHIMADA 2003-07-03 (Thu) 18:57:18

eq [済]

管理
$plugin->def("eq",
  "AとBが等しいか?(文字列)",
  sub {
    my ($a, $b,) = @_;
    $a eq $b;
  }
);

##(when (eq (this-page) FrontPage) 'ここはトップページですね')

not [済]

管理
$plugin->def("not",
  "否定",
  sub {
    my $a = shift;
    not $a;
  }
);

##(when (not (eq (this-page) FrontPage)) 'ここはトップページではありませんね')

= [済]

管理
$plugin->def("=",
  "AとBが等しいか?(数値)",
  sub {
    my ($a, $b,) = @_;
    $a == $b;
  }
);

##(when (= (nth 2 (split - (today))) 1) '今月もがんばりましょう')

gt? [済]

管理
$plugin->def("gt?",
  "AがBより大きいか?(数値)",
  sub {
    my ($a, $b,) = @_;
    $a > $b;
  }
);

##(when (gt? (count (split '\n' (read (this-page)))) 30) 'このページは長いですね')

サニタイズの関係で、プラグイン名に > がうまく使えないのでこうしました。--SHIMADA

lt? [済]

管理
$plugin->def("lt?",
  "AがBより小さいか?(数値)",
  sub {
    my ($a, $b,) = @_;
    $a < $b;
  }
);

##(when (lt? (count (split '\n' (read (this-page)))) 5) 'このページは短いですね')

サニタイズの関係で、プラグイン名に < がうまく使えないのでこうしました。--SHIMADA

sprintf [済]

管理

$plugin->def("sprintf",
  "フォーマットを指定して文字列を組み立てる",
  sub {
    my $fmt = shift;
    sprintf $fmt, @_;
  }
);

例:

##(sprintf '%02d/%s/%s' 3 (br) hogehoge)

フォーマット指定子はPerlやCのマニュアルを参照のこと(笑)。--SHIMADA

split [済]

管理

$plugin->def("split",
   "第一パラメータをセパレータとしてリストに分解する",
   sub {
     my $sep = shift;
     my @result = map { split $sep, $_ } @_;
     return @result;
   }
);

これはどなたかしら。- rica 2003-07-02 (Wed) 19:10:10

div [済]

管理

$plugin->def("div",
  "第一引数をクラスとするdivで囲む",
  sub {
    my $class = shift;
    return qq(<div class="$class">), @_, qq(</div>);
  }
);

##(div included (join '\n\n----\n\n' (find-paragraph (today))))

汎用につかえる系。--SHIMADA

bundle [済]

管理

$plugin->def("bundle",
  "第一引数をクラスとするdivで括って水平線で区切る",
  sub {
    my $class = shift;
    my @chunk = @_;
    join "\n\n----\n\n",
          map { qq(<div class="$class">) . $_ . qq(</div>) } @chunk;
  }
);

##(bundle included (find-paragraph (today)))

インクルード専用系。--SHIMADA

nth [済]

管理

$plugin->def("nth",
  "リストの第n番目",
  sub {
    my $n = shift;
    return "" unless defined $n;
    return $_[$n];
  }
);

小ネタシリーズ。名前の起源は Lisp です。 --SHIMADA

先頭は0番目じゃなくて1番目。

2003-06-30 (Mon) 19:40:47あーっと思ったら先頭は0だった → Common Lisp の nth

直しました。

this-page [済]

管理

$plugin->def("this-page",
  "現在のページ名",
  sub { $form{mypage} }
);

小ネタその2。--SHIMADA

応用: 逆リンク一覧(うまく動くかな‥‥‥。)

PlugIn/アプリケーション PlugIn/机上のソース PlugIn/カレンダー遊び PligIn?/最新版 PlugIn PlugIn/FrontPageRica?

あー、だめだ。これだと「WikiName? ならブラケットはいらない」というルールになってない。 単にページ名が含まれているページなら↓でいいんだけど。

PlugIn/アプリケーション / PlugIn/机上のソース / PlugIn/カレンダー遊び / PligIn/最新版 / PlugIn / PlugIn/FrontPageRica

WikiName? をさらにブラケットで括っても、特に支障はないと思うのですが…。そういうことではなくて…? ええと、プラグイン自体はこれでよいのでしょうか。- rica 2003-06-30 (Mon) 15:19:45

プラグインはこれでいいです。
だめというのは、例えば [[SHIMADA]] も SHIMADA もヒットしてしまうため、リンクしていないページも含まれてしまうので「逆リンク」は名乗れないなあということです。--SHIMADA 2003-06-30 (Mon) 15:31:14

え、普通逆リンクって、ちゃんとチェックしてるんですか!? ページ名のところから検索すると、確かに[[SHIMADA]] も SHIMADA もヒットするので、時々不便は感じてたんですが「まぁ、そんなもんか」と思ってました(^-^;)。- rica 2003-06-30 (Mon) 15:43:42

day-of-week[済]

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

$plugin->def("day-of-week",
 "指定した年/月/日からその日の曜日を返す",
  sub {
    my ($year,$mon,$day)=@_;
    if($mon == 1 || $mon == 2) {
         $year--;
         $mon+=12;
    }
    my $firstday=int($year + int($year/4) - int($year/100) + int($year/400) + int((13*$mon+8)/5) + $day) % 7;
    return $firstday;
 }
);


(rica):…あの…使えなくてすみません…(泣)。

「結局、年/月/日から曜日を出すようにしました。ただ、first-daysでもなくなったので、名前付けに困っています(笑) 」って、これ、名前は決まってないんですか? 前の days とは違うもんなんですか?

$plugin->def("days",
  "今日の日付(epochからの経過日数)",
  sub {
    return int(time() / 60 / 60 / 24);
  }
);

(たろう):あああっ!ごめんなさい!前のdaysとまったく違うものです!

「days」(という別のPlugIn)がすでにあったのを確認していませんでした…なにか他の名前にしないといけないですね…うーん…

もともと指定年/月の一日の曜日を出力するpluginとしてfirst-daysを考えたんですが、日にちも任意で選択できるようにしたのでfirst-daysは変かな?とで和英:曜日で引いてみたらdayが使われていたのでそのまま名づけてしまいました。

とりあえず、days は前のに戻してこっちに移動しました。

すいません…「名前付け」で問題が発生するとは…あうう…

(rica):…すみません…。何をしているものなのか…判ってないので…名前付けも…考えられま…せん…m(_"_)m。つ…使えねぇ…。

手元の…和英辞典を…引いたら… a day of the week となって…いたので…ご参考までに…。って…リンク先の辞書にも…書いてある…。

(たろう):ぐはぁっ!「days」だけで「曜日」ではないんですね「a day of the week」で「曜日」なんですね…ああ、無知を曝している?

(rica):いや、()書きに入ってたりするので、省略可能なんじゃないですか? 原住民の間では(笑)。「曜日」と「曜」の違いみたいなもんで(でも、「曜」の方を省略してどうするよ、とは思いますけど(笑))。
ところで、いっそ、ファイルの書き換えられる CGI で $modifier_dir_data/lib/ 以下のファイルを直接書き換えられるようにしちゃおうかと思ったんですけど、怖いですかね…? 不自由じゃないですか?

(たろう):直接$modifier_dir_data/lib/ 以下のファイルを編集できるようにしなくて良いですよ…っていうか危なすぎます。いや、まじで。

(rica):自分用に使っているファイルマネージャみたいな CGI が、結構ユーザー制限とか出来た気がしたし、$modifier_dir_data/lib/ 以下って plugins.pl だけなので、大丈夫かも、と思ったんですが(笑)。まぁ、ちょっと設置がややこしかった記憶があるので、どっちにしても今日明日はちょっと設置している時間(というよりココロの余裕)がないですが。

(SHIMADA) 2003-06-29 (Sun) 13:58:12: 名前ですが、day-of-week とか、省略して dow というのが一般的な関数名みたいです。dow じゃ日本人には分からないからちょっと長いけど day-of-week でどうでしょう?
…でも元からある days の名前が思いつきでぱっとつけたので、こちらも早急にもっとましな名前を考えます。m(_"_)m

2003-06-30 (Mon) 00:11:28 これは名前が決まらないばっかりにおいてきぼり? かわいそうに…(笑)。 -rica

2003-06-30 (Mon) 10:54:31 たろう:では他に良い名前案も浮かんでこないので、「day-of-week」にします。

bold (太字化)[済]

管理
$plugin->def("bold",
  "太字化",
  sub { map { "''$_''" } @_ }
);

tabulate の最初の行とかに。(…と小ネタで攻めてみるテスト。) --SHIMADA

※大家さんは今テンパっているらしいので、収録は今週一杯くらいで。(^_^;;; (2003-06-29 (Sun) 21:44:06)

どうも、テンパりながらウロつきにきた大家です(;_;)。
あの…私の中では一週間は月曜から始まる事になっているので、日曜に「今週一杯」ということは、「今日中」ということになるんですが…(えっそういうことなんですか!?)。でもどっちにしても「今週中」の 2003-06-29 (Sun) 23:54:45 収録いたしました。
そうだ、たろうさん、カレンダーって月曜始まりで書けますか?(笑) - rica

ちょっとわき道。2003-06-29 (Sun) 23:54:45 のはずだったのに、現在日がめくれて 2003-06-30 (Mon) 00:11:28 になってしまいました(ちょっと悔しいらしい…)。一応不具合顛末メモ。 時間が取れるあさって以降にもうちょっと調べてから塚本さんに報告しようと思いますが、どなたか代わりにしていただければそれでも。 - rica
…塚本さんじゃなくて結城さんかなぁ。

search-paragraph(修正)[済]

管理

2003-06-29 (Sun) 12:58:27 たろう:ちょっとパラグラフの番号で勘違いしていた部分がありましたので修正。

-           my $link = "$page" . ($i == 0 ? "" : "#i@{[$i]}");
+           my $link = "$page" . ($i == 0 ? "" : "#i@{[$i-1]}");

パラグラフ番号がずれていたようです。以下は修正済みソースです。

$plugin->def("search-paragraph",
  "内容が検索文字列にヒットするパラグラフ名のリストを返す",
  sub {
    my $key = shift;
    my @hits = ();
    foreach my $page (keys %database) {
      next if $page eq $form{mypage};
      next if $page eq 'RecentChanges';
      my @parts = map { 
                    s/^(\*+)/'!' x length($1)/mge;
                    s/\[\[#[a-z]+\]\]//go;
                    CGI::escapeHTML($_);
                  } read_by_part($page);
      for (my $i=0; $i < @parts; $i++) {
        if ($parts[$i] =~ $key) {
          my $link = "$page" . ($i == 0 ? "" : "#i@{[$i-1]}");
          push @hits, "$link";
        }
      }
    }
    return @hits;
  }
);

from-to [UP済]

管理
2003-06-29 (Sun) 10:05:43 たろう:公開

$plugin->def("from-to",
  "第1引数の数値から第2引数の数値までのリストを返す",
  sub {
    my $from = shift;
    my $to =shift;
    return ($from .. $to);
  }
);

repeat-times [UP済]

管理
2003-06-29 (Sun) 10:05:43 たろう:公開

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

$plugin->def("repeat-times",
  "第1引数で指定した回数分、第2引数以降のリストを繰り返し出力する",
  sub {
    my $count = shift;
    my @list = @_;
    my @ret = ();
    for (my $i=0; $i < $count; $i++) {
      push @ret, @list;
    }
    return @ret;
  }
);

search-page [UP済]

管理
2003-06-29 (Sun) 09:27:38 たろう:公開

$plugin->def("search-page",
  "内容が検索文字列にヒットするページを返す",
  sub {
    my $key = shift;
    my @hits = ();
     foreach my $page (keys %database) {
      next if $page eq $form{mypage};
      next if $page eq 'RecentChanges';
      if ($database{$page} =~ $key) {
          push @hits, $page;
      }
    }
    return @hits;
  }
);

##(join '\n\n' (read (search-page test)))

とか

##(listing (search-page test))

read-by-part [UP済]

管理
(たろう):2003-06-29 (Sun) 08:59:44

今は(read-by-part PlugIn 3)という書式ですが、(read PlugIn#i3)で出力できるのでちょいと書式仕様変更Ver案を上げてみます。

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

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

$plugin->def("read-by-part",
 "受け取ったページ名の内容をパラグラフ単位で返す",
  sub {
    my @targets = @_;
    return "" unless @targets;
    my @ret;
    foreach my $page (@targets) {
      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);
      my $tmp = shift @parts;
      push @ret, @parts;
    }
    return @ret;
  }
);

last-days [UP済]

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

$plugin->def("last-days",
 "指定した年/月から末日の日付を返す",
  sub {
    my ($year,$mon)=@_;
    my $lastday = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)[$mon - 1]
 + ($mon == 2 && ($year % 4 == 0 && $year % 100 != 0 || $year % 400 == 0));

    return $lastday;
  }
);

末尾n個だけ

管理
$plugin->def("tail",
  "末尾n個だけ",
  sub {
    my $n = shift;
    return "" unless $n;
    my @arr = @_;
    if (scalar(@arr) < $n) {
      $n = scalar(@arr);
    }
    return splice(@arr, $#arr-$n+1,$n);
  }
);

受け取ったページ名・パラグラフ名の内容を文字列で返す read

管理

$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;
        push @ret, CGI::escapeHTML($text);
      }
    }
    return @ret;
  }
);

受け取ったパラグラフ名の内容を文字列で返す read-by-part

管理

$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];
 }
);

これはだめだめなのですか?

あ、これは修正版です…SHIMADAさんみたいに差分を書かないとだめですね

とりあえず、判るように「完璧だぜマーク」をつけておいて頂ければ大丈夫です。差分が別にあると、それを見落とすことも大いにありそうだし(基本的にヌケているので)。…自分でコードを読んで判断できれば、一番いいんですけどね…(寂笑)。

か…「完璧だぜマーク」…思いつきでコーディング、修正している僕には付けられない…_| ̄|○

修正した日時をつけるようにします…-たろう

{{ now }}(半角スペースは含めない) で 2003-06-28 (Sat) 09:23:01 のような日付が入るようにしました。宜しければお使いください。

(たろう):ほ?…2003-06-28 (Sat) 09:28:21…なるほど

宜しければお使いください その2(笑)。- rica

プラグインページ一覧

管理
PlugIn/*PlugIn/+PlugIn/+1PlugIn/-PlugIn/-1
PlugIn/=PlugIn/boldPlugIn/brPlugIn/bracketsPlugIn/bundle
PlugIn/casePlugIn/catPlugIn/commaPlugIn/countPlugIn/date
PlugIn/date-stampPlugIn/day-numberPlugIn/day-of-weekPlugIn/defPlugIn/div
PlugIn/edit-formPlugIn/eqPlugIn/exist?PlugIn/fact?PlugIn/find-paragraph
PlugIn/from-toPlugIn/gethashPlugIn/grepPlugIn/grep-gtPlugIn/grep-lt
PlugIn/gt?PlugIn/headPlugIn/hr?PlugIn/ifPlugIn/include
PlugIn/joinPlugIn/jokePlugIn/lambdaPlugIn/last-daysPlugIn/let
PlugIn/listPlugIn/listingPlugIn/lt?PlugIn/make-hash-tablePlugIn/map
PlugIn/map-nPlugIn/maxPlugIn/notPlugIn/nowPlugIn/nth
PlugIn/paPlugIn/pagesPlugIn/pluginsPlugIn/prognPlugIn/puthash
PlugIn/puzzle-rowPlugIn/readPlugIn/read-by-partPlugIn/repeat-timesPlugIn/replace
PlugIn/reversePlugIn/search-pagePlugIn/search-paragraphPlugIn/set!PlugIn/shorten?
PlugIn/sortPlugIn/splitPlugIn/sprintfPlugIn/tabulatePlugIn/tabulate/head?
PlugIn/tag-linksPlugIn/tailPlugIn/this-pagePlugIn/todayPlugIn/when
PlugIn/when*PlugIn/yesterday