From 19efc83455c8f4b03dd77f0d58bd5b4ff6b88514 Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Wed, 4 Sep 2024 16:06:15 -0700 Subject: [PATCH] Set File Types to Sync from Obsidian via Khoj Plugin Settings Page Useful to limit file types to sync with Khoj. Avoids hitting indexed data limits, especially for users on the Khoj cloud free tier Closes #893 --- src/interface/obsidian/src/settings.ts | 48 ++++++++++++++++++++++++++ src/interface/obsidian/src/utils.ts | 23 +++++++++--- 2 files changed, 67 insertions(+), 4 deletions(-) diff --git a/src/interface/obsidian/src/settings.ts b/src/interface/obsidian/src/settings.ts index 85e51187..25b7116c 100644 --- a/src/interface/obsidian/src/settings.ts +++ b/src/interface/obsidian/src/settings.ts @@ -10,6 +10,11 @@ export interface UserInfo { email?: string; } +interface SyncFileTypes { + markdown: boolean; + images: boolean; + pdf: boolean; +} export interface KhojSetting { resultsCount: number; khojUrl: string; @@ -17,6 +22,7 @@ export interface KhojSetting { connectedToBackend: boolean; autoConfigure: boolean; lastSync: Map; + syncFileType: SyncFileTypes; userInfo: UserInfo | null; } @@ -27,6 +33,11 @@ export const DEFAULT_SETTINGS: KhojSetting = { connectedToBackend: false, autoConfigure: true, lastSync: new Map(), + syncFileType: { + markdown: true, + images: true, + pdf: true, + }, userInfo: null, } @@ -96,6 +107,43 @@ export class KhojSettingTab extends PluginSettingTab { this.plugin.settings.resultsCount = value; await this.plugin.saveSettings(); })); + + // Add new "Sync" heading + containerEl.createEl('h3', {text: 'Sync'}); + + // Add setting to sync markdown notes + new Setting(containerEl) + .setName('Sync Notes') + .setDesc('Index Markdown files in your vault with Khoj.') + .addToggle(toggle => toggle + .setValue(this.plugin.settings.syncFileType.markdown) + .onChange(async (value) => { + this.plugin.settings.syncFileType.markdown = value; + await this.plugin.saveSettings(); + })); + + // Add setting to sync images + new Setting(containerEl) + .setName('Sync Images') + .setDesc('Index images in your vault with Khoj.') + .addToggle(toggle => toggle + .setValue(this.plugin.settings.syncFileType.images) + .onChange(async (value) => { + this.plugin.settings.syncFileType.images = value; + await this.plugin.saveSettings(); + })); + + // Add setting to sync PDFs + new Setting(containerEl) + .setName('Sync PDFs') + .setDesc('Index PDF files in your vault with Khoj.') + .addToggle(toggle => toggle + .setValue(this.plugin.settings.syncFileType.pdf) + .onChange(async (value) => { + this.plugin.settings.syncFileType.pdf = value; + await this.plugin.saveSettings(); + })); + new Setting(containerEl) .setName('Auto Sync') .setDesc('Automatically index your vault with Khoj.') diff --git a/src/interface/obsidian/src/utils.ts b/src/interface/obsidian/src/utils.ts index 0f4d10ed..6e45cc0a 100644 --- a/src/interface/obsidian/src/utils.ts +++ b/src/interface/obsidian/src/utils.ts @@ -48,14 +48,29 @@ function filenameToMimeType (filename: TFile): string { } } -export const supportedImageFilesTypes = ['png', 'jpg', 'jpeg']; -export const supportedBinaryFileTypes = ['pdf'].concat(supportedImageFilesTypes); -export const supportedFileTypes = ['md', 'markdown'].concat(supportedBinaryFileTypes); +export const fileTypeToExtension = { + 'pdf': ['pdf'], + 'image': ['png', 'jpg', 'jpeg'], + 'markdown': ['md', 'markdown'], +}; +export const supportedImageFilesTypes = fileTypeToExtension.image; +export const supportedBinaryFileTypes = fileTypeToExtension.pdf.concat(supportedImageFilesTypes); +export const supportedFileTypes = fileTypeToExtension.markdown.concat(supportedBinaryFileTypes); export async function updateContentIndex(vault: Vault, setting: KhojSetting, lastSync: Map, regenerate: boolean = false): Promise> { // Get all markdown, pdf files in the vault console.log(`Khoj: Updating Khoj content index...`) - const files = vault.getFiles().filter(file => supportedFileTypes.includes(file.extension)); + const files = vault.getFiles() + // Filter supported file types for syncing + .filter(file => supportedFileTypes.includes(file.extension)) + // Filter user configured file types for syncing + .filter(file => { + if (fileTypeToExtension.markdown.includes(file.extension)) return setting.syncFileType.markdown; + if (fileTypeToExtension.pdf.includes(file.extension)) return setting.syncFileType.pdf; + if (fileTypeToExtension.image.includes(file.extension)) return setting.syncFileType.images; + return false; + }); + let countOfFilesToIndex = 0; let countOfFilesToDelete = 0; lastSync = lastSync.size > 0 ? lastSync : new Map();