- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- :i/機能 へ行く。
- 1 (2007-12-30 (日) 02:57:47)
- 2 (2008-01-01 (火) 02:31:27)
- 3 (2008-02-11 (月) 15:29:16)
- 4 (2008-04-05 (土) 15:31:10)
- 5 (2008-04-05 (土) 15:49:39)
- 6 (2008-09-28 (日) 00:07:05)
- 7 (2008-11-09 (日) 07:50:27)
- 8 (2008-12-07 (日) 12:00:53)
- 9 (2009-01-18 (日) 22:01:14)
- 10 (2009-08-30 (日) 11:16:06)
- 11 (2009-11-02 (月) 23:17:37)
- 12 (2009-11-03 (火) 19:38:24)
- 13 (2009-11-07 (土) 01:16:26)
- 14 (2010-01-24 (日) 11:42:37)
- 15 (2010-10-19 (火) 03:35:20)
- 16 (2011-01-10 (月) 23:40:13)
- 17 (2011-02-07 (月) 12:59:09)
- 18 (2011-02-10 (木) 04:51:00)
- 19 (2011-03-21 (月) 01:03:10)
- 20 (2011-03-21 (月) 01:12:24)
- 21 (2011-03-21 (月) 01:38:37)
- 22 (2011-03-21 (月) 01:53:07)
- 23 (2011-03-22 (火) 01:53:41)
- 24 (2011-03-23 (水) 06:12:22)
- 25 (2011-03-23 (水) 06:26:31)
- 26 (2011-03-23 (水) 08:55:13)
- 27 (2011-03-30 (水) 21:45:48)
- 28 (2011-04-03 (日) 01:29:08)
- 29 (2011-04-08 (金) 05:45:40)
- 30 (2011-04-13 (水) 12:25:52)
- 31 (2011-04-14 (木) 00:31:50)
- 32 (2011-04-14 (木) 00:37:22)
- 33 (2011-05-04 (水) 10:02:19)
- 34 (2011-07-17 (日) 22:43:12)
- 35 (2011-07-18 (月) 01:52:53)
- 36 (2011-07-18 (月) 12:59:15)
- 37 (2011-07-18 (月) 23:55:56)
- 38 (2011-07-19 (火) 00:01:06)
- 39 (2011-07-19 (火) 18:15:09)
- 40 (2011-07-21 (木) 14:52:15)
- 41 (2011-09-10 (土) 01:40:55)
- 42 (2011-09-10 (土) 02:39:27)
- 43 (2011-09-16 (金) 22:40:22)
- 44 (2011-12-14 (水) 01:29:17)
- 45 (2012-06-01 (金) 06:26:56)
- 46 (2012-06-01 (金) 06:33:25)
- 47 (2012-06-01 (金) 06:41:55)
- 48 (2012-07-30 (月) 11:22:53)
- 49 (2012-08-03 (金) 06:27:39)
- 50 (2012-08-03 (金) 14:06:14)
- 51 (2012-08-07 (火) 17:01:55)
- 52 (2012-08-12 (日) 14:59:20)
- 53 (2012-09-20 (木) 06:45:43)
- 54 (2012-09-20 (木) 07:07:26)
- 55 (2013-01-07 (月) 18:15:40)
- 56 (2013-01-08 (火) 18:08:46)
- 57 (2013-01-11 (金) 18:55:51)
- 58 (2013-01-11 (金) 19:14:50)
- 59 (2013-02-06 (水) 01:52:31)
- 60 (2013-02-10 (日) 02:38:48)
- 61 (2013-02-16 (土) 09:28:24)
- 62 (2013-03-03 (日) 08:32:09)
- 63 (2013-03-10 (日) 16:40:47)
- 64 (2013-03-11 (月) 05:41:07)
- 65 (2013-03-11 (月) 12:47:39)
- 66 (2013-03-11 (月) 17:08:27)
- 67 (2013-03-12 (火) 02:48:23)
- 68 (2013-03-12 (火) 06:31:23)
- 69 (2013-03-20 (水) 22:39:42)
- 70 (2013-03-23 (土) 16:04:20)
- 71 (2013-03-29 (金) 06:15:11)
- 72 (2013-03-29 (金) 06:45:12)
- 73 (2013-04-18 (木) 17:09:00)
- 74 (2014-01-08 (水) 18:25:02)
- 75 (2014-03-05 (水) 19:20:12)
- 76 (2014-03-30 (日) 04:54:27)
- 77 (2016-01-10 (日) 00:24:02)
- 78 (2021-11-18 (木) 12:59:07)
- 79 (2021-11-18 (木) 13:06:49)
- 80 (2021-11-18 (木) 13:16:07)
- 81 (2021-11-18 (木) 13:35:59)
- 82 (2021-11-18 (木) 13:43:02)
- 83 (2021-11-18 (木) 13:45:49)
→WikiNotation[?]
→X/PageElement[?]
目次 †
関連 †
プラグイン周辺のタグ †
Arrayプラグイン †
呼び方「プラグイン」→「PageElement」に。
機能追加の仕組みと追加されるもの。
記法のプラグイン。
汎用のプラグイン呼び出し記法か、プラグインごとに定義したWikiNotationで記述すると機能するようになる。
内部ではWikiNotationはプラグイン呼び出し記法に置き換えられる。
プラグイン呼び出しをするクラスはプラグイン記法だけを扱えればいい。
インライン/ブロック/ページ †
3種類の型。
使われ方と出力の違い。使われ方はUIの範疇なので、プラグインでは出力だけ気にすればいい。
使われ方の違いは「どう書くか」だけの違い。
1行ごとに指示を書くか、1ページにまとめて指示するか。
内部では渡されるデータの長さと呼び出される回数が違うだけ。
複数行をまとめて扱う必要のある場合、表などはページやブロックじゃないと。
実装 †
プラグインにUsage †
プラグインに書かれているテキストをヘルプに出す。
バルーンやtipsにも出せるようなシンプルな体裁で。
というか、組み込み済みのWikitextで。
時刻だけ書いたら同じページに書かれている日付を加味 †
検索時の同一性評価で、足りない情報を同じページから取得。
時刻だけの表現には同じページにある日付を。同じページに日付だけの表現がないなら日付時刻から日付を流用。
足りないフィールドは同じ(近い)ページから取得。
Wikiなので情報は非定型。補える場合は少ないし重複がある。
→足りない情報を補うための機能ではなく、近い情報を加味する基本的な機能で。
属性の継承とは違う。
プラグインが独自に使うデータなので、フレームワークは関わらない。
広い期間で有効なデータ領域を用意するだけ。
→数種類。ページ、プロセス、セッション、アプリケーション。プラグイン向け機能。
フレームワークではプラグインの呼び出し順を一定にする。上から順に。
インスタンス †
というか、設定を複数用意可能に。
同じプラグインでも設定ごとに異なるWikiNotationを当てて、使い分けできるように。
プラグイン側で設定ページをパラメーター化すればいい。
WikiNotationの記述で、Notationと設定を抱き合わせにすれば実現可能。
フレームワークでやる必要はない。
複数行パラメーターの書き方 †
複数行をプラグインに渡すには、置き換えと埋め込みページが良さそう。
- 置き換え
plugin(l1
WikiCreole式。
l2,p2)
改行文字になる表現を使って。プラグインには改行文字が渡る。 - 埋め込み
plugin({{ページ}})
他のページを指すリファレンスを渡す。ページは埋め込みの仕組みを使って展開されてからパラメーターとしてプラグインへ。
3態 †
WikiText→オブジェクト→HTML
…をプラグインごとに行う。出力はそのままレスポンスに含める。
WikiNotation(設定に依存しない基本的なWikiNotation)をHTMLに変換するためのライブラリを用意。
これで他のWikiNotationと変換結果を統一。
オブジェクトの保存はバージョニングのこと。
ページの属性次第で保存するかしないかが決まる。
保存しないのは特殊なページ。
ページがコンポジション †
リンクは1つのオブジェクトにしたほうが都合が良い。
…が、機能が低下するので却下。
永続化と復帰が複雑になる。
プラグインの展開タイミング †
ページ特有の解析処理(利用者登録など)の前か後かはプラグインの実装次第で決まるように。
ページ特有の処理の前に展開すれば展開後のテキストも解析されることになる。
includeのように他のページを取り込むプラグインを使えば、任意のページを利用者登録ページに取り込んで一括登録できる。その代わり取り込まれるページも管理者権限でしか編集できないようにしなければならない。など利点と欠点がある。
プラグインの出力はそれ以上処理しないので、自動リンクや埋め込みの展開などはプラグイン側で行なう。
WikiNotation(プラグイン呼び出し)のパラメーター部分にWikiNotationがあっても処理するのはプラグイン。それ以外はページが処理。
これでページ/編集/HTML書き込み[?]の埋め込みと展開を邪魔しないようにできる。
プラグインの出力はWikiTextではなくHTML。そのままレスポンスの一部になる。
プラグインの処理のうち共通部分に埋め込みの展開を置いてもいい。
メタシンボルの埋め込みで動的なパラメーター指定ができるが、これを全プラグインの仕様にしたいので。
入力:WikiText →
→ 出力:HTML
導入 †
導入は「置いて書く」 †
- サーバーにファイルを置く
- Wikiに何か書く
これで使えるように。
他に必要なことがあれば、この後にメッセージが見えるように。
プラグインの出力がメッセージになるか、プラグイン一覧かプラグインページにメッセージ出力。
管理者だけが読めるメッセージにしたいときは?
管理者宛の親展メッセージにできればいい。呼ばれるたびに送信。数を制限するならプラグインが自粛。
プラグインは部品 †
プラグインは部品であるべき。
組み合わせる余地が要る。
投稿時展開するものは要らない †
投稿時展開するくらいなら編集時にボタンなどで展開後のテキストを挿入した方がいい。
MediaWikiの~~~~のようなもの。
そういったボタンを使えないクライアントにはただの文字列を提供。編集ページを開いた時点で展開しておく。それをコピペ。量が多くなるのであまり一度に用意できない。
その他のプラグイン †
設計 †
プラグインというクラスは作らない。
記法(WikiNotation)と同じ扱い。X/PageElement[?]
WikiNotationはネスト可能。
独自データをページに保存可能。ページに残すので履歴付き。
プラグインのアンインストール方法は?しやすく
しやすくする以上のことはできない。
PageElementをオブジェクトとして永続化する場合、Pageと一緒にということになる。
動的データはPageが持つWikiTextからすべて作成可能。
PageインスタンスはWikiTextから生成したPageElement構造体。
利用者による編集と同じで、ページを更新するときは履歴を作るのが基本。
でも、PageElementの設定(PageElementのコードで定義)で履歴を作らないことが指示されていれば作らない。
展開は閲覧時 †
閲覧時展開。
置き換えない。
HTMLに置き換えてもHTMLエスケープしてしまうので。
ずっと動的に展開。
Chain of Responsibility †
ユーザーが直接呼び出すタイプのプラグインはChain of Responsibility。
クエリーはプラグイン名とページ名を指定するのでなく、やって欲しいことを。
同じクエリーでも導入されているプラグイン次第で別の処理が行われるかも知れないし、いくつのプラグインが反応するかも変わってくる。管理次第。
これはWikiが正しく構築されていれば正しく動くし、間違っていれば結果(ページ出力)に表れるので分かりやすい。対応付けを厳格にすると設定が難しくなるし、後から付け足した設定で以前の設定が無効になることもあるので、それを回避するのが狙い。
フレームワークもChain of Responsibility。
ページ─プラグインはコンポジションに †
Notationオブジェクトは書くたびにインスタンス生成。
リファレンスだけを増やしたいときはPukiWikiでの「includeプラグイン」のような特別な方法で。
どのプラグインか †
プラグイン使用時の記述はプラグインを表すキーワードと、プラグイン指定のキーワードで。
1つのキーワードで複数のプラグイン呼び出し可能。
処理できるプラグイン1つが処理する。
処理可能かどうかの判定はプラグインごとに優先順位ありで、プラグイン内に優先度を記述しておく。
クラス継承 †
組み込み済みクラスを継承してプラグイン化。上位クラスと同じ扱いをされるように。下位クラスを知っているクラスからはそのクラスとして扱われるように。
使い方2種類 †
ls→ページ名リストを生成。パラメーターとしてはページセットを生成。
書かれた場所…コンテキスト、文脈。文脈次第で型が変わる。意味は変わらない。使いにくくなるので。
使い方が2種類あっても実体は同じ †
どちらの使われ方でもWikiNotationを返す。それが何に埋め込まれるかはフレームワークが決める。
実装はインターフェイス。
イベントハンドラーのようなもの。
ユーザーからのリクエストで呼ばれるだけのプラグインでも、ページに書かれたときに自身を呼ぶリンクやボタンを生成するようにすれば使いやすくなる。
リクエストからの直接呼び出しでもネスト可能に †
PukiWikiのコマンド型プラグインのように、ページに書かずに使う場合でもネスト可能に。一時的なページを生成してもいい。
またはデリゲート可能に。最後に呼ぶもの以外はデータコンテキスト。
URLクエリーは一時的ページ †
URLクエリーもページと
同じように解析、展開。
使い方も実装も統一できる。
MVC †
- M
- いくつでも。(複数クラス、複数ファイル)
名前などすべて利用者の任意。 - V
- いくつでも。
Mと同じように任意。 - C
- プラグインのエントリーポイント。
同プラグインのMとVを呼び出す。
名前に規則あり。フレームワークから呼び出しやすくするため。
C(前)とC(後)がある。
フレームワーク | → | 1.C(前) | → | 2.M、Vなど | ||
→ | 3.子のC(前) | → | 4.子のM、子のVなど | |||
→ | 5.子のC(後) | → | 6.子のM、子のVなど | |||
→ | 7.C(後) | → | 8.M、Vなど |
深さ優先の呼び出し。