Added more clarity and readability to the code around monkey-patching of TFolder.sort() method

This commit is contained in:
SebastianMC 2022-09-14 11:10:47 +02:00
parent fd8dfa1fcd
commit fe90df845a
2 changed files with 34 additions and 30 deletions

View File

@ -42,6 +42,9 @@ const SORTINGSPEC_YAML_KEY: string = 'sorting-spec'
const ERROR_NOTICE_TIMEOUT: number = 10000 const ERROR_NOTICE_TIMEOUT: number = 10000
// the monkey-around package doesn't export the below type
type MonkeyAroundUninstaller = () => void
export default class CustomSortPlugin extends Plugin { export default class CustomSortPlugin extends Plugin {
settings: CustomSortPluginSettings settings: CustomSortPluginSettings
statusBarItemEl: HTMLElement statusBarItemEl: HTMLElement
@ -229,39 +232,38 @@ export default class CustomSortPlugin extends Plugin {
// @ts-ignore // @ts-ignore
let tmpFolder = new TFolder(Vault, ""); let tmpFolder = new TFolder(Vault, "");
let Folder = fileExplorer.createFolderDom(tmpFolder).constructor; let Folder = fileExplorer.createFolderDom(tmpFolder).constructor;
this.register( const uninstallerOfFolderSortFunctionWrapper: MonkeyAroundUninstaller = around(Folder.prototype, {
// TODO: Unit tests please!!! The logic below becomes more and more complex, bugs are captured at run-time... // TODO: Unit tests, the logic below becomes more and more complex, bugs are captured at run-time...
around(Folder.prototype, { sort(old: any) {
sort(old: any) { return function (...args: any[]) {
return function (...args: any[]) { // quick check for plugin status
// quick check for plugin status if (plugin.settings.suspended) {
if (plugin.settings.suspended) { return old.call(this, ...args);
return old.call(this, ...args); }
}
// if custom sort is not specified, use the UI-selected // if custom sort is not specified, use the UI-selected
const folder: TFolder = this.file const folder: TFolder = this.file
let sortSpec: CustomSortSpec | null | undefined = plugin.sortSpecCache?.sortSpecByPath[folder.path] let sortSpec: CustomSortSpec | null | undefined = plugin.sortSpecCache?.sortSpecByPath[folder.path]
if (sortSpec) { if (sortSpec) {
if (sortSpec.defaultOrder === CustomSortOrder.standardObsidian) { if (sortSpec.defaultOrder === CustomSortOrder.standardObsidian) {
sortSpec = null // A folder is explicitly excluded from custom sorting plugin sortSpec = null // A folder is explicitly excluded from custom sorting plugin
}
} else if (plugin.sortSpecCache?.sortSpecByWildcard) {
// when no sorting spec found directly by folder path, check for wildcard-based match
sortSpec = plugin.sortSpecCache?.sortSpecByWildcard.folderMatch(folder.path)
if (sortSpec?.defaultOrder === CustomSortOrder.standardObsidian) {
sortSpec = null // A folder subtree can be also explicitly excluded from custom sorting plugin
}
} }
if (sortSpec) { } else if (plugin.sortSpecCache?.sortSpecByWildcard) {
return folderSort.call(this, sortSpec, ...args); // when no sorting spec found directly by folder path, check for wildcard-based match
} else { sortSpec = plugin.sortSpecCache?.sortSpecByWildcard.folderMatch(folder.path)
return old.call(this, ...args); if (sortSpec?.defaultOrder === CustomSortOrder.standardObsidian) {
sortSpec = null // A folder subtree can be also explicitly excluded from custom sorting plugin
} }
}; }
}, if (sortSpec) {
}) return folderSort.call(this, sortSpec, ...args);
); } else {
return old.call(this, ...args);
}
};
}
})
this.register(uninstallerOfFolderSortFunctionWrapper)
leaf.detach() leaf.detach()
} }

View File

@ -1,5 +1,7 @@
import {TFolder, WorkspaceLeaf} from "obsidian"; import {TFolder, WorkspaceLeaf} from "obsidian";
// Needed to support monkey-patching of the folder sort() function
declare module 'obsidian' { declare module 'obsidian' {
export interface ViewRegistry { export interface ViewRegistry {
viewByType: Record<string, (leaf: WorkspaceLeaf) => unknown>; viewByType: Record<string, (leaf: WorkspaceLeaf) => unknown>;