diff --git a/main.ts b/main.ts index 60ab512..26c0c38 100644 --- a/main.ts +++ b/main.ts @@ -13,6 +13,7 @@ import { renameFilesInObsidian } from './src/services/file.service'; import { createPreviewElement } from './src/components/PreviewElement'; import { getObsidianFilesByFolderName, + getObsidianFilesByRegExp, getObsidianFilesWithTagName, } from './src/services/obsidian.service'; import { renderPreviewFiles } from './src/components/RenderPreviewFiles'; @@ -23,7 +24,8 @@ interface BulkRenamePluginSettings { existingSymbol: string; replacePattern: string; tags: string[]; - viewType: 'tags' | 'folder'; + userRegExp: string; + viewType: 'tags' | 'folder' | 'regexp'; } const DEFAULT_SETTINGS: BulkRenamePluginSettings = { @@ -31,6 +33,7 @@ const DEFAULT_SETTINGS: BulkRenamePluginSettings = { fileNames: [], existingSymbol: '', replacePattern: '', + userRegExp: '', tags: [], viewType: 'folder', }; @@ -38,10 +41,15 @@ const DEFAULT_SETTINGS: BulkRenamePluginSettings = { const isViewTypeFolder = ({ settings }: BulkRenamePlugin) => { return settings.viewType === 'folder'; }; + const isViewTypeTags = ({ settings }: BulkRenamePlugin) => { return settings.viewType === 'tags'; }; +const isViewTypeRegExp = ({ settings }: BulkRenamePlugin) => { + return settings.viewType === 'regexp'; +}; + class BulkRenamePlugin extends Plugin { settings: BulkRenamePluginSettings; @@ -97,6 +105,7 @@ export class BulkRenameSettingsTab extends PluginSettingTab { this.renderTabs(); this.renderFileLocation(); this.renderTagNames(); + this.renderRegExpInput(); this.renderReplaceSymbol(); this.renderFilesAndPreview(); this.renderRenameFiles(); @@ -127,6 +136,17 @@ export class BulkRenameSettingsTab extends PluginSettingTab { await this.plugin.saveSettings(); this.display(); }); + }) + .addButton((button) => { + button.setButtonText('Search by RegExp'); + if (isViewTypeRegExp(this.plugin)) { + button.setCta(); + } + button.onClick(async () => { + this.plugin.settings.viewType = 'regexp'; + await this.plugin.saveSettings(); + this.display(); + }); }); } @@ -185,6 +205,38 @@ export class BulkRenameSettingsTab extends PluginSettingTab { }); } + renderRegExpInput() { + if (!isViewTypeRegExp(this.plugin)) { + return; + } + new Setting(this.containerEl) + .setName('RegExp') + .setDesc('all files by titles will be found') + .addSearch((cb) => { + // @ts-ignore + cb.inputEl.addEventListener('keydown', (event) => { + if (event.key !== 'Enter') { + return; + } + const target = event.target as HTMLInputElement; + + this.plugin.settings.userRegExp = target.value; + this.plugin.saveSettings(); + }); + cb.setPlaceholder('Example: #tag, #tag2') + .setValue(this.plugin.settings.userRegExp) + .onChange((newFolder) => { + this.plugin.settings.userRegExp = newFolder; + this.plugin.saveSettings(); + this.getFilesByRegExp(); + }); + // @ts-ignore + cb.containerEl.addClass('bulk_regexp'); + cb.inputEl.addClass('bulk_input'); + cb.inputEl.onblur = this.reRenderPreview; + }); + } + renderReplaceSymbol() { const { settings } = this.plugin; @@ -296,6 +348,12 @@ export class BulkRenameSettingsTab extends PluginSettingTab { this.getFilesByTags(); return; } + + if (isViewTypeRegExp(this.plugin)) { + this.getFilesByRegExp(); + return; + } + this.getFilesByFolder(); } @@ -312,6 +370,13 @@ export class BulkRenameSettingsTab extends PluginSettingTab { this.plugin, ); } + + getFilesByRegExp() { + this.plugin.settings.fileNames = getObsidianFilesByRegExp( + this.app, + this.plugin, + ); + } } export default BulkRenamePlugin; diff --git a/src/services/obsidian.service.ts b/src/services/obsidian.service.ts index c383da2..d715fa3 100644 --- a/src/services/obsidian.service.ts +++ b/src/services/obsidian.service.ts @@ -17,6 +17,22 @@ export const getObsidianFilesByFolderName = ( return filesSortedByName; }; +export const getObsidianFilesByRegExp = ( + app: App, + plugin: BulkRenamePlugin, +) => { + const { userRegExp } = plugin.settings; + const abstractFiles = app.vault.getAllLoadedFiles(); + + const files = abstractFiles.filter( + (file) => file instanceof TFile && file.parent.name.includes(userRegExp), + ) as TFile[]; + + const filesSortedByName = sortFilesByName(files); + + return filesSortedByName; +}; + export const getObsidianFilesWithTagName = ( app: App, plugin: BulkRenamePlugin, diff --git a/styles.css b/styles.css index e62dd93..0fa17f3 100644 --- a/styles.css +++ b/styles.css @@ -23,3 +23,36 @@ .bulk_preview_label { margin-right: 15px; } + +.bulk_regexp { + width: 100%; +} + +.bulk_regexp > input { + color: green; + padding: 0 28px 0 14px; + font-size: 20px; + font-weight: 700; +} + +.bulk_regexp:before { + content: '/'; + top: 2px; + left: -15px; +} + +.bulk_regexp:after { + content: '/'; + bottom: 5px; + right: -15px; +} + +.bulk_regexp:before, +.bulk_regexp:after { + color: #000080; + font-size: 30px; + /*background-color: #cccccc;*/ + display: block; + /*text-align: center;*/ + position: absolute; +}