## 概要
今のところ、ちょっとした処理には[[Templater]]を使っている。具体的には、[[🧊Obsidian Tempura]]を使って[[🦉Obsidian Templater Scripts]]を作っている。
[[🧊Obsidian Tempura]]は[[TypeScript]]を使って[[Hot Reload (Obsidian)|Hot Reload]]で[[Vault]]へのスクリプトデプロイまで同時に行えるような仕組みを作った。が、当然のことながら複数ファイル分割などには対応していない。
そもそも、今の[[🧊Obsidian Tempura]]は本来自分がやりたかったことなのか? [[Templater]]を使うなら[[🧊Obsidian Tempura]]のスクリプト群は便利だけど、[[TypeScript]]で開発したいならむしろ[[Obsidianプラグイン]]の仕組みを自分専用のプライベートプロジェクトで利用すればいいでは?
## 要件整理
本当にやりたいこと。
1. SimpleかつEasyに[[Obsidian]]に対して処理をしたい
2. [[TypeScript]]を使って堅牢に開発したい
3. 開発物は極力手間なしにデプロイ([[Vault]]へコピー)したい
4. コマンド設定やホットキー設定を気軽にしたい
5. バージョン管理したい
6. (可能なら) 部分的なパーツを気軽に共有したい
必要ないこと。
1. [[Obsidian]]上でスクリプトの編集ができること
2. [[Templater]]などの既存のエコシステムに乗っかること
3. 多くの人に利用してもらえるシステムを作ること
今後必要なこと。
1. ファイル分割 (複雑な処理の対応やモジュール化)
2. エディタがアクティブでないときの処理
3. 高度なUIの利用
4. 外部packageの利用
| 項目 | Tempura | Templater |
|-----------|---------|-----------|
| やりたい1 | O | O |
| やりたい2 | O | X |
| やりたい3 | O | O |
| やりたい4 | O | O |
| やりたい5 | O | X |
| やりたい6 | O | O |
| 必要ない1 | X | O |
| 必要ない2 | X | O |
| 必要ない3 | O | O |
| 今後必要1 | X | X |
| 今後必要2 | X | X |
| 今後必要3 | X | X |
| 今後必要4 | X | X |
『今後必要』の項目を実現させたい。逆に『必要ない』は切り捨てて構わない。
### Tempuraをどうするか?
[[🧊Obsidian Tempura]]の開発は停止する。あれは[[Templater]]に特化した仕組みになっており、共存させていくのは管理コストの観点からも非現実的。[[Templater]]の機能が必要なければ、大きな問題にはならない。まだalpha版で知名度もそこまでないだろうし。
### helper以下をライブラリとして切り離すか?
これは少し迷う。[[Obsidian]]周りのエコシステムを[[peer dependencies]]に持つライブラリはあってもいいと思う。
本質とはずれた理由として、helperだけなら[[Bun]]で開発できるというのもある。やはり[[Bun]]は使っていて気持ちいいし、今後キャッチアップし続けていきたい理由もある。
真っ当な理由としては、ライブラリを切り離して管理することで設計がキレイになり、再利用性も高まる。他の人でも使えるし、[[🧊Obsidian Tempura]]にももしかしたら使えるかもしれない。デメリットは管理がちょっと面倒なことくらいだ... が、ローカルで依存関係を作ってしまえば、その心配もいらないかもしれない。必要なときに単体で公開できる設計にしておくというラインが現実的な気がする。
### その構成は要件を満たすのか?
これまでのまとめはこうだ。
- helperクラス配下はライブラリとして切り出す
- 上記を使って自分だけのプラグインプロジェクトをつくる
このシステムを要件表に当てはめてみる。
| 項目 | Tempura | 今回のシステム |
|-----------|---------|----------------|
| やりたい1 | O | △ |
| やりたい2 | O | ◎ |
| やりたい3 | O | ◎ |
| やりたい4 | O | O |
| やりたい5 | O | O |
| やりたい6 | O | △ |
| 必要ない1 | X | X |
| 必要ない2 | X | X |
| 必要ない3 | O | X |
| 今後必要1 | X | O |
| 今後必要2 | X | O |
| 今後必要3 | X | O |
| 今後必要4 | X | O |
概ね目的は達成できそう。
### Obsidian Tempuraはそのままでもいいのでは?
[[🧊Obsidian Tempura]]のコードをベースにそぎ落としていこうとしたが...
冷静に考えたらTempuraはそのままでもいい気がしてきた。Tempuraを使ったObsidianプラグインプロジェクトが動けば。動かなかったらそのとき考えればいい。
ということで、[[🧊Obsidian Tempura]]を使って[[Obsidianプラグイン]]を作ってみる。
## 自分だけのObsidianプラグイン
### Bunで動くベースづくり
https://github.com/obsidianmd/obsidian-sample-plugin からテンプレとして生成。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" />
<span class="link-card-v2-site-name">GitHub</span>
</div>
<div class="link-card-v2-title">
GitHub - tadashi-aikawa/carnelian: Obsidianのプラグイン機能を使って、IncredibleなObsidian体験を実現するための機能を提供する宝石。紅玉髄(カーネリアン)。
</div>
<div class="link-card-v2-content">
Obsidianのプラグイン機能を使って、IncredibleなObsidian体験を実現するための機能を提供する宝石。紅玉髄(カーネリアン)。 - tadashi-aikawa/carnelian ...
</div>
<img class="link-card-v2-image" src="https://repository-images.githubusercontent.com/734207770/40b62f8b-1d6d-49d9-b4a7-efd688f64ced" />
<a href="https://github.com/tadashi-aikawa/carnelian"></a>
</div>
名前は[[🦉Carnelian]]。由来は宝石のカーネリアンから。[[Obsidian]]とは宝石繋がりという緩い理由。その中でもカーネリアンを選んだのは、軌跡好きなのでカーネリアに惹かれたのと、赤が好きなので。
意外と[[Bun]]ですんなり動くっぽいので、[[Bun]]のまま進める。
とりあえず動くハッシュは以下。
<div class="link-card-v2">
<div class="link-card-v2-site">
<img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" />
<span class="link-card-v2-site-name">GitHub</span>
</div>
<div class="link-card-v2-title">
GitHub - tadashi-aikawa/carnelian at f1f585019dc805169bb0c74e0a79b0891b791c3f
</div>
<div class="link-card-v2-content">
Obsidianのプラグイン機能を使って、IncredibleなObsidian体験を実現するための機能を提供する宝石。紅玉髄(カーネリアン)。 - GitHub - tadashi-aikawa/carnelian at ...
</div>
<img class="link-card-v2-image" src="https://repository-images.githubusercontent.com/734207770/40b62f8b-1d6d-49d9-b4a7-efd688f64ced" />
<a href="https://github.com/tadashi-aikawa/obsidian-plugin-for-tadashi-aikawa/tree/f1f585019dc805169bb0c74e0a79b0891b791c3f"></a>
</div>
### [[🧊Obsidian Tempura]]を取り入れてみようとしたが...
今回の目的の1つに[[Obsidianプラグイン]]のためのUtilityを構築することがある。これは自分だけのためではなく、多くの人に使ってもらえることを目指している。(そのようなことが可能な造りにするのが目的であり、使用者数を増やす活動をするつもりはない)
やはり無理そう。[[Templaterスクリプト]]前提で型をハックしているから、importがうまくいかない。別に作った方がよさそう。utilityを。
そうと分かれば[[🧊Obsidian Tempura]]はアーカイブする。さよなら。
### [[🧊Obsidian Tempura]]のエコシステムを[[🦉Carnelian]]に同梱
[[🧊Obsidian Tempura]]で作ったfucntionsやhelpersはそのまま[[🦉Carnelian]]でも使えるので利用する。
[[Templater]]を前提にする必要はないため、[[Bun]]で開発できれば極力シンプルな構成にできる。もし需要があれば、あとからライブラリとして切り出しても良い。
### 命名の重要ポイント
- アクティブファイルに関するものは`activeFile`をつける
- `get`は軽量アクセス、fileioが発生するなら`load`
- `void`を返す処理で失敗した場合は明示的に例外をthrowする