PlugInに関するお話とか… もともとPlugInにあったものを移行しました-たろう
##(date) => 2021-04-22
##(today) => 2021-04-22
##(date (day-number)) => 2021-04-21
なにかを猛烈に間違っているらしい…。--SHIMADA 2003-07-25 (Fri) 00:43:38
朝見たときは(date (day-number))だけ違っていたはずなんですが…
2003-07-25 (Fri) 16:33:25現在、3つとも同じです…直ったの?それとも時差? -- たろう
time()の時間ってGMT+0:00で、日本時間はGMT+9:00だから、発生したとか?
を、2003-07-26 (Sat) 06:01:17現在、(date (day-number))だけまだ昨日の日付になっていますね -- たろう
えーと、timeにlocaltimeの時差を足す処理が必要らしいということは分かったのですが、どういう風に書けばポータブルになるのか、どなたかご存知ありませんか? --SHIMADA 2003-07-28 (Mon) 18:06:51
おお、これが出たということはできてるってことかしらっ!?
うーん、これは自分でプラグインを作ったりできるんだろうか。…できるんだろうな…できる人には…。 あ、憧れの include がない…(;_;)
$plugin->def("include", "受け取ったページ名の内容を取り込む", sub { my @targets = @_; return "" unless @targets; my @ret; foreach my $target (@targets) { next if $target eq $form{mypage}; push @ret, "'''from ["."[$target]"."]'''\n\n"; push @ret, $database{$target}; } return join "\n\n", @ret; } );
きましたー。
抑止する事項:
代案: 別ページのプラグインを読み込む load を定義する。 readの逆で、def と load だけを再帰的に実行する。(ループチェックはする)
⇒ ページ群をライブラリのように使うことが可能。
(join '\n' (div minimenu 署名のあるページ (listing (brackets (sort (search-page SHIMADA))))))
いらっしゃいませーっ。 - rica
できましたっ♪
これって、見出しごとの include とかもできるのでしょうか。検索してソートしてインクルードできる Wiki っていう妄想があるんですが。あーやっぱりちゃんと勉強しようっ。
そうだ、暫定版で放り出したままになっている、日付検索用のカレンダーっていうのもあったかもしれない。できるのかな。
20210421
とか書いてみる…これ数字8桁だから、インクリメントしても日付計算のようにはなりませんよね…と無茶を言ってみる。
勢いでうりゃ。date-stampも改良。足し算は (+ 1 2 3) => 6 です。
(date-stamp (+ (days) 12)) => 20030708 になれば成功。(6/26現在) --SHIMADA
おお、すげー、もう改良案が出てる!--たろう
$plugin->def("days", "今日の日付(epochからの経過日数)", sub { return int(time() / 60 / 60 / 24); } ); $plugin->def("date-stamp", "daysの年月日を表す数字8桁(省略時は今日)", 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); } ); $plugin->def("+", "足し算", sub { my $sum = 0; foreach my $n (@_) { $sum += $n; } return $sum; } ); $plugin->def("-", "引き算", sub { my $ret = shift; foreach my $n (@_) { $ret -= $n; } return $ret; } );
19700113 成功?
たしざん。 1368
行頭に半角スペースの場合はエスケープできると、WalWiki? では自然かなぁと思ったんですが、どうでしょう?(実際は「使い方の説明」くらいしか、必要な場面はないですが)
(SHIMADA): 今はプラグインの埋め込み場所を検索するロジックが改行を全く意識していないで、『##(』 という文字列を探すだけになっています。S式の途中で改行を許す仕様のため、そのほうが処理しやすいのです。
#と#の間にシングルクォート×6を挟むとエスケープはできます。
YukiWiki?のフォーマット処理はテキストを行ごとにsplitして一行ずつ見ていく形になっています。(ほとんどすべてのWikiEngine?がそうなっている気がします)
プラグインの処理をその中に組み込んでしまえば(do_plugin()をinline()の中から呼び出す)、行頭スペースも意識できると思うのですが、S式も改行なしで一行に書かなければなりません。
あとその場合は例えばlistingなんかの処理も、今は "- hogehoge\n" とWiki記法のテキストを出力するだけで済んでいますが、自前で <ul> <li>hoge... </ul> のようにタグを出力する必要がでてきます。(あ、これはpluginを作る人だけの問題ですね)
どっちがいいですか?
rica: どっちがいいかと聞かれると困ってしまいますね(笑)。 出来るだけ WalWiki? の中で違和感がないようにというのは、単純に「慣れてない人は混乱しないかな」程度の心配で、plug-in も、面白がって使い倒すというのでない限りは、改行できないというのはさほど制約には感じないですよね。
一方、そんな心配より、入れ子に出来るっていうのはやっぱりとっても面白くて、できるだけその辺の自由を奪うことになる(?)ようなことはしたくない気はします。
(SHIMADA): あれれ、今気づきましたが、includeがうまく動かなくなってしまうので、do_plugin()をinline()に持って行くのはやっぱり無理でした。m(_"_)m
6
文字列中に空白や改行を含めることも可能です → 我々ハ ウチュウジン
ダ ← ここまで。
(rica): ちょっと質問ですが、現状で(「splitして一行ずつ見ていく形」ではなくて)、「ページ内を見出しごとに扱う」というような事は出来るのでしょうか? (すみません、どういう処理になっているのか全然解ってないのです)
(SHIMADA): 塚本さんが書いた read_by_part や search_by_part のコードを利用・参照すれば、それほど難しくはないと思いますよ。
欲しい機能は
あたりですか?
(rica):辺りですっ!「read_by_part や search_by_part のコードを利用・参照」ってできるんですね(どうすればできるのかは解らず言ってます…)。関連のある記事に特定の ID みたいなものを振っておいて、一覧表示できたら便利かなと妄想してました。
# すみません、毎度見出しを付けて頂いて…。
(SHIMADA): 本当はもっと部品に分解したほうが使いまわしが効くはずなんですが、とりあえずピンポイントで実装してみました。
(SHIMADA): ごめんなさい、自ページにもヒットしたらおかしいですよね。直しました。
本文だけを取り込む版
$plugin->def("find-paragraph", "検索文字列にヒットするパラグラフ本文のリストを返す", sub { my $key = shift; my @hits = (); foreach my $page (keys %database) { next if $page eq $form{mypage}; # [ADD] my @parts = read_by_part($page); push @hits, grep { $_ =~ $key } @parts; } return @hits; } );
段落リンク対応WalWiki?版
$plugin->def("find-paragraph", "検索文字列にヒットするパラグラフ本文のリストを返す", sub { my $key = shift; my @hits = (); foreach my $page (keys %database) { next if $page eq $form{mypage}; # [ADD] my @parts = 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, "from $link\n\n", $parts[$i]; } } } return @hits; } );
(SHIMADA): いろいろ足りなかったので‥‥‥
$plugin->def("find-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; 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, "from $link\n\n", $parts[$i]; } } } return @hits; } );
差し替えました(差し替えるだけなのに、追いかけるのが大変)。-rica
(SHIMADA): 後からぽろぽろ直してすみません。こうすれば――
my $link = "[[$page" . ($i == 0 ? "" : "#i@{[$i-1]}") . "]]"; - push @hits, "from $link\n\n", $parts[$i]; + push @hits, "from $link\n\n" . $parts[$i]; }
and検索
(join '\n\n----\n\n' (grep foo (find-paragraph bar))
or検索
(join '\n\n----\n\n' (uniq (find-paragraph foo) (find-paragraph bar)))
ができるようになります。 で、uniq は宿題ということでこれから帰宅します(爆)
お疲れ様でしたぁ。お気をつけて♪ - rica
$plugin->def("source", "受け取ったページ名の内容をリストで返す", sub { my @targets = @_; return "" unless @targets; my @ret; foreach my $target (@targets) { next if $target eq $form{mypage}; @ret = split /\n/ , $database{$target}; } return @ret; } );
…はい、ほとんどincludeのぱくりです(笑)
$plugin->def("tail", "末尾n個だけ", sub { my $n = shift; return "" unless $n; my @arr = @_; if (scalar(@arr) < $n) { $n = 0; } return splice(@arr, $n, scalar(@arr)); } );
…はい、ほとんどheadのぱくりです(笑)
##(join '\n\n' (cat 'from ' (brackets ページ)) (source ページ))でincludeの代わりとか
##(join '\n\n' (cat 'from ' (brackets ページ)) (tail 5 (head 10 (source ページ))))で5行目から10行目をincludeするとか
ごめんなさい、tailとheadが逆でしたので、直しました---たろう
##(count (source (ページ)))で行数を表示とか
だめですか?
(SHIMADA): おー、逃避仲間だ♪ ‥‥‥じゃなくて。
そうですね、このくらい分割したほうが部品としては使いやすいですね。
(join '\n\n' (cat 'from ' (brackets ページ)) (source ページ))
は
(join '\n\n' (cat 'from ' (brackets ページ)) (join '\n' (source ページ)))
じゃないかな?
(たろう):あ、そうですね
(rica):現実と向き合って離れているうちに、使い方がワケ解らなくなってきてしまいました…(泣)。
from SHIMADA
[Undefined plugin] (source SHIMADA) ???
(SHIMADA):あれ? なんでだろ?
from SHIMADA
[Undefined plugin] (source SHIMADA) ???
(たろう):なるほど、\nという文字は改行コードとして使われないんですね
(SHIMADA): そうだ、入れてなかったのを忘れてた(爆)。認識させたかったら
TinyReader.pm line 69-75 # Unescape $str =~ s/\\\n//g; # escaped newlines disappear $str =~ s/\\'/'/g; # unescape quote + $str =~ s/\\n/\n/g; # ADD THIS LINE push(@$form, $str); last if !@stack; }
こんな感じで。
(rica):入れてみました。
(たろう):どうかな?
8 9 10 11 12
しまった上記tailだと「n+1番目から末尾まで取り出す」動作になりますね 「末尾n個」版tailは
$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); } );
でした-たろう
ちょっとすごいことになりそうですね。
ページの冒頭に編集フォームを作っておいて、編集先のページ名は自ページのままで部分編集の段落番号を最大値+1にしておけば、投稿するたびに新しい段落が作られる‥‥‥というのはどうでしょう?
追記モードのあるWikiならその機能を呼び出せばいいんですが。
「編集フォームから書き込むと新しい段落」って、確か FSWiki にあって(BBS のプラグインかな)、ちょっとアコガレていました(笑)。どっちかっていうと個人メモ用に使いたかったんですが。-rica
(たろう):たしかに、各発言ごとにページを作っていたらすごいことになりそうですが、「誰かの発言に対してのコメント」も同じページに書き込んでもらう…要するに同一の話題はそのページ上で行う。コメントは新規ページで作らない…というような運用にすればいいのかな?と思っていたので…パラグラフ志向Wiki「風」な感じをイメージしていました(笑)
(edit-form PlugIn '')
↑タグが壊れていて怖いのでボタンは押さないで下さいね。
うーん、WikiName?なページを指定するとmake_link()が反応してしまってだめだ。 あとform内に空行があるとタグを入れられてしまう‥‥‥。
$plugin->def("replace", "第1引数の条件を満たす文字列を第2引数の文字列に置換する", sub { my $n = shift; my $m = shift; return "" unless $n; my @arr = @_; my @ret; foreach my $arg (@arr) { $arg =~ s/$n/$m/g; push @ret, $arg; } return @ret; } );
いいかげん、実験環境を会社マシン(ゑ?)に仕込まないとなぁ…(笑)
そのまま貼ったら、プラグインが全部無効になってしまいました。間違い探しにチャレンジしてみましたが、例によって判りませんでした…(泣)。-rica
(SHIMADA): みつけた!
- foreach my $arg @arr { + foreach my $arg (@arr) {
(たろう):あうう…すいません>お二方
##(replace '^\*' '!' '*ttest' 'test*' 'te*st') ???
置換できていますね…とりあえずテストできたので封印
##(replace '^\*' '!' '*test' 'test*' 'te*st') この行以降、部分編集ずれてしまいますね。-rica
(SHIMADA) 2003-06-30 (Mon) 13:27:06:現状は、インクルードしたテキストにS式があっても処理されないので、S式のまま表示されてしまいます。
処理できるようにすると、同じページを延々インクルードし続けて終わらなくなるという危険性があります。
どうしたらいいでしょうね。(涙)
(rica) 2003-06-30 (Mon) 13:32:53 そう言えば、どこかで同じような事で悩んでいる人がいたような…。
う〜ん、どこで見たんだったかなぁ。思い出したら何か参考になるのかしら…。(涙)
でも、とりあえずは「インクルードしたテキストにS式があっても処理されない」で仕方がない気が…。
突然ですが、これってまだ解決見つかってません? せめて、プラグインの記述を、何かのメッセージに置き換えるようなことは出来ないでしょうか。- rica 2003-07-07 (Mon) 20:27:57。
データベースからテキストを読み込む系のプラグインを整理して、共通サブルーチンを定義してやればなんとかなるだろうと思われます。
$plugin = new Plugin( 現在のページ名($form{myname}), 全ページ名のリスト(keys %database), ページ名からページ内容を返す関数($read{$name}), ページ名から段落内容の配列を返す関数(read_by_part($name)) );
というコンストラクタにして、
あたりを定義して、その中でembedded name の置換とか、escapeHTMLとかの処理と一緒に、includeの循環を防ぐためのチェックも行うようにするといいんじゃないでしょうか。--SHIMADA 2003-07-08 (Tue) 01:02:49
ページ内にあるリンクのリストを作るようなことが出来たら、ちょっと嬉しいかなぁ。 Wiki 内のもだけど、特に外部へのリンク集が自動的に作れるとちょっと便利かも。- rica 2003-07-29 (Tue) 18:29:24