## ロジック
- ファイルが開かれた直後、[[#ファイルの内容]]をメモリに保存する
- 保存コマンド `saveWith`
### Linterの挙動
1. Property Linter (autofix あり)
- autofixはpropertyにしか変更しないから本文変更をupdatedの対象とするなら気にしなくていい
- それでいい気がする...
2. Content Linter (autofix なし)
### AddDatePropertiesServiceに入れたほうがいいかも?
**結論: ✅YES**
- `AutoDatePropertiesService` に名称を変更
- 作成と更新の両方で機能する
- Linterではなく別のサービスにしたのは?
- メリット
- created/updated プロパティのロジックを集約できる
- **事前の状態を保存しておき差分で評価する** 必要があるのでLinterではない
- デメリット
- 通知を右下で行いたい場合、Linterの通知が上書きされそう
- 右上のNotificationなら問題ない
- プロパティを自動更新するという点では一貫性が弱いかも?
- Linterでautofixが入った場合を考慮できない
- 入った/入ってない どちらの場合でもうまく動かす必要あり
- ただ **property linter でないとauto fixない** & **propertyは見ない** ので問題ないはず
- AddDatePropertiesService を消してLinterに集約できる可能性?
### 起動後にactiveFileEssentialBodyがnullになる問題
```ts
/**
* ファイルを開いたときに実行する処理を設定します
* handlerのfile引数は、タブグループのファイルが存在しない場合はnullになります
*
* @returns 処理の解除処理
*/
export function setOnFileOpenEvent(
handler: (file: TFile | null) => any,
ctx?: any,
): () => void {
const ref = app.workspace.on("file-open", handler, ctx);
return () => {
app.workspace.offref(ref);
};
}
```
が起動直後に開かないから。
[[ワークスペース (Obsidian)|ワークスペース]]が開かれたイベントを検知できればそれでよさそう。active fileから取得できればいいし。
`onLayoutReady` で拾えば良さそう。
### ファイル名が変わった場合にそのリンクを含むファイルは変わらない
アクティブエディタに入ったタイミングがbeforeとして認識されるが、ファイル名変更によってリンク部分が変わる時、通常はアクティブエディタにはなっていないので。
これは一見制限事項に見えるが、実際は好ましい挙動と言える。リンク先のファイル名が変更されたとき、リンク元のファイルupdatedを変えるのはやりすぎ。本質的にはほぼ変わっていないので。
### 保存を忘れてエディタから離脱すると戻ってきたときに保存しても更新されない
これはまずいかも。。保存するタイミングは一旦作成が一段落したときなのでよく起こる。
ファイルがアクティブになったとき、**そのファイルのその
- key: `updated` の日付
- value: そのときのデータ状態
として
- あるファイルの
- あるupdatedは
- こういう情報だった
を保存する。`updated: 2025-12-26` の `hoge.md` を初回に開くとこう。
```json
{
"hoge.md": {
"2025-12-26": ".........."
}
}
```
2回目開いても `hoge.md` > `2025-12-26` は存在するので更新はしない。
実際に保存アクションがされたときに
- `hoge.md` > `2025-12-26` と内容が同一なら何もしない
- `hoge.md` > `2025-12-26` と内容が異なれば **上記のJSONも更新**
```json
{
"hoge.md": {
"2025-12-26": "........", // これは消しても良いが残していても良い(メモリなので)
"2025-12-28": "........"
}
}
```
次からは `hoge.md` > `2025-12-28` の方が読み込まれる。
- **保存コマンドが実行されたらメモリ自体は変更してもよい。一瞬なので。**
- notifyだけ制御
### エッジケース
- [ ] ==updated propertyを検知して `setEssentialBody` してくれるとなお良い気がする
- 手動で日付を戻して、エディタから移動せずに保存するケースのみなので後回しでOK
- `回避策`: エディタを移動する
手動で `updated` を変更したときだけ、mappingの方もアップデートしてあげると良い気がする。
ただ、[[🦉Carnelian]]からのupdatedと競合が心配... と思ったけど日付更新が発動している時点で `store.setEssentialBody({ path, date: updated, body });` しているからいいのか...。
### ハッシュ値にしたほうがよいのでは?
mappingにしたことによって本文のデータ量が増えるので。詳細なテキストデータは使わないから、ハッシュ計算速度がネックでないならハッシュ化したほうがいい。
✅ **採用**: https://github.com/tadashi-aikawa/carnelian/commit/f17b4c7551d7cc3e0b529fa2a751ce37303120cd
### 特定日付のhash値と一致したらupdatedを戻す
変更したけど元に戻したときなどに使える。undoをするとわけがわからなくなるので。
✅ **採用**: https://github.com/tadashi-aikawa/carnelian/commit/d942e5f4dd0ff73f64790a3b3366067450a44cdd