From 40587ff1b2cbd72fbdbf13a6b3c337bee1ab886c Mon Sep 17 00:00:00 2001 From: Darryl Smith Date: Thu, 29 Aug 2024 15:51:01 +0200 Subject: [PATCH 1/2] Allow for 'natural' sorting where numbers are treasted numerically and now as characters. --- src/models/PluginSettingsTab.ts | 4 +++- src/types/MarkdownTextRenderer.ts | 29 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/models/PluginSettingsTab.ts b/src/models/PluginSettingsTab.ts index 86032ec..20c7589 100644 --- a/src/models/PluginSettingsTab.ts +++ b/src/models/PluginSettingsTab.ts @@ -4,7 +4,9 @@ import FolderIndexPlugin from "../main"; export enum SortBy { None = "Disabled", Alphabetically = "Alphabetically", - ReverseAlphabetically = "Reverse Alphabetically" + ReverseAlphabetically = "Reverse Alphabetically", + Natural = "Natural", + ReverseNatural = "Reverse Natural" } export interface PluginSetting { diff --git a/src/types/MarkdownTextRenderer.ts b/src/types/MarkdownTextRenderer.ts index 1a1033e..98ff0a2 100644 --- a/src/types/MarkdownTextRenderer.ts +++ b/src/types/MarkdownTextRenderer.ts @@ -199,10 +199,39 @@ export class MarkdownTextRenderer { fileTree.sort((a, b) => a.name.localeCompare(b.name)) } else if (this.plugin.settings.sortIndexFiles === SortBy.ReverseAlphabetically) { fileTree.sort((a, b) => b.name.localeCompare(a.name)) + } else if (this.plugin.settings.sortIndexFiles === SortBy.Natural) { + fileTree.sort((a, b) => this.naturalSort(a, b)) + } else if (this.plugin.settings.sortIndexFiles === SortBy.ReverseNatural) { + fileTree.sort((a, b) => this.naturalSort(b, a)) } return fileTree } + private naturalSort(a: string, b: string): number { + const re = /(\d+)|(\D+)/g; + const aParts = a.split(re).filter(part => part.length > 0); + const bParts = b.split(re).filter(part => part.length > 0); + + for (let i = 0; i < Math.min(aParts.length, bParts.length); i++) { + const aPart = aParts[i]; + const bPart = bParts[i]; + + if (!isNaN(Number(aPart)) && !isNaN(Number(bPart))) { + const numA = Number(aPart); + const numB = Number(bPart); + if (numA !== numB) { + return numA - numB; + } + } else { + if (aPart !== bPart) { + return aPart.localeCompare(bPart); + } + } + } + + return aParts.length - bParts.length; + } + private buildIndentLevel(indentLevel: number): string { let indentText = "" for (let j = 0; j < indentLevel; j++) { From 8b6edf887314de1ddc289e099eddfd58ecd5ac65 Mon Sep 17 00:00:00 2001 From: Darryl Smith Date: Thu, 29 Aug 2024 16:29:29 +0200 Subject: [PATCH 2/2] Fix value sent in --- src/types/MarkdownTextRenderer.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/types/MarkdownTextRenderer.ts b/src/types/MarkdownTextRenderer.ts index 98ff0a2..8d9b647 100644 --- a/src/types/MarkdownTextRenderer.ts +++ b/src/types/MarkdownTextRenderer.ts @@ -200,17 +200,17 @@ export class MarkdownTextRenderer { } else if (this.plugin.settings.sortIndexFiles === SortBy.ReverseAlphabetically) { fileTree.sort((a, b) => b.name.localeCompare(a.name)) } else if (this.plugin.settings.sortIndexFiles === SortBy.Natural) { - fileTree.sort((a, b) => this.naturalSort(a, b)) + fileTree.sort((a, b) => this.naturalSort(a.name, b.name)) } else if (this.plugin.settings.sortIndexFiles === SortBy.ReverseNatural) { - fileTree.sort((a, b) => this.naturalSort(b, a)) + fileTree.sort((a, b) => this.naturalSort(b.name, a.name)) } return fileTree } private naturalSort(a: string, b: string): number { const re = /(\d+)|(\D+)/g; - const aParts = a.split(re).filter(part => part.length > 0); - const bParts = b.split(re).filter(part => part.length > 0); + const aParts = a.split(re).filter((item) => item !== undefined && item.length > 0); + const bParts = b.split(re).filter((item) => item !== undefined && item.length > 0) for (let i = 0; i < Math.min(aParts.length, bParts.length); i++) { const aPart = aParts[i];