aboutsummaryrefslogtreecommitdiff
path: root/src/then.nim
diff options
context:
space:
mode:
authorhistoria <gravel.justness270@slmail.me>2024-07-30 00:26:29 -0400
committerhistoria <gravel.justness270@slmail.me>2024-07-30 00:26:29 -0400
commit43d1d1ef9b75e694f1b3e49ceaf319d87f6b14a9 (patch)
tree9a6bf1474ae77363f115f32b2a4ce2b475c6b728 /src/then.nim
parent2438fe0116bb4c8abafb4e236c148ba0f8290e6a (diff)
downloadsoon-43d1d1ef9b75e694f1b3e49ceaf319d87f6b14a9.tar.gz
Removed ! from Julian dates. Minor work on logic.
Diffstat (limited to 'src/then.nim')
-rw-r--r--src/then.nim70
1 files changed, 40 insertions, 30 deletions
diff --git a/src/then.nim b/src/then.nim
index c7c1e61..4e878b5 100644
--- a/src/then.nim
+++ b/src/then.nim
@@ -62,32 +62,40 @@ proc checkType(c: string): string =
if cond in DefaultLocale.MMM.toHashSet or cond in DefaultLocale.MMMM.toHashSet: return "month"
if cond in DefaultLocale.ddd.toHashSet or cond in DefaultLocale.dddd.toHashSet: return "dayofweek"
if find(cond, re"\d{1,2}:\d{2}") > -1: return "time"
- if find(cond, re"\dw") > -1: return "firstweek"
- if find(cond, re"\dl") > -1: return "lastweek"
- if find(cond, re"J%\d([-+]\d)?") > -1: return "julian"
+ if find(cond, re"^\dw$") > -1: return "firstweek"
+ if find(cond, re"^\dl$") > -1: return "lastweek"
+ if find(cond, re"^\(?\s*J\s*%\s*\d\s*([-+]\d)?\s*\)?$") > -1: return "julian"
+ if find(cond, re"^\(.*\)$") > -1: return "dategroup"
return "unknown"
-proc checkCond(cond: string, day: DateTime): bool =
+proc getWeekFromEnd(date: DateTime): int =
+ let daysInMonth = getDaysInMonth(date.month, date.year)
+ return int((daysInMonth - date.monthday) / 7) + 1
+
+proc getWeek(date: DateTime): int =
+ return int((date.monthDay -1) / 7) + 1
+
+proc checkCond(cond: string, date: DateTime): bool =
case checkType(cond):
of "year":
- if parseInt(cond) == day.year: return true
- of "day":
- if parseInt(cond) == parseInt(day.format("d")): return true
- if parseInt(cond) == parseInt(day.format("dd")): return true
+ if parseInt(cond) == date.year: return true
+ of "date":
+ if parseInt(cond) == parseInt(date.format("d")): return true
+ if parseInt(cond) == parseInt(date.format("dd")): return true
of "month":
- if cond == day.format("MMM"): return true
- if cond == day.format("MMMM"): return true
+ if cond == date.format("MMM"): return true
+ if cond == date.format("MMMM"): return true
of "dayofweek":
- if cond == day.format("ddd"): return true
- if cond == day.format("dddd"): return true
+ if cond == date.format("ddd"): return true
+ if cond == date.format("dddd"): return true
of "time":
return true
of "firstweek":
- discard
-# Uh oh we didn't think about this hard enough
-
+ if cond[0] == getWeek(date): return true
+ of "lastweek":
+ if cond[0] == getWeekFromEnd(date): return true
of "unknown":
- echo "UNKNOWN THING ", cond
+ echo "ERROR: Unknown condition: ", cond
return false
# Splits a string on whitespace, but maintains whitespace in date groups
@@ -95,14 +103,15 @@ proc splitWhitespaceExceptParens(str:string): seq[string] =
var result: seq[string] = newSeq[string]()
var inParens = false
for token in str.splitWhitespace:
- if token.contains(')'): inParens = false
if inParens:
result.add(result.pop & ' ' & token)
else:
result.add(token)
if token.contains('('): inParens = true
+ if token.contains(')'): inParens = false
return result
+# Returns Table[conditionType, seq of conditions]
proc parseDateToTable(date:string): Table[string,seq[string]] =
var table = initTable[string,seq[string]]()
let conditions = splitWhitespaceExceptParens(date)
@@ -114,7 +123,7 @@ proc parseDateToTable(date:string): Table[string,seq[string]] =
return table
-proc getEvents(cal: seq[string], day: DateTime): seq[string] =
+proc getEvents(cal: seq[string], date: DateTime): seq[string] =
var events: seq[string] = newSeq[string]()
for line in cal:
var (success, date, event) = scanTuple(line, "$*,$*")
@@ -122,24 +131,25 @@ proc getEvents(cal: seq[string], day: DateTime): seq[string] =
date.strip
event.strip
let conditions = parseDateToTable(date)
- echo conditions
var match = true
- #for c in conditions:
- # var cond = c.toLower.capitalizeAscii
- # if checkCond(cond, day) == false:
- # match = false
- # break
- #if match:
- # events.add(event)
- # break
+ # This logic no longer works for how we've made the table
+ for k,cs in conditions:
+ for c in cs:
+ var cond = c.toLower.capitalizeAscii
+ if checkCond(cond, date) == false:
+ match = false
+ break
+ if match:
+ events.add(event)
+ break
else:
echo "WARNING: Cannot parse line: ", line
return events
-proc printEvents(cal: seq[string], day: DateTime) =
- let events = getEvents(cal, day)
+proc printEvents(cal: seq[string], date: DateTime) =
+ let events = getEvents(cal, date)
if events.len > 0:
- echo day.format("ddd yyyy MMM dd")
+ echo date.format("ddd yyyy MMM dd")
for e in events:
echo " - ", e