Quick-add: detect "everyday" and "every weekday" recurrence

parseRecurrence required a space ("every day"), so "everyday" (one word) was
missed. Now \bevery\s*day\b matches both, plus "each day". Added Every Weekday
detection ("every weekday", "weekdays") ahead of the broader weekly/daily
patterns. Sub-day cadence ("every hour"/"hourly") is intentionally NOT matched —
the occurrence engine is day-granular, so it stays a one-off rather than being
mislabeled. 6 parser tests added.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
kutesir
2026-06-24 21:02:57 +03:00
parent af2996876c
commit 8370125ec0
3 changed files with 71 additions and 9 deletions

View File

@@ -1649,16 +1649,23 @@ struct NLTaskParser {
// MARK: - Recurrence
private static func parseRecurrence(in text: String) -> (NSRange, String)? {
// Order matters: more specific phrases ("every weekday") must precede the
// broader ones ("every week" / "every day") so they win.
let pats: [(String, String)] = [
("\\bevery\\s+year\\b", "Yearly"),
("\\bannually\\b", "Yearly"),
("\\byearly\\b", "Yearly"),
("\\bevery\\s+month\\b", "Monthly"),
("\\bmonthly\\b", "Monthly"),
("\\bevery\\s+week\\b", "Weekly"),
("\\bweekly\\b", "Weekly"),
("\\bevery\\s+day\\b", "Daily"),
("\\bdaily\\b", "Daily"),
("\\bevery\\s+year\\b", "Yearly"),
("\\bevery\\s+single\\s+year\\b", "Yearly"),
("\\bannually\\b", "Yearly"),
("\\byearly\\b", "Yearly"),
("\\bevery\\s+month\\b", "Monthly"),
("\\bmonthly\\b", "Monthly"),
("\\bevery\\s+weekday(s)?\\b", "Every Weekday"),
("\\bevery\\s+week\\s*day(s)?\\b", "Every Weekday"),
("\\bweekdays\\b", "Every Weekday"),
("\\bevery\\s+week\\b", "Weekly"),
("\\bweekly\\b", "Weekly"),
("\\bevery\\s*day\\b", "Daily"), // matches "every day" AND "everyday"
("\\beach\\s+day\\b", "Daily"),
("\\bdaily\\b", "Daily"),
]
for (pat, label) in pats {
if let r = match(pat, in: text) { return (r, label) }