フレームワーク/WikiEngineの実装案。

  1. 全体
    1. フレームワーク/WikiEngine
      1. 流れ
      2. 実装案
  2. ユースケースを実行するとき
    1. ユースケース
      1. :i/ユースケーススコープ
      2. :/ユースケースチェイン
    2. 認証
      1. :t/利用者と:t/アカウントの利用
  3. ページ構築時
    1. 呼び出すページを特定する
      1. 順不同パス
    2. ページ/属性の用意
    3. ページの復帰/構築
      1. :i/名前の同一視#sa0f0121
      2. ページ名もセレクターで
    4. 記法
      1. 記法の仕組み
      2. 記法の優先順位
      3. WikiTextから得られるページ/要素
      4. :i/Tokenize対象はNotationText
  4. ページ構築後、要素を呼び出すとき
    1. 要素指定はセレクター/全てURIで
      1. 参照記法は不要
      2. :i/API向けパーマリンク
    2. ページ/要素の導入と呼び出す仕組み
      1. プラグイン
      2. :/プラグインが使えるフック
    3. ページ/要素に提供するもの
      1. :i/ページ要素間の連携方法[?]
      2. :i/要素に書き込む方法
      3. :i/クラス別のセッションデータ
      4. :i/要素のインスタンスID
      5. :i/ページのイテレーター
      6. :i/要素がページに記述されたとき、Chain of Responsibilityで?
    4. レンダリング
      1. :i/フレームワーク/WikiEngineからの出力をレスポンスにする
      2. :i/ToWikitextはそのまま返す
      3. :i/URLクエリーに置くデータ
      4. :i/ページタイトルにビュー別接頭辞
      5. レスポンスのコンテキスト
  5. ページができあがってから
    1. ページの組み合わせ
      1. 下位展開
      2. :i/スタイルシートをページから生成
      3. :/負荷軽減のため編集後の更新処理を分割
  6. ユースケース別
    1. 編集/削除
      1. :Done/ページ削除のUI
  7. あとで

全体 Edit

フレームワーク/WikiEngine Edit

フレームワーク/WikiEngine#be46ac08:『WikiEngineとは』

流れ Edit

  1. 利用者 → フレームワーク/Webアプリケーション
    クライアントアプリとユーザーエージェントの役目。リクエスト。
  2. フレームワーク/Webアプリケーション → フレームワーク/WikiEngine
    クエリーの解析、セッションの用意など。
    :i/プロトタイピング#d19defef:『フレームワーク間の関係』
  3. フレームワーク/WikiEngine → ページと要素
    セッションページなどページ/要素のための環境を用意。ページが持つWikiTextからページ/要素の生成。
  4. ページ → ページ/要素
    ページでやること
  5. ページ/要素(各種機能)
    ページ/要素でやること
  6. フレームワーク/WikiEngine → フレームワーク/Webアプリケーション → 利用者
    レスポンスをデコレーションしてそれぞれふさわしい形式にして。
    :i/プロトタイピング#d19defef:『フレームワーク間の関係』

実装案 Edit

X

ユースケースを実行するとき Edit

ユースケース Edit

ユースケースは機能拡張の中にもあるクラス。
プラグインの呼び出しに権限判定を付けるならユースケースクラスも必要。
ユースケース内で権限判定をするのでページを扱うということ。ページの扱いはフレームワーク/WikiEngineでやること
ユースケースビューページ)との関係が強いのでフレームワーク/WebアプリケーションではなくWikiEngineにする。フレームワーク/Webアプリケーションでもいい。

:i/ユースケーススコープ Edit

Controller = Usecase
その中だけで有効なデータ。

:i/クラス別のセッションデータ

:/ユースケースチェイン Edit

:/リクエスト時に選べるビュー
リクエストとレスポンスの分離。
…を一般化して複数のユースケースを連鎖させられるように。

認証 Edit

フレームワーク/Webアプリケーションフレームワーク/WikiEngine

フレームワーク/Webアプリケーションでやること:『フレームワーク/WikiEngine』

:t/利用者:t/アカウントの利用 Edit

:i/ログインはWebフレームワーク、ユーザー管理はWikiフレームワーク

フレームワークで扱うのはログイン認証)と、権限錠と鍵)の整合判定。

ページ構築時 Edit

ページ

呼び出すページを特定する Edit

順不同パス Edit

ページ/名前

ページ/属性の用意 Edit

ページ/属性
属性継承を行なうのはページの役割。
今のところ:/ページ/裏では継承なし。

ページの復帰/構築 Edit

記法(notation) → ページ/要素
ページを構築する方法。

:i/名前の同一視#sa0f0121 Edit

括弧書き記法ビルトインページ/要素

ページ名セレクター Edit

記法 Edit

記法の仕組み Edit

:t/機能とその実装である:t/要素、それを呼び出す:t/記法

:i/変換ルールはページ内で定義
:i/記法の書式

記法の優先順位 Edit

優先順位は表やリスト記法で特定のページに記述。
記述順が優先順。
正規表現→ページ/要素を複数記述。正規表現にもページ/要素にも重複があっていい。そうしたほうが設定しやすいし優先順位があるので解決できる。

WikiTextから得られるページ/要素 Edit

:i/Tokenize対象はNotationText Edit

NotationText解析・ページ/要素構築の仕組みを変更。

ページ構築後、要素を呼び出すとき Edit

ページページ/要素
ページ/要素ページ/要素 → …

ページ/要素

要素指定はセレクター全てURIで Edit

ページページ/要素
ページ/要素ページ/要素 → …

連携相手になるページ/要素を指定する方法。

参照記法は不要 Edit

全てURIで埋め込みで使えれば参照記法は不要。

:i/API向けパーマリンク Edit

全てURIで参照するための仕組み。
InterWikiName、InterIncludeでも使うのでUI(=API)。

ページ/要素の導入と呼び出す仕組み Edit

プラグイン Edit

プラグインの仕組みはフレームワーク/WikiEngineのもの。
最も多いのはページ/要素プラグイン

:i/プラグインは既存クラスのプラグイン版

:/プラグインが使えるフック Edit

不要。
要素が動くトリガーは状況に依らない。状況次第なのはそれ以降の要素内の処理。つまり要素次第。

ページ/要素に提供するもの Edit

フレームワーク/WikiEngineの主な機能は、利用者ページ/要素を扱えるようにすることと、ページ/要素を動作させること。

:i/ページ要素間の連携方法[?] Edit

:i/要素に書き込む方法 Edit

:i/クラス別のセッションデータ Edit

セッションをクラス間連携に使用するルール。
フレームワークの中で制御するので、個々の要素は値名と値を用意するだけ。簡単不自由なI/F.

フレームワーク/WikiEngineでやること:『ページ要素間の連携方法』

:i/要素のインスタンスID Edit

getElementById()のようなAPIに必要。

:i/ページのイテレーター Edit

ページ/要素のスキャンはVisitorパターン。その中でページ/要素のイテレーター(とは言ってもページ/要素の機能)を使っている。
例えば検索にヒットしてページのプレビューテキスト取得に。

(要素でなく)ページのイテレーターならPage/Factoryが提供するといい。いろいろな順番で。ページ間に構造はないのでページ内容は反映しなくていい。イテレーターになる。

:i/要素がページに記述されたとき、Chain of Responsibilityで? Edit

→すべての要素がResponsibilityになる。ネスト構造になっている要素は親要素から子要素が呼ばれるのでChainではある。
ページに記述されてないとき(リクエストのクエリー文字列に記述されたとき)も同じ処理になるよう工夫。

:i/要素がページに記述されたとき、Chain of Responsibilityで

レンダリング Edit

ページページ/要素
ページ/要素ページ/要素 → …

形式変換/データコンテキスト反映。
フレームワーク/WikiEngineフレームワーク/Webアプリケーション

:i/フレームワーク/WikiEngineからの出力をレスポンスにする Edit

:i/ToWikitextはそのまま返す Edit

ToGenericNotationText()

:i/URLクエリーに置くデータ Edit

クエリー文字列にはよそに貼れるデータだけを。
年月が経っても有効なものを。

:i/ページタイトルにビュー別接頭辞 Edit

閲覧時には無印なのがポイント。コピペで再利用しやすくなる。

レスポンスのコンテキスト Edit

ページページ/要素コンテキスト別の出力をする。
そのページの出力形式はHTTPリクエストで決める。

:/ユースケースチェイン
出力付きユースケースの出力形式をリクエストで指定。
履歴をHTMLで/NotationTextで/印刷用HTMLで…。

実装は…
履歴ビューページ/要素で構築してからコンテキスト別変換。
差分の+ーマークもページ/要素で付けてからコンテキスト別変換。


編集ビューのRSS形式などもできる。

ページができあがってから Edit

ページの組み合わせ Edit

ページを複数組み合わせて1つのHTMLページを作る。

下位展開 Edit

ビューの問題。閲覧時以外にもページを扱う場面ならどこでも起こる。

:i/スタイルシートをページから生成 Edit

データアクセス可能なのは埋め込み解決後のページ
埋め込み前にアクセスできても煩わしいだけ。

WikiでWiki自身の設定を。

:/負荷軽減のため編集後の更新処理を分割 Edit

検索:永続化システム検索:永続化クラス)で実装。

ユースケース Edit

編集/削除 Edit

削除は編集の一種。

:Done/ページ削除のUI Edit

編集と削除には編集/承認を要する。モデレーション期間。

あとで Edit