TiddlyWikiのソースを読む 続き2
$tw.modules = {
titles: {}, // hashmap by module name of moduleInfo
types: {} // hashmap by module type and then name of moduleInfo
};
このへんからモジュールシステムの話
続きを読むTiddlyWikiのソースを読む 続き1
boot.jsの続きから
/*jslint node: true, browser: true */
/*global modules: false, $tw: false */
なにかを説明するためのコメントではなさそうな雰囲気
jslintはJavaScript lintってことだろう
検索
JSLint: The JavaScript Code Quality Tool これか
ふむふむ
TiddlyWiki/Dev - ソースを読み始める
さて何から読んでみようか
あんまり人のコード読んだことないんでどこから手を付けていいのやらカンがない
まあ起動するところから順番に行ってみよう
bootprefix.jsってやつだな
っていうかこれがどうやって起動するんだ
最初はtiddlywiki.jsってやつか
#!/usr/bin/env node
こうやっても起動できるんだな
この時点でなにかデフォルトで読み込まれたりするんだろうか
TiddlyWiki/Dev - Conclusion
Conclusionまで来ました
とりあえず記事を読むのはここまでということで
- TiddlyWikiの中心部は裸のTiddlerストアとモジュールシステムを提供するマイクロカーネルのみ
- マイクロカーネルはJavaScriptで書かれており、ブラウザでもnode.jsでも動く
- コアプラグインは、マイクロカーネルにイベントシステムや、WikiTextを動的HTMLに変換するウィジェットシステムを追加する
- そういう作りだからカスタマイズ性が高い
- 機能を追加するだけでなく既存のモジュールを上書きすることもできる
- 多くの機能は直接モジュールを参照するのではなく、モジュールのタイプで参照するので、新しいセーバやウィジェット、WikiTextのルールなどを注入することができる
- TiddlyWikiのUIはWikiTextで書かれているので、Wikiのエントリを書いているのと同じようにUIもカスタマイズできる
マイナス面も
- コアプラグインにより、複雑性が増す
- マイクロカーネルは最小限の機能しか提供せず、プラグインが多くのコンポーネントを追加する
- そのため、コアアーキテクチャを分解してコンポーネントの関係を理解するのはなかなか難しい
- このドキュメントはもっとも重要な部分をカバーしているだけ
- 開発者は、マイクロカーネルの上にまったく新しいアプリを構築することも、コアプラグインの上にアプリを構築することもできる
まとめ
- TiddlyWikiは興味深いソフトウェアだ
- Tiddlerへのフォーカス、コアで提供される機能、そしてコア上に構築された本格的なWikiアプリケーションのおかげでTiddlyWikiは高度にカスタマイズ可能で完全な個人用情報管理システムとなった
- ライトユーザはタグやメタデータを用いて情報を整理し、WikiTextを用いてUIをある程度カスタマイズしたり、自分用のワークフローを作ったりできる
- JavaScript開発者は全く新しい機能やシングルページアプリケーションをマイクロカーネル上に構築したりコアプラグインをカスタマイズして作ったりすることができる
TiddlyWiki/Dev - Core Application (5)
TiddlyWiki Core Applicationの続き
トランスクルージョンとテキスト参照
TextReferenceとスペースなしの一単語として書いてあるからテキストリファレンスと書いたほうが雰囲気が出るだろうか
テキスト参照
- テキスト参照は指定されたTiddlerのフィールドの内容を間接的に参照する記法
<tiddlertitle>
とか<tiddlertitle>!!<fieldname>
とか!!<fieldname>
のように指定する- テキストを取得するには、
getTextReference
を使う
トランスクルージョン
- トランスクルージョンは、他のTiddlerの内容をインクルードすること
インクルージョンと言わずわざわざトランスクルージョンという名前をつけたのはなぜだろう
インクルードするよりも何かがすごいってことだと思うんだけれども
- トランスクルードウィジェットが対象のTiddlerをパーズしてその結果のノードを現在のパーズノードに付け加える
- カレントTiddlerは変更されない
- これによってテキスト参照付きのTiddlerをテンプレートとして利用することができる
- ListWidgetもテンプレートの考え方を用いている
- Wiki全体をダウンロードするときは、すべてのTiddlerのリストにテンプレートを適用してHTMLファイルにする
そんなことまでできるとはテンプレート恐るべし
ルートウィジェットとレンダリングスタートアップ
コアプラグインがTiddlerやWikiTextからどうやってUIを構築するか
- スタートアップでrootwidget.jsはベースウィジェットのインスタンスを生成する
- このウィジェットは
$tw.rootWidget
でグローバルに参照可能であり、ブラウザウィンドウのDOM(document
)に対応している - 生成直後はルートウィジェットは子ウィジェットを持たず、いくつかの基本的なイベントハンドラを提供する
- ルートウィジェットがロードされると、次は$:/core/modules/startup/render.jsがトランスクルードウィジェットを作る
- このウィジェットは$:/core/ui/PageTamplateの内容を含み、ブラウザのDOMに関連付けられている
- トランスクルードウィジェットを表示する関数が実行され、トランスクルードウィジェットの更新を行う関数をリスナーに登録する
-
$:/core/ui/PageTamplateをを使い、WikiTextで書かれたTiddlerのみからTiddlyWikiのUIが構築される
-
Open Wiki Pageのリストは、開いているTiddlerのリストを$:/StoryListフィールドに持ち、tm-navigate等のイベントを扱うNavigatorウィジェットによって実現されている
-
$:/core/ui/PageTemplateにトランスクルードされたストーリーTiddlerは、Listウィジェットを用いて$:/StoryListに含まれるTiddlerをトランスクルードする
-
tm-close-tiddler
タイプのイベントが発生すると、指定されたTiddlerが$:/StoryListから削除される
Core Applicationおわり
TiddlyWiki/Dev - Core Application (4)
TiddlyWiki Core Applicationの続き
- 動的な振る舞いはふたつの方法で追加できる
から
メッセージ
- メッセージはユーザによって発信されるイベントで、ウィジェットによって生成される
- "tm-delete-tiddler"といった型のプロパティを持つ
- メッセージは親へ親へと送られ、それぞれのウィジェットが処理を試みる
- 子ウィジェットは
dispatchEvent(message)
を呼んでウィジェットのツリーの上方へメッセージを送る addEventListner(type,listner)
は特定のメッセージタイプに関数を結びつける- リスナーがfalseを返したらメッセージは親ウィジェットへと送られる
- TiddleyWikiコアプラグインではNavigatorWidgetで多くのメッセージを扱う