• 追加された行はこの色です。
  • 削除された行はこの色です。
RIGHT:[[:t/Wiki]]
RIGHT:[[:t/Wiki]] [[:t/実装]]

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

#contents

***WikiEngineとは [#be46ac08]
ユーザーとページをつなぐもの。
利用者→フレームワーク/Webアプリケーション→フレームワーク/WikiEngine→ページ→ページ/要素(各種機能)
*全体 [#lef8be41]
**フレームワーク/WikiEngine [#e202a9a0]
→ [[フレームワーク/WikiEngine#be46ac08,WikiEngineとは]]

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

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

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

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

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

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

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

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

RIGHT:[[:t/URI]] [[:t/リクエスト]]
***ページのイテレーター [#vad5bbbb]
ページ/要素のスキャンはVisitorパターン。その中でページ/要素のイテレーター(これもページ/要素)を使っている。
例えば検索にヒットしてページのプレビューテキスト取得に。
***[[:/ユースケースチェイン]] [#b756a37d]
→ [[:/リクエスト時に選べるビュー]]
リクエストとレスポンスの分離。
…を一般化して複数のユースケースを連鎖させられるように。
**認証 [#xbe291c5]
フレームワーク/Webアプリケーション → フレームワーク/WikiEngine

ページのイテレーターならPage/Factoryが提供するといい。
いろいろな順番で。
→ [[フレームワーク/Webアプリケーションでやること,フレームワーク/WikiEngine]]

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

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

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

***ページに記述されたとき、Chain of Responsibilityで [#bc5af990]
リクエストされたページにある要素は全て呼ばれる。
その中でどのクエリーをどう使うかは要素次第なので、別にChain of Responsibilityでなくてもいい。全ての要素がResponsibility.
*ページ構築時 [#u7adde9a]
→ [[ページ]]
**呼び出すページを特定する [#x70f9df8]
***順不同パス [#w537315c]
→ [[ページ/名前]]

ページではなくURLクエリーに記述されたときもChain of Responsibilityではない。Chain(連鎖)はするけど。
**ページ/属性の用意 [#g83e2d6c]
→ [[ページ/属性]]
属性の継承を行なうのはページの役割。
今のところ[[:/ページ/裏]]では継承なし。
**ページの復帰/構築 [#u6fd46c3]
記法(notation) → ページ/要素
ページを構築する方法。
***[[:i/名前の同一視#sa0f0121]] [#s515ccc6]
括弧書き記法はビルトインのページ/要素。

Androidのインテントのようなものでもない。送り先を決めてパラメーターを用意。戻り値の型も要求する。
RIGHT:[[:t/ビルトイン]] [[:t/要素]]
***ページ名もセレクターで [#k6d7222d]

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

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

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

***フレームワーク/エラーメッセージにクラス名 [#y3fb5f7e]
エラーメッセージの書き方。
競合も矛盾もない。

エラーメッセージはエラー対処のためのUIでもある。
検索がサイト間のハブサイト、エラーメッセージはその検索へユーザーを誘導する。
RIGHT:[[:t/記法]] [[:t/要素]] [[:t/機能]]

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

RIGHT:[[:t/管理]] [[:t/開発]] [[:t/実装]]
***フレームワーク/Webアプリケーション/再送 [#of9bf0c9]
利用者の情報損失を防ぐ。リトライ可能に。使いにくくなるのを防ぐ。
RIGHT:[[:t/記法]] [[:t/管理]] [[:t/データアクセス]] [[:t/API]]

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

RIGHT:[[:t/エラー]] [[:t/UI]]
RIGHT:[[:t/記法]] [[:t/要素]] [[:t/リンク]] [[:t/検索]]

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

***機能/APIとは [#v9a941b9]
要素(機能の実装)がAPIを提供してもいい。制限しないだけ。サポートもしない。自由。
*ページ構築後、要素を呼び出すとき [#r72a8c66]
ページ → ページ/要素
ページ/要素 → ページ/要素 → …

→ [[ページ/要素]]

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

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

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

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

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

***ページ要素間の連携方法 [#sdf5bce0]
RIGHT:[[:t/URI]] [[:t/API]] [[:t/パーマリンク]]

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

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

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

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

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

***[[フレームワーク/WikiEngine/同一視#sa0f0121]] [#s515ccc6]
括弧書き記法はビルトインのページ/要素。
RIGHT:[[:t/要素]] [[:t/開発]]

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

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

***フレームワーク/WikiEngine/スタイルシートをページから生成 [#be33d4d8]
埋め込み後のページにデータアクセス。
埋め込み前にアクセスできても煩わしいだけ。
***[[:i/要素に書き込む方法]] [#l9138c6d]

WikiでWiki自身の設定を。


RIGHT:[[:t/設定]] [[:t/スタイル]] [[:t/埋め込み]] [[:t/データアクセス]]
***簡単なAPI [#c65a0538]
簡単不自由なAPIと、面倒自由なAPIの両方を用意。
引数の違い。

例えばページ/要素のコンストラクターを2種類用意。どちらかを定義すれば要素として使えるように。

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


***機能/API/テスト用コード [#q1e224ba]
インストール時に動くか確認。
管理者が改造したときにも使える。運用しやすくなる。

UIは…ページ/要素クラス別のページ(複数のバージョンがある場合は下位ページでも作って)にあるテスト実行ボタンで。
テストが複数定義されていればその数だけボタンを表示するように。リフレクション→UIに反映。
テスト環境をどう作るのか。テスト用コードだけでできる:t/?

RIGHT:[[:t/開発]] [[:t/API]] [[:t/管理]]


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

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


***クエリーにどう反応するか [#v2ea51d4]
要素の協調でリダイレクトをどう行なうか。:t/?

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

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

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

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

***プラグイン [#i6d4c004]
プラグインの仕組みはフレームワーク/WikiEngineのもの。
RIGHT:[[:t/データアクセス]] [[:t/要素]] [[:t/実装]]

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

RIGHT:[[:t/プラグイン]] [[:t/管理]]
(要素でなく)ページのイテレーターならPage/Factoryが提供するといい。いろいろな順番で。ページ間に構造はないのでページ内容は反映しなくていい。イテレーターになる。

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

***API向けパーマリンク [#k60b745d]
全てURIで参照するための仕組み。
InterWikiName、InterIncludeでも使うのでUI(=API)。
→[[:i/要素がページに記述されたとき、Chain of Responsibilityで]]
**レンダリング [#l2cc9409]
ページ → ページ/要素
ページ/要素 → ページ/要素 → …

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

RIGHT:[[:t/URI]] [[:t/API]] [[:t/パーマリンク]]
***[[:i/フレームワーク/WikiEngineからの出力をレスポンスにする]] [#v2df05ce]

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

***ページ/要素/UI [#k5398aa0]
拡張可能な要素のUIとは。
†[[UIを使うページ要素]]
***[[:i/URLクエリーに置くデータ]] [#i23dcd1f]
クエリー文字列にはよそに貼れるデータだけを。
年月が経っても有効なものを。

要素を呼び出すためのUIは記法。エディターと組み合わせて使う一大機能。
†[[記法]]
†[[汎用記法]]
RIGHT:[[:t/URI]]
***[[:i/ページタイトルにビュー別接頭辞]] [#l759d331]
閲覧時には無印なのがポイント。コピペで再利用しやすくなる。

RIGHT:[[:t/UI]] [[:t/要素]] [[:t/開発]] [[:t/記法]]
***[[:t/利用者]]と[[:t/アカウント]]の利用 [#w754de3e]
†[[ログインはWebフレームワーク、ユーザー管理はWikiフレームワーク]]
RIGHT:[[:t/閲覧]]
***レスポンスのコンテキスト [#mdf4e733]
ページもページ/要素もコンテキスト別の出力をする。
そのページの出力形式はHTTPリクエストで決める。

フレームワークで扱うのはログイン(認証)と、権限(錠と鍵)の整合判定。
→ [[:/ユースケースチェイン]]
出力付きユースケースの出力形式をリクエストで指定。
履歴をHTMLで/NotationTextで/印刷用HTMLで…。

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

----
編集ビューのRSS形式などもできる。
*ページができあがってから [#f18d722b]
**ページの組み合わせ [#xca978d2]
ページを複数組み合わせて1つのHTMLページを作る。

***記法 [#w848fd97]
[[:t/機能]]とその実装である[[:t/要素]]、それを呼び出す[[:t/記法]]。
***[[下位展開]] [#u989dc3a]
ビューの問題。閲覧時以外にもページを扱う場面ならどこでも起こる。

†[[記法の書式]]
†[[ページ/要素]] 
RIGHT:[[:t/ビュー]] [[:t/UI]]

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

WikiでWiki自身の設定を。

RIGHT:[[:t/記法]] [[:t/機能]] [[:t/要素]]
RIGHT:[[:t/設定]] [[:t/スタイル]] [[:t/埋め込み]] [[:t/データアクセス]]

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

***ページ [#kd5a13b1]
***下位展開 [#u989dc3a]
RIGHT:[[:t/編集]] [[:t/負荷]] [[:t/永続化]]
*ユースケース別 [#m53937ee]
**編集/削除 [#bad9852a]
削除は編集の一種。
***[[:Done/ページ削除のUI]] [#fcf50a8a]
編集と削除には編集/承認を要する。モデレーション期間。

*あとで [#f83f441b]
-[[履歴]]