From 550163c3851e943d37c6d9342b3d0ebd05c59aa6 Mon Sep 17 00:00:00 2001 From: Tyler Nieman Date: Fri, 7 Jun 2024 09:12:25 -0700 Subject: [PATCH] feature: add advanced settings w/ book ID frontmatter population --- src/main.ts | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/src/main.ts b/src/main.ts index 5e071c5..06f286d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -9,6 +9,7 @@ import { Plugin, PluginSettingTab, Setting, + TFile, Vault } from 'obsidian'; import * as zip from "@zip.js/zip.js"; @@ -47,6 +48,7 @@ interface ReadwisePluginSettings { booksToRefresh: Array; booksIDsMap: { [key: string]: string; }; reimportShowConfirmation: boolean; + frontmatterBookIdKey?: string; } // define our initial settings @@ -65,6 +67,73 @@ const DEFAULT_SETTINGS: ReadwisePluginSettings = { reimportShowConfirmation: true, }; +class AdvancedModal extends Modal { + plugin: ReadwisePlugin; + + constructor(app: App, plugin: ReadwisePlugin) { + super(app); + this.plugin = plugin; + } + + onOpen() { + const { titleEl, contentEl } = this; + + titleEl.setText('Advanced settings'); + + // add new setting that allows text input + new Setting(contentEl) + .setName('Book ID frontmatter key') + .setDesc('The frontmatter key used to store the Readwise book_id. If set, will be used to identify the export for syncs.') + .addText(text => text + .setPlaceholder('readwise-book-id') + .setValue(this.plugin.settings.frontmatterBookIdKey) + .onChange(async value => { + console.log('Readwise Official plugin: setting frontmatter book ID key to', value); + this.plugin.settings.frontmatterBookIdKey = value; + this.plugin.saveSettings(); + + // enable/disable populate button depending on whether the key is set + const populateButton = contentEl.querySelector('.rw-setting-populate-book-id'); + if (populateButton instanceof HTMLButtonElement) { + populateButton.disabled = !value; + } + })); + + // button to populate the frontmatter with using + // the frontmatterBookIdKey and matching it + // with whatever's saved in booksIDsMap + return new Setting(contentEl) + .setName('Populate frontmatter key') + .setDesc('If the book ID frontmatter key is configured above, this will populate the frontmatter key setting with the first key found in the booksIDsMap. This will not overwrite existing keys.') + .addButton(button => button + .setButtonText('Populate') + .setClass('rw-setting-populate-book-id') + .setDisabled(!this.plugin.settings.frontmatterBookIdKey) + .onClick(async () => { + this.plugin.notice("Populating frontmatter with book IDs...", true); + console.log(`Readwise Official plugin: populating frontmatter key ${this.plugin.settings.frontmatterBookIdKey} with matching value from booksIDsMap...`); + + const readwiseExports = this.plugin.app.vault.getMarkdownFiles(); + for (const file of readwiseExports) { + console.log('Readwise Official plugin: checking file for frontmatter', file.path); + + const bookId = this.plugin.settings.booksIDsMap[file.path]; + if (!bookId) continue; + + await this.plugin.writeBookIdToFrontmatter(file, bookId); + } + + this.plugin.notice("Frontmatter populated with book IDs", true); + }) + ); + } + + onClose() { + const { contentEl } = this; + contentEl.empty(); + } +} + export default class ReadwisePlugin extends Plugin { settings: ReadwisePluginSettings; fs: DataAdapter; @@ -615,6 +684,25 @@ export default class ReadwisePlugin extends Plugin { await this.saveSettings(); return true; } + + async writeBookIdToFrontmatter(file: TFile, bookId: string) { + console.log('Readwise Official plugin: checking file for frontmatter', file.path); + + const cache = this.app.metadataCache.getFileCache(file); + if (!cache) return; + + const frontmatter = cache.frontmatter; + if (!frontmatter) return; + + // don't overwrite existing book ID in frontmatter + const existingBookId = frontmatter[this.settings.frontmatterBookIdKey]; + if (existingBookId) return; + + await this.app.fileManager.processFrontMatter(file, frontmatter => { + console.log(`Readwise Official plugin: setting frontmatter key for "${file.path}" to ${bookId}`); + frontmatter[this.settings.frontmatterBookIdKey] = bookId; + }); + } } class ReadwiseSettingTab extends PluginSettingTab { @@ -732,6 +820,17 @@ class ReadwiseSettingTab extends PluginSettingTab { } ); + new Setting(containerEl) + .setName('Advanced settings') + .setDesc('Customize additional settings for the Readwise plugin') + .addButton(button => { + button + .setButtonText('Open') + .onClick(() => { + new AdvancedModal(this.app, this.plugin).open(); + }); + }); + if (this.plugin.settings.lastSyncFailed) { this.plugin.showInfoStatus(containerEl.find(".rw-setting-sync .rw-info-container").parentElement, "Last sync failed", "rw-error"); }