• 追加された行はこの色です。
  • 削除された行はこの色です。
RIGHT:&tag(フレームワーク,実装,設計,コード,目次,更新中);
RIGHT:[[:t/X]] [[:t/用語]] [[:t/実装]] [[:t/Wiki]] [[:t/Web]]

ここで作っているWikiEngineについて。
既存のWikiEngineについては「[[WikiEngine]]」に。
ここで作っているWikiシステム(WikiEngineまたはWikiソフトウェアと呼ばれるもの)。

RIGHT:[[:t/別名]]

#br

*目次 [#cc67582c]
#contents
#br
#lsx(new=true);
#br

*関連 [#h79ad87b]
#related
#br
#lsx(tag=フレームワーク,new=true,except=^フレームワーク/WikiEngine(/.*)?$)
#br
[[検索:フレームワーク]] [[検索:WikiEngine]]
#br
----
*フレームワーク/WikiEngine [#w5cba04d]
RIGHT:[[:t/WikiEngine]]
**クラス構造 [#de2cc4d3]
***Actor [#jf1b5571]
リクエスト送信。PageNameとかUsecaseNameとかStepNameとかViewNameとか含む。
→fw/Web→fw/Wiki→Usecase
***X [#l30856d1]
フレームワーク/WikiEngineの実装。
***[[X/Usecase]] [#cb7aff3b]
プラグイン。
コントロールクラス。
WikiEngineから呼ばれる。リクエスト毎に別クラス。
MediaWikiの'Action'、PukiWikiの'cmd'にあたるものと一対一対応。
-権限判定
-閲覧
-編集

利用者から与えられたデータをページ化して保存するもの。
利用者からの要求に応じてページを切ったり貼ったりしてから見せる。
→User
***[[X/User]] [#b9d83f52]
利用者。
ページを扱うクラス。Userが扱うページを特に「利用者ページ」と呼んでおく。権限情報が書かれているので特殊。
データはページ化されているので、このクラスが無くても読み/書きできる。書くのは利用者。
存在意義が薄い。ただ利用者ページにデータアクセスするラッパーでしかない。
-鍵←UserID

→Page
***[[X/Page]] [#g329967c]
Wikiのデータを保存するもの。
利用者が手作業で書く。どういう記法を使うかでデータアクセス時の反応が違う。
属性を持つ。
URIでプラグインを呼んだときは仮のページ。その場合でも流れは同じ。
-錠(ユーザーページもそれ以外も)
-鍵(ユーザーページの場合)

*思い付き [#de986c8a]
→ Pages/Name
→ PageElement(記法に書かれると呼ばれる)

- 永続化
-- FlyweightFactoryでインスタンス生成
-- コンストラクターは非公開
***[[X/Pages/Name]] [#x2ca02b3]
ページ名。ValueObjectにするのが自然。

*実装 [#y3209a73]
 Page.rename(new Name(...))
 ページ名を変更するときはNameインスタンスを作り直す。
 ページ名変更時にやることがあるならrename()でできる。

**URLクエリーに置くデータ [#c57c9c46]
URLに付けるデータはネット上で共通のもののみ。
個人領域のデータ、状況に左右されるデータは置かない。
URLはどれもパーマリンクにすること。
-外部名4区分
--space
--entry
--opinion
--revision
-内部名
-永続名
主キーとしての内部名+検索用の外部名
†[[:i/永続化のキー]]
***[[X/Pages/Property]] [#q596b338]
ページ/属性。
属性/継承を行なう。
***[[X/Pages/ShadowProperty]] [#s06dc79c]
ページ/裏。
***[[X/永続化]] [#v4cae36a]
ページ以外も永続化。
データストアにはファイルシステム(flat files)使用。
-Page←PageName
-PageProperty←PageName
-Session←SessionID
***[[X/Element]] [#zf1683e9]
ページの構成要素。
記法から生成したオブジェクト。各種記法や一続きのプレーンテキスト部分などが1つのオブジェクトになる。
ElementがElementの集約にもなる。ネスト構造。

というわけで、
-検索/クエリー
→PageElements
***[[X/Elements]]/… [#yaac2625]
PageElementのサブクラス。プラグインはNotations系/Semantics系/DynamicNotations系/Plains系。
-レイアウトもテンプレートもビューも下位展開付きビューも
-セレクターも
-その他要素全て
***[[X/Elements/Notations]]系 [#j1b8ea74]
記法を統一する抽象クラス。
***[[X/Elements/DynamicNotations]]系 [#o22fb640]
例えば自動リンク。
記法はあるが決まっていないもの。
***[[X/Elements/Semantics]]系 [#t78923ec]
検索でスコアを上げる記法。
数詞やカラーコードなど。
***[[X/Elements/Plains]]系 [#pa9cdd73]
ただのテキスト。
***[[X/Plugins]]/... [#a5a76337]
いろいろなプラグイン型。
-X/Plugins/Elements/...
--X/Plugins/Elements/Notation
記法を当てたり汎用記法から使うもの。
--X/Plugins/Elements/Semantic
検索スコア用の記法。正規表現で表現。
--X/Plugins/Elements/DynamicNotation
自動リンク系の。
--X/Plugins/Elements/Plain
ただのテキストの別解釈をしたいときに。文字同一視とか。
-X/Plugins/Usecase
ユースケース。利用者からのリクエストに応えるもの。
-X/Plugins/Page
ページ/属性/型に対応するもの。

…はURLクエリーに含める。
**「次」や「前」という表現は使わない [#f4686b39]
新/旧、大/小などにする。
ソート順が分かる表現に。
**その他のクラス [#s4bb4f74]
#ls

RIGHT:[[:t/コンセプト]]
**やること [#idbaff1b]

***データ変換 [#j528038f]
テキスト→オブジェクト→HTML
オブジェクト→永続オブジェクト

もしWikiFormatやプラグインをまったく使えないWikiEngineを作ったら…
テキストを記録するだけ。
ファイル名とテキストを与えると記録、ファイル名のみならテキストを出力。

これにプラグイン独自のデータと処理を加えて、プラグインごとに違うHTML出力ができるようにする。
中心はプラグインを作るためのAPI。


***アカウント [#s0de27cc]
-ログイン、ログアウト
-UIとアカウントと権限設定
-アカウント管理

[[利用者]]


***派閥 [#h3dae9a5]
-ページの複製
-ページの統合
-アカウントとページの結び付け

[[派閥]]


***負荷軽減 [#se24e0c6]
→[[負荷]]

編集後の更新処理を分割。
+クエリー保存、ページ更新のキュー入れ
+対象となるページの更新、関連するページ更新のキュー入れ
+関連するページの更新(複数回)

RIGHT:[[:t/分割]]


*設計 [#abe64751]
-ユースケースをモデルに入れる。
RIGHT:[[:t/クラス]]
-ログインページの次はHTTP_REFERERにあるページ。
-ファイルはFlyweightであるべき。
-オブジェクトモデル上ではinclude.incのような機能を考慮しない。
include.incのような機能はデータコピーで実現。
-アクセスログはページの属性。
-利用者はページにある情報を元に作られる。
-ページが他のページインスタンス宛に編集クエリーを作る。
-検索はプラグイン化する。


**名称 [#v5422904]
-ページ→ページレット
-プラグイン→WikiFormat
**クラス間のつながり [#v3861373]
&ref(:Image/WikiEngine.gif);


**検索時、オブジェクト間のつながり [#y199566b]
&ref(:Image/コラボレーション図 検索.png);


**ページがHTML出力する時、オブジェクト間のつながり [#o3a14de6]
&ref(:Image/コラボレーション図 HTML出力.png);


**ページとプラグイン [#ued7bf04]
&ref(:Image/クラス図 ページ.png);


**モデルはページ中心 [#k89eb2e9]
-ページ中心
-MVCのVとCは決まりきっている
Mはページとページに関連するクラス。プラグインにはあるかも知れないし無いかも知れない。
Cはフレームワークと各プラグインにある。
フレームワークが持つVのクラスは1つだけ。それ以外にはプラグインが独自に持つかも知れない。
-要点はプラグインが持てる可能性
--トリガーの種類
〜の前/後、他のプラグインと比べたときの優先度、…
--出力箇所の種類
--呼び出し箇所、クライアント側スクリプト部分、ヘッダー、フッター、…

RIGHT:[[:t/クラス]]
**オブジェクトの生成 [#v2749f02]
&ref(:Image/コラボレーション図 オブジェクト生成.png);

-クラス名とインスタンスの対応はFlyweightFactoryが決める。


*コード [#f8ef9511]

[[プロトタイピング]]の実装。
**擬似言語 [#n2a0a895]
[フレームワーク/Webアプリケーションから呼ばれて…]
+セッションデータを受け取る。
+クエリーを処理する。
++ページを作っていろいろして保存したり、ページを開いていろいろする。
ページ作成をFlyweightFactoryに要求して、得られたページにクエリーを渡すだけ。
++ページをHTML化、永続化する。
+HTMLを返す。

**Perl [#e4ce3b1f]
[[code*:362]]

あとはX::Pageの永続化を。
プロトタイプではFlyweightFactoryを実装しない。
X::Pageのインスタンスは1つか2つでいい。