diff --git a/CalenTask/Support/NaturalDateParser.swift b/CalenTask/Support/NaturalDateParser.swift index 4d6aeca..87aadf8 100644 --- a/CalenTask/Support/NaturalDateParser.swift +++ b/CalenTask/Support/NaturalDateParser.swift @@ -12,7 +12,12 @@ enum NaturalDateParser { let cleanedText: String } + /// #64 — oltre questa lunghezza il testo non è una frase di cattura: niente + /// regex né data detector (evita costi superlineari su input enormi). + static let maxInputLength = 500 + static func parse(_ text: String, now: Date = .now, calendar: Calendar = .current) -> Match? { + guard text.count <= maxInputLength else { return nil } if let italian = parseItalian(text, now: now, calendar: calendar) { return italian } diff --git a/CalenTaskTests/CalenTaskTests.swift b/CalenTaskTests/CalenTaskTests.swift index 11124a3..d698d80 100644 --- a/CalenTaskTests/CalenTaskTests.swift +++ b/CalenTaskTests/CalenTaskTests.swift @@ -506,6 +506,11 @@ struct DomainModelTests { #expect(tagCount == 2) // "montaggio" survives as a workspace tag } + @Test func naturalDateParserIgnoraTestiTroppoLunghi() { + let long = "domani " + String(repeating: "a", count: NaturalDateParser.maxInputLength) + #expect(NaturalDateParser.parse(long) == nil) + } + @Test func italianRelativeDateParsing() throws { let calendar = Calendar.current let now = calendar.date(from: DateComponents(year: 2026, month: 6, day: 10, hour: 10))!