RIGHT:[[:t/Wiki]] [[:t/実装]]

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

#contents

*全体 [#lef8be41]
**フレームワーク/WikiEngine [#e202a9a0]
→ [[フレームワーク/WikiEngine#be46ac08,WikiEngineとは]]

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

***実装案 [#z799ea9d]
[[X]]

RIGHT:[[:t/Wiki]] [[:t/X]] [[:t/実装]]

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



***[[:i/ユースケーススコープ]] [#tf96b817]
Controller = Usecase
その中だけで有効なデータ。

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

***[[:/ユースケースチェイン]] [#b756a37d]
→ [[:i/選べるビュー]]
リクエストとレスポンスの分離。
…を一般化して複数のユースケースを連鎖させられるように。
**認証 [#xbe291c5]
フレームワーク/Webアプリケーション → フレームワーク/WikiEngine

→ [[フレームワーク/Webアプリケーションでやること,フレームワーク/WikiEngine]]

***[[:t/利用者]]と[[:t/アカウント]]の利用 [#w754de3e]
→ [[:i/ログインはWebフレームワーク、ユーザー管理はWikiフレームワーク]]

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

RIGHT:[[:t/Web]] [[:t/Wiki]] [[:t/ログイン]]

*ページ構築時 [#u7adde9a]
→ [[ページ]]
**呼び出すページを特定する [#x70f9df8]
***順不同パス [#w537315c]
→ [[ページ/名前]]

**ページ/属性の用意 [#g83e2d6c]
→ [[ページ/属性]]
属性の継承を行なうのはページの役割。
今のところ[[ページ/裏]]では継承なし。
**ページの復帰/構築 [#u6fd46c3]
記法(notation) → ページ/要素
ページを構築する方法。
***[[:i/名前の同一視#sa0f0121]] [#s515ccc6]
括弧書き記法はビルトインのページ/要素。

RIGHT:[[:t/ビルトイン]] [[:t/要素]]
***ページ名もセレクターで [#k6d7222d]

**[[記法]] [#a1753617]

***記法の仕組み [#w848fd97]
[[:t/機能]]とその実装である[[:t/要素]]、それを呼び出す[[:t/記法]]。

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


RIGHT:[[:t/記法]] [[:t/要素]] [[:t/機能]]

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

RIGHT:[[:t/記法]] [[:t/管理]] [[:t/データアクセス]] [[:t/API]]

***WikiTextから得られるページ/要素 [#i327c2f7]
-Notations
[[ページ/要素]]を表す記法
-AutoLink
[[自動リンク]]も記法。動的記法。
-Semantics
WikiTextを独占しない/消費しない記法
→ [[:i/検索用テキストを作るならページ要素で]]
-Plains
WikiText中の記法になっていない部分

RIGHT:[[:t/記法]] [[:t/要素]] [[:t/リンク]] [[:t/検索]]

***[[:i/Tokenize対象はNotationText]] [#fed7ca6f]
NotationText解析・ページ/要素構築の仕組みを変更。

*ページ構築後、要素を呼び出すとき [#r72a8c66]
ページ → ページ/要素
ページ/要素 → ページ/要素 → …

→ [[ページ/要素]]

**要素指定はセレクター/全てURIで [#dc8493ae]
ページ → ページ/要素
ページ/要素 → ページ/要素 → …

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

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

RIGHT:[[:t/URI]] [[:t/埋め込み]] [[:t/要素]]

***[[:i/API向けパーマリンク]] [#k60b745d]
全てURIで参照するための仕組み。
InterWikiName、InterIncludeでも使うのでUI(=API)。

RIGHT:[[:t/URI]] [[:t/API]] [[:t/パーマリンク]]

**ページ/要素の導入と呼び出す仕組み [#b3132b75]

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

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

RIGHT:[[:t/プラグイン]] [[:t/管理]]

***[[:/プラグインが使えるフック]] [#hd18a058]
不要。
要素が動くトリガーは状況に依らない。状況次第なのはそれ以降の要素内の処理。つまり要素次第。

RIGHT:[[:t/要素]] [[:t/開発]]

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

***[[:i/ページ要素間の連携方法]] [#o15b3863]

***[[:i/要素に書き込む方法]] [#l9138c6d]

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

→ [[フレームワーク/WikiEngineでやること,ページ要素間の連携方法]]

RIGHT:[[:t/API]] [[:t/セッション]] [[:t/Wiki]] [[:t/セッション]]

***[[:i/要素のインスタンスID]] [#b1ca6fdf]
getElementById()のようなAPIに必要。

RIGHT:[[:t/データアクセス]] [[:t/要素]] [[:t/実装]]

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

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

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

→[[:i/要素がページに記述されたとき、Chain of Responsibilityで]]
**レンダリング [#l2cc9409]
ページ → ページ/要素
ページ/要素 → ページ/要素 → …

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

***[[:i/フレームワーク/WikiEngineからの出力をレスポンスにする]] [#v2df05ce]

***[[:i/ToWikitextはそのまま返す]] [#z1837b75]
ToGenericNotationText()

***[[:i/URLクエリーに置くデータ]] [#i23dcd1f]
クエリー文字列にはよそに貼れるデータだけを。
年月が経っても有効なものを。

RIGHT:[[:t/URI]] [[:t/リクエスト]]

***[[:i/ページタイトルにユースケース別接頭辞]] [#l759d331]
閲覧時には無印なのがポイント。コピペで再利用しやすくなる。

RIGHT:[[:t/閲覧]]
***レスポンスのコンテキスト [#mdf4e733]
ページもページ/要素もコンテキスト別の出力をする。
そのページの出力形式はHTTPリクエストで決める。

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

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

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

*ページができあがってから [#f18d722b]
**ページの組み合わせ [#xca978d2]
ページを複数組み合わせて1つのHTMLページを作る。

***[[下位展開]] [#u989dc3a]
ビューの問題。閲覧時以外にもページを扱う場面ならどこでも起こる。

RIGHT:[[:t/ビュー]] [[:t/UI]]

***[[:i/スタイルシートをページから生成]] [#be33d4d8]
データアクセス可能なのは埋め込み解決後のページ。
埋め込み前にアクセスできても煩わしいだけ。

WikiでWiki自身の設定を。

RIGHT:[[:t/設定]] [[:t/スタイル]] [[:t/埋め込み]] [[:t/データアクセス]]

***[[:i/負荷軽減に編集後の更新処理を分割]] [#y453f2be]
[[検索:永続化システム]]([[検索:永続化クラス]])で実装。

RIGHT:[[:t/編集]] [[:t/負荷]] [[:t/永続化]]

*ユースケース別 [#m53937ee]
**編集/削除 [#bad9852a]
削除は編集の一種。
***[[:Done/ページ削除のUI]] [#fcf50a8a]
編集と削除には編集/承認を要する。モデレーション期間。

*あとで [#f83f441b]
-[[履歴]]
-[[:i/UI/編集]]