diff --git a/src/helpers/time/parseDate.ts b/src/helpers/time/parseDate.ts index e0ad69e72..124acd5c2 100644 --- a/src/helpers/time/parseDate.ts +++ b/src/helpers/time/parseDate.ts @@ -15,34 +15,32 @@ interface dateFoundResult { const monthsRegexGroup = '(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)' function matchesDateExpr(text: string, dateExpr: string): boolean { - return text.match(new RegExp('(^| )' + dateExpr, 'g')) !== null + return text.match(new RegExp('(^| )' + dateExpr, 'gi')) !== null } export const parseDate = (text: string, now: Date = new Date()): dateParseResult => { - const lowerText: string = text.toLowerCase() - - if (matchesDateExpr(lowerText, 'today')) { + if (matchesDateExpr(text, 'today')) { return addTimeToDate(text, getDateFromInterval(calculateDayInterval('today')), 'today') } - if (matchesDateExpr(lowerText, 'tomorrow')) { + if (matchesDateExpr(text, 'tomorrow')) { return addTimeToDate(text, getDateFromInterval(calculateDayInterval('tomorrow')), 'tomorrow') } - if (matchesDateExpr(lowerText, 'next monday')) { + if (matchesDateExpr(text, 'next monday')) { return addTimeToDate(text, getDateFromInterval(calculateDayInterval('nextMonday')), 'next monday') } - if (matchesDateExpr(lowerText, 'this weekend')) { + if (matchesDateExpr(text, 'this weekend')) { return addTimeToDate(text, getDateFromInterval(calculateDayInterval('thisWeekend')), 'this weekend') } - if (matchesDateExpr(lowerText, 'later this week')) { + if (matchesDateExpr(text, 'later this week')) { return addTimeToDate(text, getDateFromInterval(calculateDayInterval('laterThisWeek')), 'later this week') } - if (matchesDateExpr(lowerText, 'later next week')) { + if (matchesDateExpr(text, 'later next week')) { return addTimeToDate(text, getDateFromInterval(calculateDayInterval('laterNextWeek')), 'later next week') } - if (matchesDateExpr(lowerText, 'next week')) { + if (matchesDateExpr(text, 'next week')) { return addTimeToDate(text, getDateFromInterval(calculateDayInterval('nextWeek')), 'next week') } - if (matchesDateExpr(lowerText, 'next month')) { + if (matchesDateExpr(text, 'next month')) { const date: Date = new Date() date.setDate(1) date.setMonth(date.getMonth() + 1) @@ -52,7 +50,7 @@ export const parseDate = (text: string, now: Date = new Date()): dateParseResult return addTimeToDate(text, date, 'next month') } - if (matchesDateExpr(lowerText, 'end of month')) { + if (matchesDateExpr(text, 'end of month')) { const curDate: Date = new Date() const date: Date = new Date(curDate.getFullYear(), curDate.getMonth() + 1, 0) date.setHours(calculateNearestHours(date)) @@ -70,7 +68,7 @@ export const parseDate = (text: string, now: Date = new Date()): dateParseResult parsed = getDayFromText(text) if (parsed.date !== null) { const month = getMonthFromText(text, parsed.date) - return addTimeToDate(text, month.date, parsed.foundText) + return addTimeToDate(month.newText, month.date, parsed.foundText) } parsed = getDateFromTextIn(text, now) @@ -123,7 +121,7 @@ const addTimeToDate = (text: string, date: Date, previousMatch: string | null): const replace = results !== null ? results[0] : previousMatch return { - newText: replaceAll(text, replace, ''), + newText: replaceAll(text, replace, '').trim(), date: date, } } diff --git a/src/modules/parseTaskText.test.ts b/src/modules/parseTaskText.test.ts index efd599844..7213e6cc5 100644 --- a/src/modules/parseTaskText.test.ts +++ b/src/modules/parseTaskText.test.ts @@ -112,6 +112,16 @@ describe('Parse Task Text', () => { expect(result?.date?.getMonth()).toBe(tomorrow.getMonth()) expect(result?.date?.getDate()).toBe(tomorrow.getDate()) }) + it('should recognize Tomorrow', () => { + const result = parseTaskText('Lorem Ipsum Tomorrow') + + expect(result.text).toBe('Lorem Ipsum') + const tomorrow = new Date() + tomorrow.setDate(tomorrow.getDate() + 1) + expect(result?.date?.getFullYear()).toBe(tomorrow.getFullYear()) + expect(result?.date?.getMonth()).toBe(tomorrow.getMonth()) + expect(result?.date?.getDate()).toBe(tomorrow.getDate()) + }) it('should recognize next monday', () => { const result = parseTaskText('Lorem Ipsum next monday') @@ -441,7 +451,7 @@ describe('Parse Task Text', () => { '06/08/2021': '2021-6-8', '6/7/21': '2021-6-7', '27/07/2021,': null, - '2021/07/06,': '2021-7-6', + '2021/07/06': '2021-7-6', '2021-07-06': '2021-7-6', '27 jan': '2022-1-27', '27/1': '2022-1-27', @@ -449,39 +459,52 @@ describe('Parse Task Text', () => { '16/12': '2021-12-16', '01/27': '2022-1-27', '1/27': '2022-1-27', - 'Jan 27': '2022-1-27', 'jan 27': '2022-1-27', + 'Jan 27': '2022-1-27', 'feb 21': '2022-2-21', + 'Feb 21': '2022-2-21', 'mar 21': '2022-3-21', + 'Mar 21': '2022-3-21', 'apr 21': '2022-4-21', + 'Apr 21': '2022-4-21', 'may 21': '2022-5-21', + 'May 21': '2022-5-21', 'jun 21': '2022-6-21', + 'Jun 21': '2022-6-21', 'jul 21': '2021-7-21', + 'Jul 21': '2021-7-21', 'aug 21': '2021-8-21', + 'Aug 21': '2021-8-21', 'sep 21': '2021-9-21', + 'Sep 21': '2021-9-21', 'oct 21': '2021-10-21', + 'Oct 21': '2021-10-21', 'nov 21': '2021-11-21', + 'Nov 21': '2021-11-21', 'dec 21': '2021-12-21', + 'Dec 21': '2021-12-21', } as Record for (const c in cases) { it(`should parse '${c}' as '${cases[c]}' with the date at the end`, () => { - const {date} = getDateFromText(`Lorem Ipsum ${c}`, now) + const {date, foundText} = getDateFromText(`Lorem Ipsum ${c}`, now) if (date === null && cases[c] === null) { expect(date).toBeNull() return } expect(`${date?.getFullYear()}-${date?.getMonth() + 1}-${date?.getDate()}`).toBe(cases[c]) + expect(foundText.trim()).toBe(c) }) it(`should parse '${c}' as '${cases[c]}' with the date at the beginning`, () => { - const {date} = getDateFromText(`${c} Lorem Ipsum`, now) + const {date, foundText} = getDateFromText(`${c} Lorem Ipsum`, now) if (date === null && cases[c] === null) { expect(date).toBeNull() return } expect(`${date?.getFullYear()}-${date?.getMonth() + 1}-${date?.getDate()}`).toBe(cases[c]) + expect(foundText.trim()).toBe(c) }) } }) @@ -532,6 +555,20 @@ describe('Parse Task Text', () => { expect(`${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()} ${date.getHours()}:${date.getMinutes()}`).toBe(cases[c]) }) } + + it('should replace the text in title case', () => { + const {date, newText} = parseDate('Some task Mar 8th', now) + + expect(`${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()} ${date.getHours()}:${date.getMinutes()}`).toBe('2021-3-8 12:0') + expect(newText).toBe('Some task') + }) + + it('should replace the text in lowercase', () => { + const {date, newText} = parseDate('Some task mar 8th', now) + + expect(`${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()} ${date.getHours()}:${date.getMinutes()}`).toBe('2021-3-8 12:0') + expect(newText).toBe('Some task') + }) }) })