Skip to content

Commit

Permalink
feature: add advanced settings w/ book ID frontmatter population
Browse files Browse the repository at this point in the history
  • Loading branch information
tyler-dot-earth committed Jun 9, 2024
1 parent 4de9c93 commit 550163c
Showing 1 changed file with 99 additions and 0 deletions.
99 changes: 99 additions & 0 deletions src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
Plugin,
PluginSettingTab,
Setting,
TFile,
Vault
} from 'obsidian';
import * as zip from "@zip.js/zip.js";
Expand Down Expand Up @@ -47,6 +48,7 @@ interface ReadwisePluginSettings {
booksToRefresh: Array<string>;
booksIDsMap: { [key: string]: string; };
reimportShowConfirmation: boolean;
frontmatterBookIdKey?: string;
}

// define our initial settings
Expand All @@ -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;
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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");
}
Expand Down

0 comments on commit 550163c

Please sign in to comment.