From 44631bee4f3b5dfb2f6f09d041570dce37fbbce4 Mon Sep 17 00:00:00 2001 From: SebastianMC <23032356+SebastianMC@users.noreply.github.com> Date: Thu, 23 Jan 2025 23:04:14 +0100 Subject: [PATCH] Added support for more formats of dates extraction from titles - \[dd-mm-yyyy] and \[mm-dd-yyyy] - main README.md updated accordingly --- README.md | 2 +- src/custom-sort/matchers.ts | 5 +++++ src/custom-sort/sorting-spec-processor.ts | 22 ++++++++++++++++++++ src/test/unit/sorting-spec-processor.spec.ts | 18 +++++++++++++++- 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 186d954..aad0c43 100644 --- a/README.md +++ b/README.md @@ -175,7 +175,7 @@ The list of automatic sorting orders includes: - `\R+`, `\.R+` or `\-R+` for Roman numbers - `\d+`, `\.d+` or `\-d+` for plain numbers or compound plain numbers - `\a+` to extract the last word from title -- `\[yyyy-mm-dd]`, `\[yyyy-dd-mm]`, `\[dd-Mmm-yyyy]`, `\[Mmm-dd-yyyy]`, `\[yyyy-Www (mm-dd)]`, `\[yyyy-Www]` or `\[yyyy-WwwISO]` to extract dates in various formats +- `\[yyyy-mm-dd]`, `\[yyyy-dd-mm]`, `\[dd-Mmm-yyyy]`, `\[mm-dd-yyyy]`, `\[dd-mm-yyyy]`, `\[Mmm-dd-yyyy]`, `\[yyyy-Www (mm-dd)]`, `\[yyyy-Www]` or `\[yyyy-WwwISO]` to extract dates in various formats ## Sorting by note name and note name with file extension diff --git a/src/custom-sort/matchers.ts b/src/custom-sort/matchers.ts index a48133e..a2605af 100644 --- a/src/custom-sort/matchers.ts +++ b/src/custom-sort/matchers.ts @@ -13,6 +13,9 @@ export const CompoundNumberDashRegexStr: string = ' *(\\d+(?:-\\d+)*)'; // Compo export const Date_yyyy_mm_dd_RegexStr: string = ' *(\\d{4}-[0-3]*[0-9]-[0-3]*[0-9])' export const Date_yyyy_dd_mm_RegexStr: string = Date_yyyy_mm_dd_RegexStr +export const Date_mm_dd_yyyy_RegexStr: string = ' *([0-3]*[0-9]-[0-3]*[0-9]-\\d{4})' +export const Date_dd_mm_yyyy_RegexStr: string = Date_mm_dd_yyyy_RegexStr + export const Date_dd_Mmm_yyyy_RegexStr: string = ' *([0-3]*[0-9]-(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-\\d{4})'; // Date like 01-Jan-2020 export const Date_Mmm_dd_yyyy_RegexStr: string = ' *((?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-[0-3]*[0-9]-\\d{4})'; // Date like Jan-01-2020 @@ -138,6 +141,8 @@ export function getNormalizedDate_NormalizerFn_for(separator: string, dayIdx: nu export const getNormalizedDate_yyyy_mm_dd_NormalizerFn = getNormalizedDate_NormalizerFn_for('-', 2, 1, 0) export const getNormalizedDate_yyyy_dd_mm_NormalizerFn = getNormalizedDate_NormalizerFn_for('-', 1, 2, 0) +export const getNormalizedDate_mm_dd_yyyy_NormalizerFn = getNormalizedDate_NormalizerFn_for('-', 1, 0, 2) +export const getNormalizedDate_dd_mm_yyyy_NormalizerFn = getNormalizedDate_NormalizerFn_for('-', 0, 1, 2) export const getNormalizedDate_dd_Mmm_yyyy_NormalizerFn = getNormalizedDate_NormalizerFn_for('-', 0, 1, 2, MONTHS) export const getNormalizedDate_Mmm_dd_yyyy_NormalizerFn = getNormalizedDate_NormalizerFn_for('-', 1, 0, 2, MONTHS) diff --git a/src/custom-sort/sorting-spec-processor.ts b/src/custom-sort/sorting-spec-processor.ts index 0217f3e..2081339 100644 --- a/src/custom-sort/sorting-spec-processor.ts +++ b/src/custom-sort/sorting-spec-processor.ts @@ -17,7 +17,9 @@ import { CompoundRomanNumberDashRegexStr, CompoundRomanNumberDotRegexStr, DASH_SEPARATOR, + Date_dd_mm_yyyy_RegexStr, Date_dd_Mmm_yyyy_RegexStr, + Date_mm_dd_yyyy_RegexStr, Date_Mmm_dd_yyyy_RegexStr, Date_yyyy_dd_mm_RegexStr, Date_yyyy_mm_dd_RegexStr, @@ -25,7 +27,9 @@ import { Date_yyyy_Www_RegexStr, Date_yyyy_WwwISO_RegexStr, DOT_SEPARATOR, + getNormalizedDate_dd_mm_yyyy_NormalizerFn, getNormalizedDate_dd_Mmm_yyyy_NormalizerFn, + getNormalizedDate_mm_dd_yyyy_NormalizerFn, getNormalizedDate_Mmm_dd_yyyy_NormalizerFn, getNormalizedDate_yyyy_dd_mm_NormalizerFn, getNormalizedDate_yyyy_mm_dd_NormalizerFn, @@ -363,6 +367,8 @@ const Date_yyyy_mm_dd_RegexSymbol: string = '\\[yyyy-mm-dd]' const Date_yyyy_dd_mm_RegexSymbol: string = '\\[yyyy-dd-mm]' const Date_dd_Mmm_yyyy_RegexSymbol: string = '\\[dd-Mmm-yyyy]' const Date_Mmm_dd_yyyy_RegexSymbol: string = '\\[Mmm-dd-yyyy]' +const Date_dd_mm_yyyy_RegexSymbol: string = '\\[dd-mm-yyyy]' +const Date_mm_dd_yyyy_RegexSymbol: string = '\\[mm-dd-yyyy]' const Date_yyyy_Www_mm_dd_RegexSymbol: string = '\\[yyyy-Www (mm-dd)]' const Date_yyyy_Www_RegexSymbol: string = '\\[yyyy-Www]' const Date_yyyy_WwwISO_RegexSymbol: string = '\\[yyyy-WwwISO]' @@ -389,6 +395,8 @@ const sortingSymbolsArr: Array = [ escapeRegexUnsafeCharacters(Date_yyyy_dd_mm_RegexSymbol), escapeRegexUnsafeCharacters(Date_dd_Mmm_yyyy_RegexSymbol), escapeRegexUnsafeCharacters(Date_Mmm_dd_yyyy_RegexSymbol), + escapeRegexUnsafeCharacters(Date_dd_mm_yyyy_RegexSymbol), + escapeRegexUnsafeCharacters(Date_mm_dd_yyyy_RegexSymbol), escapeRegexUnsafeCharacters(Date_yyyy_Www_mm_dd_RegexSymbol), escapeRegexUnsafeCharacters(Date_yyyy_WwwISO_RegexSymbol), escapeRegexUnsafeCharacters(Date_yyyy_Www_RegexSymbol), @@ -463,6 +471,8 @@ export const Date_yyyy_mm_dd_NormalizerFn: NormalizerFn = (s: string) => getNorm export const Date_yyyy_dd_mm_NormalizerFn: NormalizerFn = (s: string) => getNormalizedDate_yyyy_dd_mm_NormalizerFn(s) export const Date_dd_Mmm_yyyy_NormalizerFn: NormalizerFn = (s: string) => getNormalizedDate_dd_Mmm_yyyy_NormalizerFn(s) export const Date_Mmm_dd_yyyy_NormalizerFn: NormalizerFn = (s: string) => getNormalizedDate_Mmm_dd_yyyy_NormalizerFn(s) +export const Date_dd_mm_yyyy_NormalizerFn: NormalizerFn = (s: string) => getNormalizedDate_dd_mm_yyyy_NormalizerFn(s) +export const Date_mm_dd_yyyy_NormalizerFn: NormalizerFn = (s: string) => getNormalizedDate_mm_dd_yyyy_NormalizerFn(s) export const Date_yyyy_Www_mm_dd_NormalizerFn: NormalizerFn = (s: string) => getNormalizedDate_yyyy_Www_mm_dd_NormalizerFn(s) export const Date_yyyy_WwwISO_NormalizerFn: NormalizerFn = (s: string) => getNormalizedDate_yyyy_WwwISO_NormalizerFn(s) export const Date_yyyy_Www_NormalizerFn: NormalizerFn = (s: string) => getNormalizedDate_yyyy_Www_NormalizerFn(s) @@ -481,6 +491,8 @@ export enum AdvancedRegexType { Date_yyyy_dd_mm, Date_dd_Mmm_yyyy, Date_Mmm_dd_yyyy, + Date_dd_mm_yyyy, + Date_mm_dd_yyyy, Date_yyyy_Www_mm_dd_yyyy, Date_yyyy_WwwISO, Date_yyyy_Www @@ -548,6 +560,16 @@ const sortingSymbolToRegexpStr: { [key: string]: RegExpSpecStr } = { normalizerFn: Date_Mmm_dd_yyyy_NormalizerFn, advancedRegexType: AdvancedRegexType.Date_Mmm_dd_yyyy }, + [Date_dd_mm_yyyy_RegexSymbol]: { // Intentionally retain character case + regexpStr: Date_dd_mm_yyyy_RegexStr, + normalizerFn: Date_dd_mm_yyyy_NormalizerFn, + advancedRegexType: AdvancedRegexType.Date_dd_mm_yyyy + }, + [Date_mm_dd_yyyy_RegexSymbol]: { // Intentionally retain character case + regexpStr: Date_mm_dd_yyyy_RegexStr, + normalizerFn: Date_mm_dd_yyyy_NormalizerFn, + advancedRegexType: AdvancedRegexType.Date_mm_dd_yyyy + }, [Date_yyyy_Www_mm_dd_RegexSymbol]: { // Intentionally retain character case regexpStr: Date_yyyy_Www_mm_dd_RegexStr, normalizerFn: Date_yyyy_Www_mm_dd_NormalizerFn, diff --git a/src/test/unit/sorting-spec-processor.spec.ts b/src/test/unit/sorting-spec-processor.spec.ts index 891013c..9075975 100644 --- a/src/test/unit/sorting-spec-processor.spec.ts +++ b/src/test/unit/sorting-spec-processor.spec.ts @@ -5,7 +5,9 @@ import { ConsumedFolderMatchingRegexp, consumeFolderByRegexpExpression, convertPlainStringToRegex, + Date_dd_mm_yyyy_NormalizerFn, Date_dd_Mmm_yyyy_NormalizerFn, + Date_mm_dd_yyyy_NormalizerFn, Date_Mmm_dd_yyyy_NormalizerFn, Date_yyyy_dd_mm_NormalizerFn, Date_yyyy_mm_dd_NormalizerFn, @@ -387,6 +389,8 @@ Week number interpreted in ISO standard \\[yyyy-WwwISO] Week number interpreted in U.S. standard \\[yyyy-Www] \\[yyyy-mm-dd] plain spec 1 \\[yyyy-dd-mm] plain spec 2 +\\[dd-mm-yyyy] plain spec 3 +\\[mm-dd-yyyy] plain spec 4 ` const expectedSortSpecsExampleSortingSymbols: { [key: string]: CustomSortSpec } = { @@ -479,11 +483,23 @@ const expectedSortSpecsExampleSortingSymbols: { [key: string]: CustomSortSpec } regex: /^ *(\d{4}-[0-3]*[0-9]-[0-3]*[0-9]) plain spec 2$/i, normalizerFn: Date_yyyy_dd_mm_NormalizerFn } + }, { + type: CustomSortGroupType.ExactName, + regexPrefix: { + regex: /^ *([0-3]*[0-9]-[0-3]*[0-9]-\d{4}) plain spec 3$/i, + normalizerFn: Date_dd_mm_yyyy_NormalizerFn + } + }, { + type: CustomSortGroupType.ExactName, + regexPrefix: { + regex: /^ *([0-3]*[0-9]-[0-3]*[0-9]-\d{4}) plain spec 4$/i, + normalizerFn: Date_mm_dd_yyyy_NormalizerFn + } }, { type: CustomSortGroupType.Outsiders }], targetFoldersPaths: ['mock-folder'], - outsidersGroupIdx: 14 + outsidersGroupIdx: 16 } }