Send to your Kindle ***概要図 [#g4797979] #ref(:Image/abstract.svg,100%) [[docs.google.com>https://docs.google.com/file/d/0B9sAsjPbXxUHY2ZoejRIS3lkSWs/edit?usp=sharing]] RIGHT:[[:t/コンセプト]] RIGHT:[[:t/プロトタイピング]] [[:t/実装]] 実装したものと実装のための情報。 このWikiを洗練させるための試作。 [[http://x.pmint.name/>http://x.pmint.name/]] ---------- #contents *** どこから実装するか [#y96d4987] MV*のモデル層の責務分担と構造(依存関係と多重度)から。でもXのモデルはページとページ/要素ぐらい。 その後は自由に、思いついた順に。 実現可能かはいつでもサンプルを作成して確認。 **プロトタイピング/05 [#k2612436] ***やること [#c8dac453] - ページの永続化と復帰 → [[フレームワーク/WikiEngine]] ページ/名前が必要。 - ページ/名前 X/Pages/Name 外部名4区分と内部名、順不同パス(4区分中の"Entry") - [[ビュー]]と[[テンプレート]] WikiEngineレベルでのビュー。 ページ/属性が必要。 - ページ/属性 属性の継承 権限の継承 データアクセスとデータコンテキスト(属性コンテキスト) X/Elementが必要。 - %%[[下位展開]]%% - %%[[プレビューモード]]%% %%セッションが必要。%% - %%セッション%% %%→ [[フレームワーク/Webアプリケーション]]%% %%認証が必要。%% - %%[[認証]]%% - X/Element 全てURIで、セレクター(参照記法) -- Tokenize -- 汎用記法%%、見出しに自動リンク%% - [[:i/プロトタイピング/p05]] *** プロトタイプ05+04+03 [#c32ec38c] 05の次。 ***概要図 [#g4797979] #ref(:Image/abstract.svg,100%) [[docs.google.com>https://docs.google.com/file/d/0B9sAsjPbXxUHY2ZoejRIS3lkSWs/edit?usp=sharing]] RIGHT:[[:t/コンセプト]] ***fw/Web [#c7404306] #ref(:Image/MVC.svg,100%) [[docs.google.com>https://docs.google.com/file/d/0B9sAsjPbXxUHdmJPc3hTR05SM0E/edit?usp=sharing]] RIGHT:[[:t/Web]] [[:t/実装]] ***クラス構成 [#ee07f455] #ref(:Image/p05.svg,100%) 各クラスのプラグインは書かない。 あとはVisitorをElement周辺に付け足すだけでクラスが揃う。 fw/WebApp → フレームワーク/UserAgent **資料 [#r6f203fe] ***フレームワーク [#hbeb9ad8] [[:t/Web]]フレームワーク部分と、その上の[[:t/Wiki]]フレームワーク部分。 ページ/[[:t/要素]]が動く環境を作る。 ユーザーからのリクエストを対応する要素に伝えて、その結果をレスポンスに変える。 ***権限 [#i5755127] 権限設定と表示。 [[:t/権限]]は「錠」と「鍵」の2種類。 [[:t/属性]]に書く。 [[:t/汎用記法]]で[[:t/埋め込み]]機能を呼び出して権限情報を表示。 ページとその属性名を全て[[:t/URI]]で指定・参照・ページ上にレンダリング。 ***下位展開 [#l0f753b1] [[:t/下位展開]]は複数のページをまとめて見せる機能。 対象になるページは[[:t/順不同]]な[[:t/名前]]での下位に位置するページ。 ページ間の[[:t/リンク]]も下位展開に対応する必要がある。 まとめられたページは[[:t/見出し]]として表示されるので、リンク先もそこへつなげなければならない。 ページごとに[[:t/権限]]判定と[[:t/代表]]の適用が必要。 ***プレビューモード [#vf775f50] [[:t/プレビュー]]モードは[[:t/名前]]の補完ルールに細工をすることで実現。 タイムマシンモードも同じ発想。 まだ投稿していないページは[[:t/セッション]]に一時保存。 セッションの実体は特殊な[[:t/ページ]]。一時的ではあるが[[:t/永続化]]することになる。 プレビュー中も[[:t/下位展開]]はある。 **紹介 [#c1c2ce6d] 相変わらずページの保存が出来ないバージョン。 サンプルデータとして http://wiki.pmint.name/ のページをインポートしてみた。 ***実装したこと [#e98d503c] -下位展開 このシステムはページが他のページを含むツリー構造になっている。1つのページに含まれるページ階層を深い階層まで一括表示。 -下位展開を利用した自動リンク先 深い階層のページは浅い階層の一部(見出し)として表示されるので、素直にはリンクしない。[[浅いページ/深いページ]]を、浅いページ#深いページへのリンクに。 -プレビューモード 編集プレビュー中に他のページを開いて、編集の影響を見ることが出来る。「仮の未来」を見る機能。 -タイムマシンモード 過去のある時点でのWikiを再現。「実在した過去」を見る機能。 -アクセス制御 アクセスコントロール。ページ側に「錠」となる属性、ユーザー側に「鍵」となる属性を与えて随時適合するかどうか判定。適合することを各ユースケースの事前条件に。 -リンク一覧 内部リンク(同一Wiki内リンク)のリンク先一覧。リンクの属性「関連名」でフィルタリング。これで「あるユーザーが閲覧できるページ一覧」と「あるページを閲覧できるユーザー一覧」を生成。 記法は特に考えず#links(リンク先のほう|リンク対象テキストのほう|全部) ***そのほか [#obc2415b] -multi-gram 自動リンク処理で行なっていた”bi-gramを使ったページ名探索”。連続する2文字をインデックス化していたが、数字列では1つのキーに集まり過ぎ、漢字を使う単語では分散し過ぎだったので、文字種により0文字から3文字を使うよう変更。 ***実装方法 [#he0bc323] -ページ作成フォーム記法 新規ページ作成の入力欄生成。入力受け付け、ページ生成。 とりあえず #newpage() [Notationsにクラス作成] -自動リンクの下位展開対応[Autolink] /ページ名#セクションID リンク対象文字列が /セクション名/ページB/ページA ならリンク先は /ページA/ページB#セクションID /ページ名#セクションIDでもリンク対象になるように。リンク先をコピペしてもリンクするように。 -ページ名を4区分に[Pagename] Wiki, Entry, Side, Revision --代表 4区分それぞれに補完ルールがある Wiki Entry Side Revision --内部名、メジャーIDになるのはEntryだけ(ユーザーが指定するので) [Pagename] PageFactoryで扱うのは内部名 --下位展開 セクション記法(見出し記法、ページタイトル記法)[PageElement、ページ生成時] とりあえず /^==/ セクション記法はページのもの。セクションのものではない。 -ページ→ページ(→セクション0〜1コ) Compositeパターン -閲覧時展開[Section.toHtml()]/編集時展開[Section.toWikitext()] --権限、錠と鍵 どちらもページ属性で 錠はページ、鍵はユーザーが持つ 権限があるとき見出し+下位の内容、権限不足時は見出しだけ。 ページ名はページ内容と編集権限が異なる。接頭辞属性を含むので。 --下位の代表見解を展開[Pagename] ・ページ属性(ページ属性記法) 属性の自動リンク[Autolink.toHtml()] --情報配置 錠と鍵(権限)の表示は参照記法を配置して ページ参照と関連名フィルタリングをするPageElement、それを配置 -プレビューWiki [Pagename、Wikiを明示指定] Previewモード 指定されたWikiにページが無ければ、デフォルトWikiのページを使う。 デフォルトWikiにも無ければ、指定されたWikiでページが存在しない処理。 -タイムマシンWiki [Pagename、版の補完方法で](プレビューとは実装方法が違う) Back way to ... モード 日時指定→版の補完時に版番号に置き換え 日時指定用のUI: 版の中から選択、あらかじめページ名と見解が指定されていないと ページ(Entry)が無ければ、普通にページが存在しないときの処理。 ---------------------------------------- - Notation→ElementでPukiWikiのようにRegex1回にしないのはネストを可能にするため。Notationのネストを内側から探すのも同じNotationをネスト可能にするため。 「C#に依存するコードが増えてきましたが」 - ウィキエンジンXのページを自動リンク **そのうちやること [#fcfe5f45] ***自動リンク [#n5ac218c] -自動リンクルール 相対パス→絶対パス変換に一手間加えたもの。 -メタページ生成ルール ***アカウント [#s0de27cc] -利用者のログイン/ログアウト -アカウント管理 **フレームワーク間の関係 [#d19defef] HTMLを要求するのはフレームワーク/Webアプリケーションのほう。 WebアプリケーションはWikiEngineを3回呼ぶ。 +エントリーポイント +フレームワーク/Webアプリケーション Xオブジェクトを生成。 +フレームワーク/WikiEngine Xオブジェクトを作る(だけ)。 +フレームワーク/Webアプリケーション Xオブジェクトにリクエストを伝える(そのまま渡すのではなく、変数の形で) +フレームワーク/WikiEngine 自身の状態を変化させる。状態は永続化する。 +フレームワーク/Webアプリケーション XにHTMLを要求。 +フレームワーク/WikiEngine HTMLを生成。 +フレームワーク/Webアプリケーション HTMLにヘッダーを付けてWebページ化。 **排他制御 [#q6171bfe] 永続化クラスを排他制御不要な方式に。 モデル系クラスでは自分で自身を書き換える。他のクラスを扱うのはPageFactoryくらい。 RIGHT:[[:t/Web]] [[:t/ロック]] **実装からTips作成 [#h19c72ba] 実装からTips作成、よりよいコードのヒント集め。 実装以外にも、アイデア、方式、UIなどでも。 **仕様の分け方 [#k3a05217] フレームワークは空気。ページが本体でユーザーがそれを利用できるようにするのがフレームワークの役目。 UIの内訳 1. 読みUI ページ/履歴含む。 2. 書きUI エディターなども。 3. 探しUI 検索の他に関連情報やおすすめの類も。 4. 組み立てUI 管理とWiki構築。テンプレートやデータコンテキストなどページ/要素を使ったプログラミング部分。 RIGHT:[[:t/プロトタイピング]] **PageElement系クラス [#b0ce6d60] RIGHT:[[:t/実装]] [[:t/ページ]] - Wikitext 処理前の文字列状態。 stringをPageElementとして扱えるようにするクラス。stringからPageElementツリーを作るクラス。 @done - Document 1ページに1つだけ。PageElementツリーのルート要素。 - Notation系 -- Nestable系 @done 中に他のPageElementを含むことができる。 @done - Autolink 自動リンク。Plaintextを含む。 - Plain系 Plaintextを末端とするネスト構造。Plain系のなにか→Plain系のなにか→Plaintext。 Plaintextは別。PageElements構造の末端。 **ページの設計 [#r92e4bf8] 物理: - 領域 テキストファイルを複数組み合わせて1ページ 保存しなければならないのは投稿されたままのデータ - 表 - 属性領域 - 本文 - 裏 - 属性領域 - 書き込みキュー - 1トランザクションのなかでキューをページに反映 - 最新版 キューを全て反映したページ - 現在版 古いかも?参照用 - キューの内容は新しいページそのもの 差分ではなく単体で新しいページになれる。処理の単純化のため。 反映時は全面書き換え。 ────────────────── 属性: ページの属性はただNotationを書くだけ。参照時に内容と統合されて1つのelement構造になる。書くところが分かれているだけ。 - 裏 - 内部名 - 凍結 凍結してるか?はページ/属性。 編集不可能→編集権限を無視してどんな場合も権限なしと判断。 凍結解除してから編集、再凍結までを一度に行うことで編集可能に見せることはできる。 編集ビューは凍結されていても閲覧権限で見られる。 - 不特定多数には非公開属性=特定者にのみ公開属性 公開範囲別に複数の属性になる? - 隠し属性、ページ名が明示されたときに見える。 - 古い自動生成ページを自動更新 - 自動更新間隔。elementが更新間隔を持つ。更新はページごとなので、ページ内で最も短い間隔で自動更新。自動生成ページだけでなく一般化。 ページの属性 - 基本がリンクか埋め込みか。という属性。 - 属性値を書く欄。ほかにページ名の接頭辞も属性値の一部。 ───────────────────── 内容: - 見出し始まり、無ければ自動で作る - ページの分割、統合、入れ替え支援 - バックリンク - ウォッチリスト - Web標準 - 更新日時一覧には編集対象ページ(編集対象としてパラメーターになったページ)と、実際に更新されたページの両方を載せる。 できること: - 自分宛のクエリーを読める - 自分宛のクエリーはHTML出力で作る - 添付ファイルもページ化 - HTMLテンプレートもページに書く - データベースでもある。elementクラス別のデータベースでもある。 - サイトのアクセスログでもある。ページに記録 - クリップボードでもある。 - 多階層ビュー、埋め込みのネスト。html1ページはヘッダーやシステムメッセージ領域など、複数層の埋め込みでできている。 - 存在しないページはない - 更新できるのは自身だけ。遅延書き込みと前バージョン参照 - DOMアクセス 名前で3層組み合わせ: 内部名と表示名 項目→ディレクトリ、見解→ディレクトリ、版→ファイル 内部名を使って 版、見解はページの応用。 - 代表 ワイルドカードを使った一覧から1つ選ぶ仕組み。 - ワイルドカードで一覧 ワイルドカードを使った不完全な指定、で、代表を要求しない - 項目指定なし、つまり何にもなしのリスト要求 全ページ一覧 代表要求するとルート(FrontPage) - 見解指定なしのリスト要求 見解一覧 投稿できないので、一覧は表示だけ。 代表要求すると有力見解←投票で - 履歴指定なしのリスト要求 版リスト 投稿できないので、履歴一覧表示だけ。 代表要求すると最新版 履歴(版だけ組み合わせ): 履歴はモデルに含めない。履歴はワイルドカードを使って検索した一覧。 - 2履歴間の差分 - 最新の差分は閲覧ビューでも強調 クライアント側で - 編集履歴(差分)表示 異なる見解の最新版比較(差分表示)も? 通常の差分は同項目・同見解・異版間のもの。 下位: - 属性の継承 下位展開と関係ある? - 属性の継承、下位ページに - 下位展開(閲覧時/編集時) 下位ページ展開 - 下位ページの更新は上位の更新日時を変えない。更新日時一覧に上位ページ名も載せる。それで同じ効果。 投票: 見解に投票 ───────────────────── Archive: - 複数のビュー。elementクラスごとに分ける・分けない、どれとどれが同じかなどいろいろ。 @done @project(できること) 版、履歴: @done @project(物理 / 版、履歴 @done) Merge可能かどうかをインターフェイスで。: @project(Merge可能かどうかをインターフェイスで。) @done インスタンス生成せずに呼び出すメソッドはインターフェイス化できない。 **プロトタイピング/ [#a92d6529] #ls