フレームワーク/WikiEngineの実装案。
全体 †
フレームワーク/WikiEngine †
→ フレームワーク/WikiEngine#be46ac08:『WikiEngineとは』
流れ †
- 利用者 → フレームワーク/Webアプリケーション
クライアントアプリとユーザーエージェントの役目。リクエスト。 - フレームワーク/Webアプリケーション → フレームワーク/WikiEngine
クエリーの解析、セッションの用意など。
→ :i/プロトタイピング#d19defef:『フレームワーク間の関係』 - フレームワーク/WikiEngine → ページと要素
セッションページなどページ/要素のための環境を用意。ページが持つWikiTextからページ/要素の生成。 - ページ → ページ/要素
ページでやること。 - ページ/要素(各種機能)
各ページ/要素でやること。 - …
- フレームワーク/WikiEngine → フレームワーク/Webアプリケーション → 利用者
レスポンスをデコレーションしてそれぞれふさわしい形式にして。
→ :i/プロトタイピング#d19defef:『フレームワーク間の関係』
実装案 †
ユースケースを実行するとき †
ユースケース †
ユースケースは機能拡張の中にもあるクラス。
プラグインの呼び出しに権限判定を付けるならユースケースクラスも必要。
ユースケース内で権限判定をするのでページを扱うということ。ページの扱いはフレームワーク/WikiEngineでやること。
ユースケースはビュー(ページ)との関係が強いのでフレームワーク/WebアプリケーションではなくWikiEngineにする。フレームワーク/Webアプリケーションでもいい。
:i/ユースケーススコープ †
Controller = Usecase
その中だけで有効なデータ。
:/ユースケースチェイン †
→ :/リクエスト時に選べるビュー
リクエストとレスポンスの分離。
…を一般化して複数のユースケースを連鎖させられるように。
認証 †
フレームワーク/Webアプリケーション → フレームワーク/WikiEngine
→ フレームワーク/Webアプリケーションでやること:『フレームワーク/WikiEngine』
:t/利用者と:t/アカウントの利用 †
→ :i/ログインはWebフレームワーク、ユーザー管理はWikiフレームワーク
フレームワークで扱うのはログイン(認証)と、権限(錠と鍵)の整合判定。
ページ構築時 †
→ ページ
呼び出すページを特定する †
順不同パス †
→ ページ/名前
ページ/属性の用意 †
→ ページ/属性
属性の継承を行なうのはページの役割。
今のところ:/ページ/裏では継承なし。
ページの復帰/構築 †
記法(notation) → ページ/要素
ページを構築する方法。
:i/名前の同一視#sa0f0121 †
ページ名もセレクターで †
記法 †
記法の仕組み †
:t/機能とその実装である:t/要素、それを呼び出す:t/記法。
記法の優先順位 †
優先順位は表やリスト記法で特定のページに記述。
記述順が優先順。
正規表現→ページ/要素を複数記述。正規表現にもページ/要素にも重複があっていい。そうしたほうが設定しやすいし優先順位があるので解決できる。
WikiTextから得られるページ/要素 †
- Notations
ページ/要素を表す記法 - AutoLink
自動リンクも記法。動的記法。 - Semantics
WikiTextを独占しない/消費しない記法
→ :i/検索用テキストを作るならページ要素で - Plains
WikiText中の記法になっていない部分
:i/Tokenize対象はNotationText †
NotationText解析・ページ/要素構築の仕組みを変更。
ページ構築後、要素を呼び出すとき †
ページ → ページ/要素
ページ/要素 → ページ/要素 → …
→ ページ/要素
要素指定はセレクター/全てURIで †
ページ → ページ/要素
ページ/要素 → ページ/要素 → …
参照記法は不要 †
:i/API向けパーマリンク †
全てURIで参照するための仕組み。
InterWikiName、InterIncludeでも使うのでUI(=API)。
ページ/要素の導入と呼び出す仕組み †
プラグイン †
プラグインの仕組みはフレームワーク/WikiEngineのもの。
最も多いのはページ/要素のプラグイン。
:/プラグインが使えるフック †
不要。
要素が動くトリガーは状況に依らない。状況次第なのはそれ以降の要素内の処理。つまり要素次第。
ページ/要素に提供するもの †
フレームワーク/WikiEngineの主な機能は、利用者がページ/要素を扱えるようにすることと、ページ/要素を動作させること。
:i/ページ要素間の連携方法[?] †
:i/要素に書き込む方法 †
:i/クラス別のセッションデータ †
セッションをクラス間連携に使用するルール。
フレームワークの中で制御するので、個々の要素は値名と値を用意するだけ。簡単不自由なI/F.
→ フレームワーク/WikiEngineでやること:『ページ要素間の連携方法』
:i/要素のインスタンスID †
getElementById()のようなAPIに必要。
:i/ページのイテレーター †
ページ/要素のスキャンはVisitorパターン。その中でページ/要素のイテレーター(とは言ってもページ/要素の機能)を使っている。
例えば検索にヒットしてページのプレビューテキスト取得に。
(要素でなく)ページのイテレーターならPage/Factoryが提供するといい。いろいろな順番で。ページ間に構造はないのでページ内容は反映しなくていい。イテレーターになる。
:i/要素がページに記述されたとき、Chain of Responsibilityで? †
→すべての要素がResponsibilityになる。ネスト構造になっている要素は親要素から子要素が呼ばれるのでChainではある。
ページに記述されてないとき(リクエストのクエリー文字列に記述されたとき)も同じ処理になるよう工夫。
→:i/要素がページに記述されたとき、Chain of Responsibilityで
レンダリング †
ページ → ページ/要素
ページ/要素 → ページ/要素 → …
形式変換/データコンテキスト反映。
フレームワーク/WikiEngine → フレームワーク/Webアプリケーション
:i/フレームワーク/WikiEngineからの出力をレスポンスにする †
:i/ToWikitextはそのまま返す †
ToGenericNotationText()
:i/URLクエリーに置くデータ †
クエリー文字列にはよそに貼れるデータだけを。
年月が経っても有効なものを。
:i/ページタイトルにビュー別接頭辞 †
閲覧時には無印なのがポイント。コピペで再利用しやすくなる。
レスポンスのコンテキスト †
ページもページ/要素もコンテキスト別の出力をする。
そのページの出力形式はHTTPリクエストで決める。
→ :/ユースケースチェイン
出力付きユースケースの出力形式をリクエストで指定。
履歴をHTMLで/NotationTextで/印刷用HTMLで…。
実装は…
履歴ビューをページ/要素で構築してからコンテキスト別変換。
差分の+ーマークもページ/要素で付けてからコンテキスト別変換。
ページができあがってから †
ページの組み合わせ †
下位展開 †
ビューの問題。閲覧時以外にもページを扱う場面ならどこでも起こる。
:i/スタイルシートをページから生成 †
データアクセス可能なのは埋め込み解決後のページ。
埋め込み前にアクセスできても煩わしいだけ。
WikiでWiki自身の設定を。
:/負荷軽減のため編集後の更新処理を分割 †
検索:永続化システム(検索:永続化クラス)で実装。
ユースケース別 †
編集/削除 †
削除は編集の一種。