#171 - a PoC of the idea of metadata value extractors. Working version, missing errors detection for new scenarios
This commit is contained in:
parent
d82a80c063
commit
f210a412d3
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"id": "custom-sort",
|
"id": "custom-sort",
|
||||||
"name": "Custom File Explorer sorting",
|
"name": "Custom File Explorer sorting",
|
||||||
"version": "2.1.14",
|
"version": "2.1.14-beta-171",
|
||||||
"minAppVersion": "0.16.2",
|
"minAppVersion": "0.16.2",
|
||||||
"description": "Allows for manual and automatic, config-driven reordering and sorting of files and folders in File Explorer",
|
"description": "Allows for manual and automatic, config-driven reordering and sorting of files and folders in File Explorer",
|
||||||
"author": "SebastianMC",
|
"author": "SebastianMC",
|
||||||
|
|
|
@ -76,8 +76,10 @@ export interface CustomSortGroup {
|
||||||
regexSuffix?: RegExpSpec
|
regexSuffix?: RegExpSpec
|
||||||
order?: CustomSortOrder
|
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
|
secondaryOrder?: CustomSortOrder
|
||||||
byMetadataFieldSecondary?: string // for 'by-metadata:' sorting if the order is by metadata alphabetical or reverse
|
byMetadataFieldSecondary?: string // for 'by-metadata:' sorting if the order is by metadata alphabetical or reverse
|
||||||
|
metadataFieldSecondaryValueExtractor?: MDataExtractor
|
||||||
filesOnly?: boolean
|
filesOnly?: boolean
|
||||||
matchFilenameWithExt?: boolean
|
matchFilenameWithExt?: boolean
|
||||||
foldersOnly?: boolean
|
foldersOnly?: boolean
|
||||||
|
@ -93,7 +95,9 @@ export interface CustomSortSpec {
|
||||||
defaultOrder?: CustomSortOrder
|
defaultOrder?: CustomSortOrder
|
||||||
defaultSecondaryOrder?: 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
|
byMetadataFieldSecondary?: string
|
||||||
|
metadataFieldSecondaryValueExtractor?: MDataExtractor
|
||||||
groups: Array<CustomSortGroup>
|
groups: Array<CustomSortGroup>
|
||||||
groupsShadow?: Array<CustomSortGroup> // A shallow copy of groups, used at applying sorting for items in a folder.
|
groupsShadow?: Array<CustomSortGroup> // 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)
|
// Stores folder-specific values (e.g. macros expanded with folder-specific values)
|
||||||
|
|
|
@ -35,6 +35,7 @@ import {
|
||||||
BookmarksPluginInterface
|
BookmarksPluginInterface
|
||||||
} from "../utils/BookmarksCorePluginSignature";
|
} from "../utils/BookmarksCorePluginSignature";
|
||||||
import {CustomSortPluginAPI} from "../custom-sort-plugin";
|
import {CustomSortPluginAPI} from "../custom-sort-plugin";
|
||||||
|
import {MDataExtractor} from "./mdata-extractors";
|
||||||
|
|
||||||
export interface ProcessingContext {
|
export interface ProcessingContext {
|
||||||
// For internal transient use
|
// For internal transient use
|
||||||
|
@ -372,13 +373,14 @@ export const matchGroupRegex = (theRegex: RegExpSpec, nameForMatching: string):
|
||||||
return [false, undefined, undefined]
|
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
|
let prioValue = undefined
|
||||||
if (fcPrio) {
|
if (fcPrio) {
|
||||||
prioValue = fcPrio?.[mdataFieldName]
|
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 {
|
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 =
|
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 =
|
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 =
|
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 =
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1086,8 +1086,10 @@ export class SortingSpecProcessor {
|
||||||
}
|
}
|
||||||
this.ctx.currentSpec.defaultOrder = (attr.value as RecognizedOrderValue).order
|
this.ctx.currentSpec.defaultOrder = (attr.value as RecognizedOrderValue).order
|
||||||
this.ctx.currentSpec.byMetadataField = (attr.value as RecognizedOrderValue).applyToMetadataField
|
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.defaultSecondaryOrder = (attr.value as RecognizedOrderValue).secondaryOrder
|
||||||
this.ctx.currentSpec.byMetadataFieldSecondary = (attr.value as RecognizedOrderValue).secondaryApplyToMetadataField
|
this.ctx.currentSpec.byMetadataFieldSecondary = (attr.value as RecognizedOrderValue).secondaryApplyToMetadataField
|
||||||
|
this.ctx.currentSpec.metadataFieldSecondaryValueExtractor = (attr.value as RecognizedOrderValue).secondaryMetadataValueExtractor
|
||||||
return true;
|
return true;
|
||||||
} else if (attr.nesting > 0) { // For now only distinguishing nested (indented) and not-nested (not-indented), the depth doesn't matter
|
} 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) {
|
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.order = (attr.value as RecognizedOrderValue).order
|
||||||
this.ctx.currentSpecGroup.byMetadataField = (attr.value as RecognizedOrderValue).applyToMetadataField
|
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.secondaryOrder = (attr.value as RecognizedOrderValue).secondaryOrder
|
||||||
this.ctx.currentSpecGroup.byMetadataFieldSecondary = (attr.value as RecognizedOrderValue).secondaryApplyToMetadataField
|
this.ctx.currentSpecGroup.byMetadataFieldSecondary = (attr.value as RecognizedOrderValue).secondaryApplyToMetadataField
|
||||||
|
this.ctx.currentSpecGroup.metadataFieldSecondaryValueExtractor = (attr.value as RecognizedOrderValue).secondaryMetadataValueExtractor
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue