From c2384ff7ad4bb45dfe6ab13b555065d84b7b1f40 Mon Sep 17 00:00:00 2001 From: DualFroz Date: Sat, 3 Oct 2026 01:52:53 +0200 Subject: [PATCH] feat(rules): add the aggressive deadline option to nl and br --- rules/br/deadline.go | 15 +++++++++++++-- rules/br/deadline_test.go | 20 ++++++++++++++++++++ rules/nl/deadline.go | 15 +++++++++++++-- rules/nl/deadline_test.go | 20 ++++++++++++++++++++ 4 files changed, 66 insertions(+), 4 deletions(-) diff --git a/rules/br/deadline.go b/rules/br/deadline.go index 3d1d639..4ad5d60 100644 --- a/rules/br/deadline.go +++ b/rules/br/deadline.go @@ -11,12 +11,23 @@ import ( "github.com/pkg/errors" ) -func Deadline(s rules.Strategy) rules.Rule { +// DeadlineOptions configures the Deadline rule. +type DeadlineOptions struct { + // Aggressive makes the "dentro de"/"em" prefix optional, so "3 dias" matches too. + Aggressive bool +} + +func Deadline(s rules.Strategy, opts ...DeadlineOptions) rules.Rule { overwrite := s == rules.Override + prefix := "(dentro\\sde|em)" + if len(opts) > 0 && opts[0].Aggressive { + prefix += "?" + } + return &rules.F{ RegExp: regexp.MustCompile( - "(?i)(?:\\W|^)(dentro\\sde|em)\\s*" + + "(?i)(?:\\W|^)" + prefix + "\\s*" + "(?:(" + INTEGER_WORDS_PATTERN + "|[0-9]+|(?:\\s*pouc[oa](?:s|)?|algu(?:mas|m|ns)?|mei[oa]?))\\s*" + "(segundos?|min(?:uto)?s?|horas?|dias?|semanas?|mês|meses|anos?)\\s*)" + "(?:\\W|$)"), diff --git a/rules/br/deadline_test.go b/rules/br/deadline_test.go index caba3d9..dd1f5ff 100644 --- a/rules/br/deadline_test.go +++ b/rules/br/deadline_test.go @@ -32,3 +32,23 @@ func TestDeadline(t *testing.T) { ApplyFixtures(t, "br.Deadline", w, fixt) } + +func TestDeadlineAggressive(t *testing.T) { + fixt := []Fixture{ + {"3 dias", 0, "3 dias", 3 * 24 * time.Hour}, + {"me lembre 4 dias depois", 10, "4 dias", 4 * 24 * time.Hour}, + {"uma semana", 0, "uma semana", 7 * 24 * time.Hour}, + {"dentro de meia hora", 0, "dentro de meia hora", time.Hour / 2}, + {"me ligue em 5 minutos", 9, "em 5 minutos", 5 * time.Minute}, + } + + w := when.New(nil) + w.Add(br.Deadline(rules.Skip, br.DeadlineOptions{Aggressive: true})) + + ApplyFixtures(t, "br.Deadline aggressive", w, fixt) + + w = when.New(nil) + w.Add(br.Deadline(rules.Skip)) + + ApplyFixturesNil(t, "br.Deadline", w, []Fixture{{"3 dias", 0, "", 0}}) +} diff --git a/rules/nl/deadline.go b/rules/nl/deadline.go index 6f2212c..1e0a61d 100644 --- a/rules/nl/deadline.go +++ b/rules/nl/deadline.go @@ -11,12 +11,23 @@ import ( "github.com/pkg/errors" ) -func Deadline(s rules.Strategy) rules.Rule { +// DeadlineOptions configures the Deadline rule. +type DeadlineOptions struct { + // Aggressive makes the "binnen"/"in"/"over"/"na" prefix optional, so "3 dagen" matches too. + Aggressive bool +} + +func Deadline(s rules.Strategy, opts ...DeadlineOptions) rules.Rule { overwrite := s == rules.Override + prefix := "(binnen|in|over|na)" + if len(opts) > 0 && opts[0].Aggressive { + prefix += "?" + } + return &rules.F{ RegExp: regexp.MustCompile( - "(?i)(?:\\W|^)(binnen|in|over|na)\\s*" + + "(?i)(?:\\W|^)" + prefix + "\\s*" + "(" + INTEGER_WORDS_PATTERN + "|[0-9]+|een(?:\\s*(paar|half|halve))?)\\s*" + "(seconden?|minuut|minuten|uur|uren|dag|dagen|week|weken|maand|maanden|jaar|jaren)\\s*" + "(?:\\W|$)"), diff --git a/rules/nl/deadline_test.go b/rules/nl/deadline_test.go index 0fc6f94..bfbce89 100644 --- a/rules/nl/deadline_test.go +++ b/rules/nl/deadline_test.go @@ -32,3 +32,23 @@ func TestDeadline(t *testing.T) { ApplyFixtures(t, "nl.Deadline", w, fixt) } + +func TestDeadlineAggressive(t *testing.T) { + fixt := []Fixture{ + {"3 dagen", 0, "3 dagen", 3 * 24 * time.Hour}, + {"herinner me 4 dagen later", 12, "4 dagen", 4 * 24 * time.Hour}, + {"een week", 0, "een week", 7 * 24 * time.Hour}, + {"binnen een half uur", 0, "binnen een half uur", time.Hour / 2}, + {"bel me over 5 minuten terug", 7, "over 5 minuten", 5 * time.Minute}, + } + + w := when.New(nil) + w.Add(nl.Deadline(rules.Skip, nl.DeadlineOptions{Aggressive: true})) + + ApplyFixtures(t, "nl.Deadline aggressive", w, fixt) + + w = when.New(nil) + w.Add(nl.Deadline(rules.Skip)) + + ApplyFixturesNil(t, "nl.Deadline", w, []Fixture{{"3 dagen", 0, "", 0}}) +}