> [!left-bubble] ![[claude-san-minichara.webp]] > 本ページの内容は[[Claude Code]]がまとめた実装ログです。 > [!warning] > この対応は[[Obsidian Mobile]]で動作しなくなるので注意。 --- **作業日時**: 2025/06/29 18:49:18 **対応Issue**: [#354](https://github.com/tadashi-aikawa/obsidian-various-complements-plugin/issues/354) **概要**: プレフィックスマッチによるパス除外機能を拡張し、Globパターンをサポートする機能を実装 ## 実装概要 GitHub Issue #354 で要求されていた、suffix path pattern(`**/attachments`など)による柔軟なパス除外機能を実装しました。現在のプレフィックス除外機能と並行して動作し、micromatchライブラリを使用した高性能なGlobマッチングを提供します。 ## 初回実装(基本機能) ### 1. 依存関係の追加 **package.json**: ```json "dependencies": { "micromatch": "^4.0.5" } "devDependencies": { "@types/micromatch": "^4.0.6" } ``` ### 2. Globマッチング機能の実装 **src/util/glob.ts**: ```typescript import micromatch from "micromatch"; export function isMatchedGlobPatterns( path: string, patterns: string[] ): boolean { if (patterns.length === 0) { return false; } try { return micromatch.isMatch(path, patterns); } catch (error) { console.warn(`Invalid glob pattern detected: ${error}`); return false; } } ``` ### 3. 設定項目の追加 **src/setting/settings.ts**: ```typescript // 型定義 excludeCurrentVaultPathGlobPatterns: string[]; excludeInternalLinkPathGlobPatterns: string[]; // デフォルト値 excludeCurrentVaultPathGlobPatterns: [], excludeInternalLinkPathGlobPatterns: [], ``` ### 4. プロバイダーへの機能追加 **CurrentVaultWordProvider.ts**: - Globパターンによる除外判定を追加 - `setSettings`メソッドにGlobパターン配列を追加 - プレフィックス除外と並行動作 **InternalLinkWordProvider.ts**: - 同様にGlobパターン除外機能を追加 - `refreshWords`メソッドの引数に`excludePathGlobPatterns`を追加 ### 5. 設定UIの実装 **Current Vault & Internal Link Complement**: ```typescript new Setting(containerEl) .setName("Exclude path glob patterns") .setDesc("Glob patterns to exclude files. Supports wildcards like **/attachments, **/*.png, etc.") .addTextArea((tac) => { const el = tac .setValue(settings.excludeCurrentVaultPathGlobPatterns.join("\n")) .setPlaceholder("**/attachments\n**/*.png") .onChange(async (value) => { settings.excludeCurrentVaultPathGlobPatterns = smartLineBreakSplit(value); await this.plugin.saveSettings(); this.display(); }); }); ``` ### 6. テストの実装 **src/util/glob.test.ts**: - 基本的なGlobパターンマッチングのテスト - エラーハンドリングのテスト - 複数パターン(OR論理)のテスト - 全12テストケース ## フィードバック対応(設計改善) ### 指摘事項 1. 設定項目名に `path` という文言が含まれていない(本文のワードと勘違いされる恐れ) 2. 設定項目の型を `string` ではなく `string[]` にする(他の設定項目との一貫性) ### 修正内容 #### 1. 設定項目名の変更 ```typescript // 変更前 excludeCurrentVaultGlobPatterns: string; excludeInternalLinkGlobPatterns: string; // 変更後 excludeCurrentVaultPathGlobPatterns: string[]; excludeInternalLinkPathGlobPatterns: string[]; ``` #### 2. 型の変更とユーティリティ関数の簡素化 - `parseGlobPatterns` 関数を削除(不要になったため) - 直接 `string[]` を受け取るように変更 - `smartLineBreakSplit` 関数を使用(既存のWordPatternsと同じ実装) #### 3. プロバイダーの更新 - AutoCompleteSuggest.tsで `parseGlobPatterns` の呼び出しを削除 - 直接配列を渡すように変更 #### 4. 設定UIの改善 **excludeCurrentVaultWordPatterns の実装パターンに合わせて修正**: ```typescript .setValue(this.plugin.settings.excludeCurrentVaultPathGlobPatterns.join("\n")) .onChange(async (value) => { this.plugin.settings.excludeCurrentVaultPathGlobPatterns = smartLineBreakSplit(value); await this.plugin.saveSettings(); this.display(); }); ``` ## パフォーマンス警告の実装 ### 課題 Globパターンマッチングはプレフィックスマッチより処理負荷が高いため、適切な使い分けをユーザーに促す必要がある。 ### 実装方針 設定値に応じて動的に警告を表示する方式を採用(常時表示ではなく)。 ### 実装内容 #### 1. 条件付き警告表示 ```typescript if (this.plugin.settings.excludeCurrentVaultPathGlobPatterns.length > 0) { containerEl.createEl("div", { text: "⚠ Glob patterns add processing overhead. Use prefix path patterns above for better performance when possible.", cls: "various-complements__settings__warning", }); } ``` #### 2. リアルタイム更新機能 ```typescript .onChange(async (value) => { this.plugin.settings.excludeCurrentVaultPathGlobPatterns = smartLineBreakSplit(value); await this.plugin.saveSettings(); this.display(); // 警告の表示/非表示を即座に更新 }); ``` ### 動作仕様 - **警告表示条件**: Globパターンが1つ以上設定されている場合のみ - **リアルタイム更新**: パターン入力/削除時に即座に警告の表示/非表示が切り替わる - **表示位置**: 設定項目の直前(既存の partial match 警告と同じ方式) ## 技術的詳細 ### 使用ライブラリ - **micromatch v4.0.7**: 高性能、現代標準のGlobマッチングライブラリ - **選択理由**: minimatchより高速、活発なメンテナンス、豊富な機能 ### パフォーマンス考慮 - エラーハンドリング付きで安全な実装 - 無効なパターンでもアプリケーションがクラッシュしない - 既存のプレフィックス除外機能は維持(後方互換性) ### 使用例 **問題解決パターン(Issue #354 の要求)**: ``` **/attachments ``` **その他の便利なパターン**: ``` **/*.{png,jpg,gif} Private/** **/temp/** ``` ## 検証結果 ### テスト実行結果 - ✅ 型チェック: エラーなし - ✅ 全テスト: 440/440通過 - ✅ カバレッジ: 96.59%維持 - ✅ Globテスト: 8/8通過 ### 最終確認事項 - [x] 設定項目名に "Path" を含む - [x] 型は `string[]` で一貫性確保 - [x] パフォーマンス警告の動的表示 - [x] リアルタイム警告更新 - [x] 既存機能との並行動作 - [x] 後方互換性の維持 ## まとめ GitHub Issue #354 で要求されていた柔軟なパス除外機能を完全に実装しました。プレフィックスマッチでは対応できない複雑なパターン(`**/attachments`など)に対応し、適切なパフォーマンス警告も併せて提供することで、ユーザーが目的に応じて最適な方法を選択できるようになりました。 **主な成果**: - 柔軟なGlobパターンによるパス除外機能 - 高性能なmicromatchライブラリの採用 - 既存機能との一貫性を保った設計 - 適切なユーザーガイダンスとパフォーマンス警告 - 包括的なテストと品質保証 この実装により、ユーザーは手動でフルパスを設定することなく、様々なパターンでファイル除外が可能になりました。