From f210a412d378b02bf8655bdc2ce419a23eb0726f Mon Sep 17 00:00:00 2001 From: SebastianMC <23032356+SebastianMC@users.noreply.github.com> Date: Mon, 4 Nov 2024 14:30:49 +0100 Subject: [PATCH] #171 - a PoC of the idea of metadata value extractors. Working version, missing errors detection for new scenarios --- manifest.json | 2 +- src/custom-sort/custom-sort-types.ts | 8 ++++-- src/custom-sort/custom-sort.ts | 30 ++++++++++++++++++----- src/custom-sort/sorting-spec-processor.ts | 4 +++ 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/manifest.json b/manifest.json index 2bd3af2..a90d7fa 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "custom-sort", "name": "Custom File Explorer sorting", - "version": "2.1.14", + "version": "2.1.14-beta-171", "minAppVersion": "0.16.2", "description": "Allows for manual and automatic, config-driven reordering and sorting of files and folders in File Explorer", "author": "SebastianMC", diff --git a/src/custom-sort/custom-sort-types.ts b/src/custom-sort/custom-sort-types.ts index 33d7d26..e2afd46 100644 --- a/src/custom-sort/custom-sort-types.ts +++ b/src/custom-sort/custom-sort-types.ts @@ -75,9 +75,11 @@ export interface CustomSortGroup { exactSuffix?: string regexSuffix?: RegExpSpec order?: CustomSortOrder - byMetadataField?: string // for 'by-metadata:' sorting if the order is by metadata alphabetical or reverse + byMetadataField?: string // for 'by-metadata:' sorting if the order is by metadata alphabetical or reverse + metadataFieldValueExtractor?: MDataExtractor // and its sorting value extractor secondaryOrder?: CustomSortOrder byMetadataFieldSecondary?: string // for 'by-metadata:' sorting if the order is by metadata alphabetical or reverse + metadataFieldSecondaryValueExtractor?: MDataExtractor filesOnly?: boolean matchFilenameWithExt?: boolean foldersOnly?: boolean @@ -92,8 +94,10 @@ export interface CustomSortSpec { targetFoldersPaths: Array // For root use '/' defaultOrder?: CustomSortOrder defaultSecondaryOrder?: CustomSortOrder - byMetadataField?: string // for 'by-metadata:' if the defaultOrder is by metadata + byMetadataField?: string // for 'by-metadata:' if the defaultOrder is by metadata + metadataFieldValueExtractor?: MDataExtractor // and its sorting value extractor byMetadataFieldSecondary?: string + metadataFieldSecondaryValueExtractor?: MDataExtractor groups: Array groupsShadow?: Array // A shallow copy of groups, used at applying sorting for items in a folder. // Stores folder-specific values (e.g. macros expanded with folder-specific values) diff --git a/src/custom-sort/custom-sort.ts b/src/custom-sort/custom-sort.ts index d320f56..6da64a2 100644 --- a/src/custom-sort/custom-sort.ts +++ b/src/custom-sort/custom-sort.ts @@ -35,6 +35,7 @@ import { BookmarksPluginInterface } from "../utils/BookmarksCorePluginSignature"; import {CustomSortPluginAPI} from "../custom-sort-plugin"; +import {MDataExtractor} from "./mdata-extractors"; export interface ProcessingContext { // For internal transient use @@ -372,13 +373,14 @@ export const matchGroupRegex = (theRegex: RegExpSpec, nameForMatching: string): return [false, undefined, undefined] } -const mdataValueFromFMCaches = (mdataFieldName: string, fc?: FrontMatterCache, fcPrio?: FrontMatterCache): any => { +const mdataValueFromFMCaches = (mdataFieldName: string, mdataExtractor?: MDataExtractor, fc?: FrontMatterCache, fcPrio?: FrontMatterCache): any => { let prioValue = undefined if (fcPrio) { prioValue = fcPrio?.[mdataFieldName] } - return prioValue ?? fc?.[mdataFieldName] + const rawMDataValue = prioValue ?? fc?.[mdataFieldName] + return mdataExtractor ? mdataExtractor(rawMDataValue) : rawMDataValue } export const determineSortingGroup = function (entry: TFile | TFolder, spec: CustomSortSpec, ctx?: ProcessingContext): FolderItemForSorting { @@ -583,13 +585,29 @@ export const determineSortingGroup = function (entry: TFile | TFolder, spec: Cus } } if (isPrimaryOrderByMetadata) metadataValueToSortBy = - mdataValueFromFMCaches (group?.byMetadataField || group?.withMetadataFieldName || DEFAULT_METADATA_FIELD_FOR_SORTING, frontMatterCache, prioFrontMatterCache) + mdataValueFromFMCaches ( + group?.byMetadataField || group?.withMetadataFieldName || DEFAULT_METADATA_FIELD_FOR_SORTING, + group?.metadataFieldValueExtractor, + frontMatterCache, + prioFrontMatterCache) if (isSecondaryOrderByMetadata) metadataValueSecondaryToSortBy = - mdataValueFromFMCaches (group?.byMetadataFieldSecondary || group?.withMetadataFieldName || DEFAULT_METADATA_FIELD_FOR_SORTING, frontMatterCache, prioFrontMatterCache) + mdataValueFromFMCaches ( + group?.byMetadataFieldSecondary || group?.withMetadataFieldName || DEFAULT_METADATA_FIELD_FOR_SORTING, + group?.metadataFieldSecondaryValueExtractor, + frontMatterCache, + prioFrontMatterCache) if (isDerivedPrimaryByMetadata) metadataValueDerivedPrimaryToSortBy = - mdataValueFromFMCaches (spec.byMetadataField || DEFAULT_METADATA_FIELD_FOR_SORTING, frontMatterCache, prioFrontMatterCache) + mdataValueFromFMCaches ( + spec.byMetadataField || DEFAULT_METADATA_FIELD_FOR_SORTING, + spec.metadataFieldValueExtractor, + frontMatterCache, + prioFrontMatterCache) if (isDerivedSecondaryByMetadata) metadataValueDerivedSecondaryToSortBy = - mdataValueFromFMCaches (spec.byMetadataFieldSecondary || DEFAULT_METADATA_FIELD_FOR_SORTING, frontMatterCache, prioFrontMatterCache) + mdataValueFromFMCaches ( + spec.byMetadataFieldSecondary || DEFAULT_METADATA_FIELD_FOR_SORTING, + spec.metadataFieldSecondaryValueExtractor, + frontMatterCache, + prioFrontMatterCache) } } } diff --git a/src/custom-sort/sorting-spec-processor.ts b/src/custom-sort/sorting-spec-processor.ts index 8929d82..2aabef5 100644 --- a/src/custom-sort/sorting-spec-processor.ts +++ b/src/custom-sort/sorting-spec-processor.ts @@ -1086,8 +1086,10 @@ export class SortingSpecProcessor { } this.ctx.currentSpec.defaultOrder = (attr.value as RecognizedOrderValue).order this.ctx.currentSpec.byMetadataField = (attr.value as RecognizedOrderValue).applyToMetadataField + this.ctx.currentSpec.metadataFieldValueExtractor = (attr.value as RecognizedOrderValue).metadataValueExtractor this.ctx.currentSpec.defaultSecondaryOrder = (attr.value as RecognizedOrderValue).secondaryOrder this.ctx.currentSpec.byMetadataFieldSecondary = (attr.value as RecognizedOrderValue).secondaryApplyToMetadataField + this.ctx.currentSpec.metadataFieldSecondaryValueExtractor = (attr.value as RecognizedOrderValue).secondaryMetadataValueExtractor return true; } else if (attr.nesting > 0) { // For now only distinguishing nested (indented) and not-nested (not-indented), the depth doesn't matter if (!this.ctx.currentSpec || !this.ctx.currentSpecGroup) { @@ -1101,8 +1103,10 @@ export class SortingSpecProcessor { } this.ctx.currentSpecGroup.order = (attr.value as RecognizedOrderValue).order this.ctx.currentSpecGroup.byMetadataField = (attr.value as RecognizedOrderValue).applyToMetadataField + this.ctx.currentSpecGroup.metadataFieldValueExtractor = (attr.value as RecognizedOrderValue).metadataValueExtractor this.ctx.currentSpecGroup.secondaryOrder = (attr.value as RecognizedOrderValue).secondaryOrder this.ctx.currentSpecGroup.byMetadataFieldSecondary = (attr.value as RecognizedOrderValue).secondaryApplyToMetadataField + this.ctx.currentSpecGroup.metadataFieldSecondaryValueExtractor = (attr.value as RecognizedOrderValue).secondaryMetadataValueExtractor return true; } }