kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

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)に対応している
  • 生成直後はルートウィジェットは子ウィジェットを持たず、いくつかの基本的なイベントハンドラを提供する
    • tm-notify、tm-save-wiki、tm-auto-save-wiki、tm-download-fileなど
  • ルートウィジェットがロードされると、次は$:/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で多くのメッセージを扱う
続きを読む