Skip to content

Commit 2c2053d

Browse files
authored
Merge pull request #174 from SebastianMC/nov-2024-refactoring-regroup-sorting-structures
Major refactoring of sorting structures.
2 parents de15f48 + 5cb7e54 commit 2c2053d

File tree

9 files changed

+411
-396
lines changed

9 files changed

+411
-396
lines changed

src/custom-sort/custom-sort-types.ts

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,6 @@ export enum CustomSortOrder {
4949
default = alphabeticalWithFilesPreferred
5050
}
5151

52-
export interface RecognizedOrderValue {
53-
order: CustomSortOrder
54-
applyToMetadataField?: string
55-
metadataValueExtractor?: MDataExtractor
56-
secondaryOrder?: CustomSortOrder
57-
secondaryApplyToMetadataField?: string
58-
secondaryMetadataValueExtractor?: MDataExtractor
59-
}
60-
6152
export type NormalizerFn = (s: string) => string | null
6253
export const IdentityNormalizerFn: NormalizerFn = (s: string) => s
6354

@@ -66,19 +57,26 @@ export interface RegExpSpec {
6657
normalizerFn?: NormalizerFn
6758
}
6859

60+
export interface CustomSort {
61+
order: CustomSortOrder // mandatory
62+
byMetadata?: string
63+
metadataValueExtractor?: MDataExtractor
64+
}
65+
66+
export interface RecognizedSorting {
67+
primary?: CustomSort
68+
secondary?: CustomSort
69+
}
70+
6971
export interface CustomSortGroup {
7072
type: CustomSortGroupType
7173
exactText?: string
7274
exactPrefix?: string
7375
regexPrefix?: RegExpSpec
7476
exactSuffix?: string
7577
regexSuffix?: RegExpSpec
76-
order?: CustomSortOrder
77-
byMetadataField?: string // for 'by-metadata:' sorting if the order is by metadata alphabetical or reverse
78-
metadataFieldValueExtractor?: MDataExtractor // and its sorting value extractor
79-
secondaryOrder?: CustomSortOrder
80-
byMetadataFieldSecondary?: string // for 'by-metadata:' sorting if the order is by metadata alphabetical or reverse
81-
metadataFieldSecondaryValueExtractor?: MDataExtractor
78+
sorting?: CustomSort
79+
secondarySorting?: CustomSort
8280
filesOnly?: boolean
8381
matchFilenameWithExt?: boolean
8482
foldersOnly?: boolean
@@ -91,12 +89,8 @@ export interface CustomSortGroup {
9189
export interface CustomSortSpec {
9290
// plays only informative role about the original parsed 'target-folder:' values
9391
targetFoldersPaths: Array<string> // For root use '/'
94-
defaultOrder?: CustomSortOrder
95-
defaultSecondaryOrder?: CustomSortOrder
96-
byMetadataField?: string // for 'by-metadata:' if the defaultOrder is by metadata
97-
metadataFieldValueExtractor?: MDataExtractor // and its sorting value extractor
98-
byMetadataFieldSecondary?: string
99-
metadataFieldSecondaryValueExtractor?: MDataExtractor
92+
defaultSorting?: CustomSort
93+
defaultSecondarySorting?: CustomSort
10094
groups: Array<CustomSortGroup>
10195
groupsShadow?: Array<CustomSortGroup> // A shallow copy of groups, used at applying sorting for items in a folder.
10296
// Stores folder-specific values (e.g. macros expanded with folder-specific values)

src/custom-sort/custom-sort-utils.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,12 @@ export const collectSortingAndGroupingTypes = (sortSpec?: CustomSortSpec|null):
5757
}
5858
}
5959
if (!sortSpec) return has
60-
doCheck(has, sortSpec.defaultOrder)
61-
doCheck(has, sortSpec.defaultSecondaryOrder)
60+
doCheck(has, sortSpec.defaultSorting?.order)
61+
doCheck(has, sortSpec.defaultSecondarySorting?.order)
6262
if (sortSpec.groups) {
6363
for (let group of sortSpec.groups) {
64-
doCheck(has, group.order, group.type)
65-
doCheck(has, group.secondaryOrder)
64+
doCheck(has, group.sorting?.order, group.type)
65+
doCheck(has, group.secondarySorting?.order)
6666
}
6767
}
6868
return has

src/custom-sort/custom-sort.ts

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
ObsidianIconFolder_PluginInstance
1212
} from '../utils/ObsidianIconFolderPluginSignature'
1313
import {
14+
CustomSort,
1415
CustomSortGroup,
1516
CustomSortGroupType,
1617
CustomSortOrder,
@@ -287,18 +288,18 @@ export const StandardPlainObsidianComparator = (order: string): PlainSorterFn =>
287288
}
288289
}
289290

290-
export const getSorterFnFor = (sorting: CustomSortOrder, currentUIselectedSorting?: string, sortLevelId?: SortingLevelId): SorterFn => {
291-
if (sorting === CustomSortOrder.standardObsidian) {
292-
sorting = StandardObsidianToCustomSort[currentUIselectedSorting ?? 'alphabetical'] ?? CustomSortOrder.alphabetical
293-
return StandardObsidianComparator(sorting)
291+
export const getSorterFnFor = (order: CustomSortOrder, currentUIselectedSorting?: string, sortLevelId?: SortingLevelId): SorterFn => {
292+
if (order === CustomSortOrder.standardObsidian) {
293+
order = StandardObsidianToCustomSort[currentUIselectedSorting ?? 'alphabetical'] ?? CustomSortOrder.alphabetical
294+
return StandardObsidianComparator(order)
294295
} else {
295296
// Some sorters have to know at which sorting level they are used
296297
switch(sortLevelId) {
297-
case SortingLevelId.forSecondary: return SortersForSecondary[sorting] ?? Sorters[sorting]
298-
case SortingLevelId.forDerivedPrimary: return SortersForDerivedPrimary[sorting] ?? Sorters[sorting]
299-
case SortingLevelId.forDerivedSecondary: return SortersForDerivedSecondary[sorting] ?? Sorters[sorting]
298+
case SortingLevelId.forSecondary: return SortersForSecondary[order] ?? Sorters[order]
299+
case SortingLevelId.forDerivedPrimary: return SortersForDerivedPrimary[order] ?? Sorters[order]
300+
case SortingLevelId.forDerivedSecondary: return SortersForDerivedSecondary[order] ?? Sorters[order]
300301
case SortingLevelId.forPrimary:
301-
default: return Sorters[sorting]
302+
default: return Sorters[order]
302303
}
303304
}
304305
}
@@ -308,13 +309,13 @@ export const getComparator = (sortSpec: CustomSortSpec, currentUIselectedSorting
308309
if (itA.groupIdx != undefined && itB.groupIdx != undefined) {
309310
if (itA.groupIdx === itB.groupIdx) {
310311
const group: CustomSortGroup | undefined = sortSpec.groups[itA.groupIdx]
311-
const primary: number = group?.order ? getSorterFnFor(group.order, currentUIselectedSorting, SortingLevelId.forPrimary)(itA, itB) : EQUAL_OR_UNCOMPARABLE
312+
const primary: number = group?.sorting ? getSorterFnFor(group.sorting.order, currentUIselectedSorting, SortingLevelId.forPrimary)(itA, itB) : EQUAL_OR_UNCOMPARABLE
312313
if (primary !== EQUAL_OR_UNCOMPARABLE) return primary
313-
const secondary: number = group?.secondaryOrder ? getSorterFnFor(group.secondaryOrder, currentUIselectedSorting, SortingLevelId.forSecondary)(itA, itB) : EQUAL_OR_UNCOMPARABLE
314+
const secondary: number = group?.secondarySorting ? getSorterFnFor(group.secondarySorting.order, currentUIselectedSorting, SortingLevelId.forSecondary)(itA, itB) : EQUAL_OR_UNCOMPARABLE
314315
if (secondary !== EQUAL_OR_UNCOMPARABLE) return secondary
315-
const folderLevel: number = sortSpec.defaultOrder ? getSorterFnFor(sortSpec.defaultOrder, currentUIselectedSorting, SortingLevelId.forDerivedPrimary)(itA, itB) : EQUAL_OR_UNCOMPARABLE
316+
const folderLevel: number = sortSpec.defaultSorting ? getSorterFnFor(sortSpec.defaultSorting.order, currentUIselectedSorting, SortingLevelId.forDerivedPrimary)(itA, itB) : EQUAL_OR_UNCOMPARABLE
316317
if (folderLevel !== EQUAL_OR_UNCOMPARABLE) return folderLevel
317-
const folderLevelSecondary: number = sortSpec.defaultSecondaryOrder ? getSorterFnFor(sortSpec.defaultSecondaryOrder, currentUIselectedSorting, SortingLevelId.forDerivedSecondary)(itA, itB) : EQUAL_OR_UNCOMPARABLE
318+
const folderLevelSecondary: number = sortSpec.defaultSecondarySorting ? getSorterFnFor(sortSpec.defaultSecondarySorting.order, currentUIselectedSorting, SortingLevelId.forDerivedSecondary)(itA, itB) : EQUAL_OR_UNCOMPARABLE
318319
if (folderLevelSecondary !== EQUAL_OR_UNCOMPARABLE) return folderLevelSecondary
319320
const defaultForUnspecified: number = getSorterFnFor(CustomSortOrder.default, undefined, SortingLevelId.forDefaultWhenUnspecified)(itA, itB)
320321
return defaultForUnspecified
@@ -552,10 +553,10 @@ export const determineSortingGroup = function (entry: TFile | TFolder, spec: Cus
552553

553554
if (determined && determinedGroupIdx !== undefined) { // <-- defensive code, maybe too defensive
554555
const group: CustomSortGroup = spec.groups[determinedGroupIdx];
555-
const isPrimaryOrderByMetadata: boolean = isByMetadata(group?.order)
556-
const isSecondaryOrderByMetadata: boolean = isByMetadata(group?.secondaryOrder)
557-
const isDerivedPrimaryByMetadata: boolean = isByMetadata(spec.defaultOrder)
558-
const isDerivedSecondaryByMetadata: boolean = isByMetadata(spec.defaultSecondaryOrder)
556+
const isPrimaryOrderByMetadata: boolean = isByMetadata(group?.sorting?.order)
557+
const isSecondaryOrderByMetadata: boolean = isByMetadata(group?.secondarySorting?.order)
558+
const isDerivedPrimaryByMetadata: boolean = isByMetadata(spec.defaultSorting?.order)
559+
const isDerivedSecondaryByMetadata: boolean = isByMetadata(spec.defaultSecondarySorting?.order)
559560
if (isPrimaryOrderByMetadata || isSecondaryOrderByMetadata || isDerivedPrimaryByMetadata || isDerivedSecondaryByMetadata) {
560561
if (ctx?._mCache) {
561562
// For folders - scan metadata of 'folder note'
@@ -571,26 +572,26 @@ export const determineSortingGroup = function (entry: TFile | TFolder, spec: Cus
571572
}
572573
if (isPrimaryOrderByMetadata) metadataValueToSortBy =
573574
mdataValueFromFMCaches (
574-
group?.byMetadataField || group?.withMetadataFieldName || DEFAULT_METADATA_FIELD_FOR_SORTING,
575-
group?.metadataFieldValueExtractor,
575+
group.sorting!.byMetadata || group.withMetadataFieldName || DEFAULT_METADATA_FIELD_FOR_SORTING,
576+
group.sorting!.metadataValueExtractor,
576577
frontMatterCache,
577578
prioFrontMatterCache)
578579
if (isSecondaryOrderByMetadata) metadataValueSecondaryToSortBy =
579580
mdataValueFromFMCaches (
580-
group?.byMetadataFieldSecondary || group?.withMetadataFieldName || DEFAULT_METADATA_FIELD_FOR_SORTING,
581-
group?.metadataFieldSecondaryValueExtractor,
581+
group.secondarySorting!.byMetadata || group.withMetadataFieldName || DEFAULT_METADATA_FIELD_FOR_SORTING,
582+
group.secondarySorting!.metadataValueExtractor,
582583
frontMatterCache,
583584
prioFrontMatterCache)
584585
if (isDerivedPrimaryByMetadata) metadataValueDerivedPrimaryToSortBy =
585586
mdataValueFromFMCaches (
586-
spec.byMetadataField || DEFAULT_METADATA_FIELD_FOR_SORTING,
587-
spec.metadataFieldValueExtractor,
587+
spec.defaultSorting!.byMetadata || DEFAULT_METADATA_FIELD_FOR_SORTING,
588+
spec.defaultSorting!.metadataValueExtractor,
588589
frontMatterCache,
589590
prioFrontMatterCache)
590591
if (isDerivedSecondaryByMetadata) metadataValueDerivedSecondaryToSortBy =
591592
mdataValueFromFMCaches (
592-
spec.byMetadataFieldSecondary || DEFAULT_METADATA_FIELD_FOR_SORTING,
593-
spec.metadataFieldSecondaryValueExtractor,
593+
spec.defaultSecondarySorting!.byMetadata || DEFAULT_METADATA_FIELD_FOR_SORTING,
594+
spec.defaultSecondarySorting!.metadataValueExtractor,
594595
frontMatterCache,
595596
prioFrontMatterCache)
596597
}
@@ -692,12 +693,12 @@ export const determineDatesForFolder = (folder: TFolder, recursive?: boolean): [
692693
}
693694

694695
export const determineFolderDatesIfNeeded = (folderItems: Array<FolderItemForSorting>, sortingSpec: CustomSortSpec) => {
695-
const foldersDatesNeeded = sortOrderNeedsFolderDates(sortingSpec.defaultOrder, sortingSpec.defaultSecondaryOrder)
696-
const foldersDeepDatesNeeded = sortOrderNeedsFolderDeepDates(sortingSpec.defaultOrder, sortingSpec.defaultSecondaryOrder)
696+
const foldersDatesNeeded = sortOrderNeedsFolderDates(sortingSpec.defaultSorting?.order, sortingSpec.defaultSecondarySorting?.order)
697+
const foldersDeepDatesNeeded = sortOrderNeedsFolderDeepDates(sortingSpec.defaultSorting?.order, sortingSpec.defaultSecondarySorting?.order)
697698

698699
const groupOrders = sortingSpec.groups?.map((group) => ({
699-
foldersDatesNeeded: sortOrderNeedsFolderDates(group.order, group.secondaryOrder),
700-
foldersDeepDatesNeeded: sortOrderNeedsFolderDeepDates(group.order, group.secondaryOrder)
700+
foldersDatesNeeded: sortOrderNeedsFolderDates(group.sorting?.order, group.secondarySorting?.order),
701+
foldersDeepDatesNeeded: sortOrderNeedsFolderDeepDates(group.sorting?.order, group.secondarySorting?.order)
701702
}))
702703

703704
folderItems.forEach((item) => {
@@ -717,15 +718,15 @@ export const determineFolderDatesIfNeeded = (folderItems: Array<FolderItemForSor
717718
export const determineBookmarksOrderIfNeeded = (folderItems: Array<FolderItemForSorting>, sortingSpec: CustomSortSpec, plugin: BookmarksPluginInterface) => {
718719
if (!plugin) return
719720

720-
const folderDefaultSortRequiresBookmarksOrder: boolean = !!(sortingSpec.defaultOrder && sortOrderNeedsBookmarksOrder(sortingSpec.defaultOrder, sortingSpec.defaultSecondaryOrder))
721+
const folderDefaultSortRequiresBookmarksOrder: boolean = !!(sortingSpec.defaultSorting && sortOrderNeedsBookmarksOrder(sortingSpec.defaultSorting.order, sortingSpec.defaultSecondarySorting?.order))
721722

722723
folderItems.forEach((item) => {
723724
let groupSortRequiresBookmarksOrder: boolean = false
724725
if (!folderDefaultSortRequiresBookmarksOrder) {
725726
const groupIdx: number | undefined = item.groupIdx
726727
if (groupIdx !== undefined) {
727-
const groupOrder: CustomSortOrder | undefined = sortingSpec.groups[groupIdx].order
728-
const groupSecondaryOrder: CustomSortOrder | undefined = sortingSpec.groups[groupIdx].secondaryOrder
728+
const groupOrder: CustomSortOrder | undefined = sortingSpec.groups[groupIdx].sorting?.order
729+
const groupSecondaryOrder: CustomSortOrder | undefined = sortingSpec.groups[groupIdx].secondarySorting?.order
729730
groupSortRequiresBookmarksOrder = sortOrderNeedsBookmarksOrder(groupOrder, groupSecondaryOrder)
730731
}
731732
}

0 commit comments

Comments
 (0)