diff --git a/src/ObsidianLiveSyncSettingTab.ts b/src/ObsidianLiveSyncSettingTab.ts index 2d3c044..96ce70e 100644 --- a/src/ObsidianLiveSyncSettingTab.ts +++ b/src/ObsidianLiveSyncSettingTab.ts @@ -1,4 +1,4 @@ -import { App, PluginSettingTab, Setting, sanitizeHTMLToDom, RequestUrlParam, requestUrl } from "obsidian"; +import { App, PluginSettingTab, Setting, sanitizeHTMLToDom, RequestUrlParam, requestUrl, TextAreaComponent } from "obsidian"; import { EntryDoc, LOG_LEVEL, RemoteDBSettings } from "./lib/src/types"; import { path2id, id2path } from "./utils"; import { delay, runWithLock } from "./lib/src/utils"; @@ -591,6 +591,31 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab { }); text.inputEl.setAttribute("type", "number"); }); + let newDatabaseName = this.plugin.settings.additionalSuffixOfDatabaseName + ""; + new Setting(containerLocalDatabaseEl) + .setName("Database suffix") + .setDesc("Set unique name for using same vault name on different directory.") + .addText((text) => { + text.setPlaceholder("") + .setValue(newDatabaseName) + .onChange((value) => { + newDatabaseName = value; + + }); + }).addButton((button) => { + button.setButtonText("Change") + .onClick(async () => { + if (this.plugin.settings.additionalSuffixOfDatabaseName == newDatabaseName) { + Logger("Suffix was not changed.", LOG_LEVEL.NOTICE); + return; + } + this.plugin.settings.additionalSuffixOfDatabaseName = newDatabaseName; + await this.plugin.saveSettings(); + Logger("Suffix has been changed. Reopening database...", LOG_LEVEL.NOTICE); + await this.plugin.initializeDatabase(); + }) + }) + addScreenElement("10", containerLocalDatabaseEl); const containerGeneralSettingsEl = containerEl.createDiv(); @@ -787,6 +812,7 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab { ); new Setting(containerSyncSettingEl) .setName("Scan hidden files periodicaly.") + .setDesc("Seconds, zero to disable.") .addText((text) => { text.setPlaceholder("") .setValue(this.plugin.settings.syncInternalFilesInterval + "") @@ -800,12 +826,15 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab { }); text.inputEl.setAttribute("type", "number"); }); + let skipPatternTextArea: TextAreaComponent = null; + const defaultSkipPattern = "\\/node_modules\\/, \\/\\.git\\/, \\/obsidian-livesync\\/"; + const defaultSkipPatternXPlat = defaultSkipPattern + ",\\/workspace$"; new Setting(containerSyncSettingEl) .setName("Skip patterns") .setDesc( - "Regular expression" + "Regular expression, If you use hidden file sync between desktop and mobile, adding `workspace$` is recommended." ) - .addTextArea((text) => + .addTextArea((text) => { text .setValue(this.plugin.settings.syncInternalFilesIgnorePatterns) .setPlaceholder("\\/node_modules\\/, \\/\\.git\\/") @@ -813,7 +842,27 @@ export class ObsidianLiveSyncSettingTab extends PluginSettingTab { this.plugin.settings.syncInternalFilesIgnorePatterns = value; await this.plugin.saveSettings(); }) + skipPatternTextArea = text; + return text; + } ); + new Setting(containerSyncSettingEl) + .setName("Skip patterns defaults") + .addButton((button) => { + button.setButtonText("Default") + .onClick(async () => { + skipPatternTextArea.setValue(defaultSkipPattern); + this.plugin.settings.syncInternalFilesIgnorePatterns = defaultSkipPattern; + await this.plugin.saveSettings(); + }) + }).addButton((button) => { + button.setButtonText("Cross-platform") + .onClick(async () => { + skipPatternTextArea.setValue(defaultSkipPatternXPlat); + this.plugin.settings.syncInternalFilesIgnorePatterns = defaultSkipPatternXPlat; + await this.plugin.saveSettings(); + }) + }) new Setting(containerSyncSettingEl) .setName("Touch hidden files") diff --git a/src/lib b/src/lib index 1f67fb6..1133f82 160000 --- a/src/lib +++ b/src/lib @@ -1 +1 @@ -Subproject commit 1f67fb604c7e3ae7c3f3640203cb58c248e67be8 +Subproject commit 1133f82732cd69721f6bc1dc8435b2e41af23d8d diff --git a/src/main.ts b/src/main.ts index 830c02a..3e67b7a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -189,6 +189,10 @@ export default class ObsidianLiveSyncPlugin extends Plugin { deviceAndVaultName: string; isMobile = false; + getVaultName(): string { + return this.app.vault.getName() + (this.settings?.additionalSuffixOfDatabaseName ? ("-" + this.settings.additionalSuffixOfDatabaseName) : ""); + } + setInterval(handler: () => any, timeout?: number): number { const timer = window.setInterval(handler, timeout); this.registerInterval(timer); @@ -214,7 +218,7 @@ export default class ObsidianLiveSyncPlugin extends Plugin { async onload() { setLogger(this.addLog.bind(this)); // Logger moved to global. Logger("loading plugin"); - const lsname = "obsidian-live-sync-ver" + this.app.vault.getName(); + const lsname = "obsidian-live-sync-ver" + this.getVaultName(); const last_version = localStorage.getItem(lsname); await this.loadSettings(); //@ts-ignore @@ -296,6 +300,7 @@ export default class ObsidianLiveSyncPlugin extends Plugin { this.settings.autoSweepPlugins = false; this.settings.usePluginSync = false; this.settings.suspendFileWatching = true; + this.settings.syncInternalFiles = false; await this.saveSettings(); await this.openDatabase(); const warningMessage = "The red flag is raised! The whole initialize steps are skipped, and any file changes are not captured."; @@ -555,7 +560,7 @@ export default class ObsidianLiveSyncPlugin extends Plugin { if (this.localDatabase != null) { this.localDatabase.close(); } - const vaultName = this.app.vault.getName(); + const vaultName = this.getVaultName(); Logger("Open Database..."); //@ts-ignore const isMobile = this.app.isMobile; @@ -582,7 +587,7 @@ export default class ObsidianLiveSyncPlugin extends Plugin { // So, use history is always enabled. this.settings.useHistory = true; - const lsname = "obsidian-live-sync-vaultanddevicename-" + this.app.vault.getName(); + const lsname = "obsidian-live-sync-vaultanddevicename-" + this.getVaultName(); if (this.settings.deviceAndVaultName != "") { if (!localStorage.getItem(lsname)) { this.deviceAndVaultName = this.settings.deviceAndVaultName; @@ -598,7 +603,7 @@ export default class ObsidianLiveSyncPlugin extends Plugin { } async saveSettings() { - const lsname = "obsidian-live-sync-vaultanddevicename-" + this.app.vault.getName(); + const lsname = "obsidian-live-sync-vaultanddevicename-" + this.getVaultName(); localStorage.setItem(lsname, this.deviceAndVaultName || ""); await this.saveData(this.settings); @@ -861,7 +866,7 @@ export default class ObsidianLiveSyncPlugin extends Plugin { if (this.settings && !this.settings.showVerboseLog && level == LOG_LEVEL.VERBOSE) { return; } - const valutName = this.app.vault.getName(); + const valutName = this.getVaultName(); const timestamp = new Date().toLocaleString(); const messagecontent = typeof message == "string" ? message : message instanceof Error ? `${message.name}:${message.message}` : JSON.stringify(message, null, 2); const newmessage = timestamp + "->" + messagecontent; @@ -1115,11 +1120,11 @@ export default class ObsidianLiveSyncPlugin extends Plugin { saveQueuedFiles() { const saveData = JSON.stringify(this.queuedFiles.filter((e) => !e.done).map((e) => e.entry._id)); - const lsname = "obsidian-livesync-queuefiles-" + this.app.vault.getName(); + const lsname = "obsidian-livesync-queuefiles-" + this.getVaultName(); localStorage.setItem(lsname, saveData); } async loadQueuedFiles() { - const lsname = "obsidian-livesync-queuefiles-" + this.app.vault.getName(); + const lsname = "obsidian-livesync-queuefiles-" + this.getVaultName(); const ids = JSON.parse(localStorage.getItem(lsname) || "[]") as string[]; const ret = await this.localDatabase.localDatabase.allDocs({ keys: ids, include_docs: true }); for (const doc of ret.rows) { @@ -2226,7 +2231,7 @@ export default class ObsidianLiveSyncPlugin extends Plugin { } } await this.localDatabase.putDBEntry(saveData, true); - Logger(`internal files STORAGE --> DB:${file.path}: Done`); + Logger(`STORAGE --> DB:${file.path}: (hidden) Done`); }); } @@ -2330,7 +2335,7 @@ export default class ObsidianLiveSyncPlugin extends Plugin { }); } - async filterTargetFiles(files: InternalFileInfo[], targetFiles: string[] | false = false) { + filterTargetFiles(files: InternalFileInfo[], targetFiles: string[] | false = false) { const ignorePatterns = this.settings.syncInternalFilesIgnorePatterns.toLocaleLowerCase() .replace(/\n| /g, "") .split(",").filter(e => e).map(e => new RegExp(e));