From 3e30b9b546c5f77e1c6ab3fce0dec0346013e9ec Mon Sep 17 00:00:00 2001 From: Oleg Date: Sat, 27 Aug 2022 12:06:35 +0300 Subject: [PATCH] replace full path during replacement --- errors/errors.ts | 35 ------------- files/files.ts | 43 ---------------- main.ts | 47 ++++++++++-------- package.json | 2 +- suggest/fileSuggest.ts | 60 ----------------------- {suggest => suggestions}/folderSuggest.ts | 0 {suggest => suggestions}/suggest.ts | 0 7 files changed, 28 insertions(+), 159 deletions(-) delete mode 100644 errors/errors.ts delete mode 100644 files/files.ts delete mode 100644 suggest/fileSuggest.ts rename {suggest => suggestions}/folderSuggest.ts (100%) rename {suggest => suggestions}/suggest.ts (100%) diff --git a/errors/errors.ts b/errors/errors.ts deleted file mode 100644 index cd05005..0000000 --- a/errors/errors.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Notice } from 'obsidian'; - -export class TemplaterError extends Error { - constructor(msg: string, public console_msg?: string) { - super(msg); - this.name = this.constructor.name; - Error.captureStackTrace(this, this.constructor); - } -} -export function log_error(e: Error | TemplaterError): void { - const notice = new Notice('', 8000); - if (e instanceof TemplaterError && e.console_msg) { - // TODO: Find a better way for this - // @ts-ignore - notice.noticeEl.innerHTML = `Templater Error:
${e.message}
Check console for more information`; - console.error(`Templater Error:`, e.message, '\n', e.console_msg); - } else { - // @ts-ignore - notice.noticeEl.innerHTML = `Templater Error:
${e.message}`; - } -} - -export function errorWrapperSync(fn: () => T, msg: string): T { - try { - return fn(); - } catch (e) { - log_error(new TemplaterError(msg, e.message)); - return null; - } -} - -export enum FileSuggestMode { - TemplateFiles, - ScriptFiles, -} diff --git a/files/files.ts b/files/files.ts deleted file mode 100644 index ef17f75..0000000 --- a/files/files.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { - App, - normalizePath, - TAbstractFile, - TFile, - TFolder, - Vault, -} from 'obsidian'; -import { TemplaterError } from '../errors/errors'; - -export function resolveFolder(app: App, folder_str: string): TFolder { - folder_str = normalizePath(folder_str); - - const folder = app.vault.getAbstractFileByPath(folder_str); - if (!folder) { - throw new TemplaterError(`Folder "${folder_str}" doesn't exist`); - } - if (!(folder instanceof TFolder)) { - throw new TemplaterError(`${folder_str} is a file, not a folder`); - } - - return folder; -} - -export function getFilesFromTheFolder( - app: App, - folder_str: string, -): Array { - const folder = resolveFolder(app, folder_str); - - const files: Array = []; - Vault.recurseChildren(folder, (file: TAbstractFile) => { - if (file instanceof TFile) { - files.push(file); - } - }); - - files.sort((a, b) => { - return a.basename.localeCompare(b.basename); - }); - - return files; -} diff --git a/main.ts b/main.ts index 750c312..f61283c 100644 --- a/main.ts +++ b/main.ts @@ -1,13 +1,5 @@ -import { - App, - FileManager, - Plugin, - PluginSettingTab, - Setting, - TAbstractFile, - TFile, -} from 'obsidian'; -import { FolderSuggest } from './suggest/folderSuggest'; +import { App, Plugin, PluginSettingTab, Setting, TFile } from 'obsidian'; +import { FolderSuggest } from './suggestions/folderSuggest'; interface MyPluginSettings { folderName: string; @@ -95,6 +87,7 @@ class BulkRenameSettingsTab extends PluginSettingTab { }); }); } + renderFileLocation() { const { settings } = this.plugin; new Setting(this.containerEl) @@ -133,12 +126,14 @@ class BulkRenameSettingsTab extends PluginSettingTab { text.setDisabled(true); const previewLabel = createPreviewElement(); text.inputEl.insertAdjacentElement('afterend', previewLabel); + text.inputEl.addClass('templater_cmd'); }) .addTextArea((text) => { replacedPreviewTextArea = text.inputEl; const value = getRenderedFileNamesReplaced(this.plugin); text.setValue(value); text.setDisabled(true); + text.inputEl.addClass('templater_cmd'); }) .then((setting) => { syncScrolls(existingFilesTextArea, replacedPreviewTextArea, this.state); @@ -146,7 +141,6 @@ class BulkRenameSettingsTab extends PluginSettingTab { } renderRenameFiles() { - const { settings } = this.plugin; new Setting(this.containerEl) .setName('Replace pattern') .setDesc('Files in this folder will be available renamed.') @@ -154,12 +148,19 @@ class BulkRenameSettingsTab extends PluginSettingTab { button.setButtonText('Rename'); button.onClick(() => { const { replacePattern, existingSymbol } = this.plugin.settings; - const firstFile = this.plugin.settings.fileNames[0]; - console.log(firstFile); + if (!replacePattern || !existingSymbol) { + return; + } + + this.plugin.settings.fileNames.forEach((fileName) => { + this.app.fileManager.renameFile( + fileName, + replaceFilePath(this.plugin, fileName), + ); + }); }); }) .addText((cb) => {}); - const fileManager = new FileManager(); this.plugin.settings.fileNames; } } @@ -188,24 +189,30 @@ const prepareFileNameString = (filesNames: TFile[]) => { filesNames.forEach((fileName, index) => { const isLast = index + 1 === filesNames.length; if (isLast) { - return (value += fileName.name); + return (value += fileName.path); } - value += fileName.name + '\r\n'; + value += fileName.path + '\r\n'; }); return value; }; const getRenderedFileNamesReplaced = (plugin: MyPlugin) => { - const { fileNames, replacePattern, existingSymbol } = plugin.settings; + const { fileNames } = plugin.settings; const newFiles = fileNames.map((file) => { return { ...file, - name: file.name.replaceAll(existingSymbol, replacePattern), + path: replaceFilePath(plugin, file), }; }); return prepareFileNameString(newFiles); }; +const replaceFilePath = (plugin: MyPlugin, file: TFile) => { + const { replacePattern, existingSymbol } = plugin.settings; + + return file.path.replaceAll(existingSymbol, replacePattern); +}; + const createPreviewElement = () => { const previewLabel = window.document.createElement('span'); previewLabel.className = 'previewLabel'; @@ -220,14 +227,14 @@ const syncScrolls = ( state: State, ) => { existingFilesArea.addEventListener('scroll', (event) => { - const target = event.target; + const target = event.target as HTMLTextAreaElement; if (target.scrollTop !== state.previewScroll) { previewArea.scrollTop = target.scrollTop; state.previewScroll = target.scrollTop; } }); previewArea.addEventListener('scroll', (event) => { - const target = event.target; + const target = event.target as HTMLTextAreaElement; if (target.scrollTop !== state.filesScroll) { existingFilesArea.scrollTop = target.scrollTop; state.filesScroll = target.scrollTop; diff --git a/package.json b/package.json index 3d7a163..03e38e5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsidian-bulk-rename", - "version": "1.0.0", + "version": "0.0.1", "description": "Purpose of this plugin rename files based on pattern", "main": "main.js", "scripts": { diff --git a/suggest/fileSuggest.ts b/suggest/fileSuggest.ts deleted file mode 100644 index 2a8109d..0000000 --- a/suggest/fileSuggest.ts +++ /dev/null @@ -1,60 +0,0 @@ -// Credits go to Liam's Periodic Notes Plugin: https://github.com/liamcain/obsidian-periodic-notes - -import { App, TAbstractFile, TextAreaComponent, TFile } from 'obsidian'; -import { TextInputSuggest } from './suggest'; -import TemplaterPlugin from 'main'; -import { errorWrapperSync } from '../errors/errors'; -import { getFilesFromTheFolder } from '../files/files'; - -export class FileSuggest extends TextInputSuggest { - constructor( - public app: App, - public inputEl: any, - private plugin: TemplaterPlugin, - ) { - super(app, inputEl); - } - - getFolder(): string { - return this.plugin.settings.mySetting; - } - - get_error_msg(): string { - return `Templates folder doesn't exist`; - } - - getSuggestions(input_str: string): TFile[] { - const all_files = errorWrapperSync( - () => getFilesFromTheFolder(this.app, this.getFolder()), - this.get_error_msg(), - ); - if (!all_files) { - return []; - } - - const files: TFile[] = []; - const lower_input_str = input_str.toLowerCase(); - - all_files.forEach((file: TAbstractFile) => { - if ( - file instanceof TFile && - file.extension === 'md' && - file.path.toLowerCase().contains(lower_input_str) - ) { - files.push(file); - } - }); - - return files; - } - - renderSuggestion(file: TFile, el: HTMLElement): void { - el.setText(file.path); - } - - selectSuggestion(file: TFile): void { - this.inputEl.value = file.path; - this.inputEl.trigger('input'); - this.close(); - } -} diff --git a/suggest/folderSuggest.ts b/suggestions/folderSuggest.ts similarity index 100% rename from suggest/folderSuggest.ts rename to suggestions/folderSuggest.ts diff --git a/suggest/suggest.ts b/suggestions/suggest.ts similarity index 100% rename from suggest/suggest.ts rename to suggestions/suggest.ts