aboutsummaryrefslogtreecommitdiff
path: root/src/then.nim
diff options
context:
space:
mode:
authorhistoria <gravel.justness270@slmail.me>2024-07-30 16:15:05 -0400
committerhistoria <gravel.justness270@slmail.me>2024-07-30 16:15:05 -0400
commite11dbc84bd5a989109a786096d537d457fcaf409 (patch)
tree24cdbb24d8a87c4a3d86c1704d9454773882ce16 /src/then.nim
parentcccf5f28651a54fbab55dfb79456fbecf9d71a78 (diff)
downloadsoon-e11dbc84bd5a989109a786096d537d457fcaf409.tar.gz
Basic logic working (no groups, ranges, or Julian)
Diffstat (limited to 'src/then.nim')
-rw-r--r--src/then.nim106
1 files changed, 51 insertions, 55 deletions
diff --git a/src/then.nim b/src/then.nim
index 44a7076..fb7de90 100644
--- a/src/then.nim
+++ b/src/then.nim
@@ -1,15 +1,12 @@
import std/[times, os, strutils, strbasics, strscans, sets, re, tables], parseopt
const VERSION = "0.1"
+const MONTHS = DefaultLocale.MMM.toHashSet + DefaultLocale.MMMM.toHashSet
+const WEEKDAYS = DefaultLocale.ddd.toHashSet + DefaultLocale.dddd.toHashSet
const configDir = expandTilde("~/.config/then/")
const defaultConfigFile = configDir & "then.toml"
const defaultCalendarFile = configDir & "calendar.then"
-type
- Token = object
- token: string
- precedence: int
-
# Creates a default configuration file if it doesn't exist
proc createDefaultConfigFile() =
if not fileExists(defaultConfigFile):
@@ -53,31 +50,33 @@ proc printVersion() =
echo "then " & VERSION
quit()
+# Check an individual condition c (Jan) and return the condition type (month)
proc checkType(c: string): string =
var cond = c
if cond[0] == '!':
cond.delete(0..0)
- if find(cond, re"^\d{4}$") > -1: return "year"
- if find(cond, re"^\d{1,2}$") > -1: return "day"
- 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}(-\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"^\(?\s*J\s*%\s*\d\s*([-+]\d)?\s*\)?$") > -1: return "julian"
- if find(cond, re"^\(.*\)$") > -1: return "dategroup"
- if find(cond, re"^\d{4}-\d{4}$") > -1: return "rangeyear"
- if find(cond, re"^\d{1,2}-\d{1,2}$") > -1: return "rangeday"
-
- var cs = cond.split("-", maxsplit = 1)
+ if find(cond, re"^\d{4}$") > -1: return "year"
+ if find(cond, re"^\d{1,2}$") > -1: return "day"
+ if find(cond, re"^\dw$") > -1: return "firstweek"
+ if find(cond, re"^\dl$") > -1: return "lastweek"
+ if find(cond, re"^\([A-Za-z0-9 ]+\)$") > -1: return "dategroup"
+ if find(cond, re"^\d{4}-\d{4}$") > -1: return "rangeyear"
+ if find(cond, re"^\d{1,2}-\d{1,2}$") > -1: return "rangeday"
+ if find(cond, re"^\d{1,2}:\d{2}(-\d{1,2}:\d{2})?$") > -1: return "time"
+ if find(cond, re"^\(?\s*[Jj]\s*%\s*\d+\s*([-+]\d+)?\s*\)?$") > -1: return "julian"
+ cond = cond.toLower.capitalizeAscii
+ if cond in MONTHS: return "month"
+ if cond in WEEKDAYS: return "dayofweek"
+
+ # Split c on - and check for ranges
+ let cs = cond.split("-", maxsplit = 1)
if cs.len != 2: return "unknown"
- if (cs[0] in DefaultLocale.MMM.toHashSet or cs[0] in DefaultLocale.MMMM.toHashSet) and
- (cs[1] in DefaultLocale.MMM.toHashSet or cs[1] in DefaultLocale.MMMM.toHashSet):
- return "rangemonth"
- if (cs[0] in DefaultLocale.ddd.toHashSet or cs[0] in DefaultLocale.dddd.toHashSet) and
- (cs[1] in DefaultLocale.ddd.toHashSet or cs[1] in DefaultLocale.dddd.toHashSet):
- return "rangedayofweek"
- if find(cs[0], re"^\(.*\)$") > -1 and find(cs[1], re"^\(.*\)$") > -1: return "rangedategroup"
+ let startRange = cs[0].toLower.capitalizeAscii
+ let endRange = cs[1].toLower.capitalizeAscii
+ if (startRange in MONTHS) and (endRange in MONTHS): return "rangemonth"
+ if (startRange in WEEKDAYS) and (endRange in WEEKDAYS): return "rangedayofweek"
+ if find(startRange, re"^\([A-Za-z0-9 ]+\)$") > -1 and find(endRange, re"^\([A-Za-z0-9 ]+\)$") > -1:
+ return "rangedategroup"
return "unknown"
proc getWeekFromEnd(date: DateTime): int =
@@ -91,7 +90,7 @@ proc checkCond(cond: string, date: DateTime): bool =
case checkType(cond):
of "year":
if parseInt(cond) == date.year: return true
- of "date":
+ of "day":
if parseInt(cond) == parseInt(date.format("d")): return true
if parseInt(cond) == parseInt(date.format("dd")): return true
of "month":
@@ -139,57 +138,54 @@ proc parseDateToTable(date:string): Table[string,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, "$*,$*")
+ var (success, dateConditions, event) = scanTuple(line, "$*,$*")
if success:
- date.strip
+ dateConditions.strip
event.strip
- let conditions = parseDateToTable(date)
- echo conditions
- # var match = true
- # 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
+ let conditions = parseDateToTable(dateConditions)
+ var match = true
+ # key = Condition Type (e.g. month), cs = Seq of conditions
+ for k,cs in conditions:
+ var keyMatched = false
+ for c in cs:
+ #var cond = c.toLower.capitalizeAscii
+ if checkCond(c, date) == true:
+ keyMatched = true
+ break
+ if not keyMatched:
+ match = false
+ break
+ if match:
+ events.add(event)
+ else:
+ echo "WARNING: Cannot parse line: ", line
return events
-proc printEvents(cal: seq[string], date: DateTime) =
+proc printEvents(cal: seq[string], date: DateTime, format: string) =
let events = getEvents(cal, date)
if events.len > 0:
- echo date.format("ddd yyyy MMM dd")
for e in events:
- echo " - ", e
+ echo date.format(format), " ", e
proc openCal(file: string): seq[string] =
let f = open(file)
var cal: seq[string]
for line in f.lines:
+ if line == "": continue
+ if line.strip[0] == '#': continue
cal.add(line)
f.close()
return cal
proc printCalendar() =
let cal = openCal(defaultCalendarFile)
- var past = 3
+ var past = -3
var future = 7
let now = now()
- while past > 0:
- let curDay = now - past.days
- printEvents(cal, curDay)
- dec past
-
- printEvents(cal, now)
-
- for i in 1..future:
+ for i in past..future:
let curDay = now + i.days
- printEvents(cal, curDay)
+ printEvents(cal, curDay, "ddd yyyy MMM dd")
proc main() =
var past: int = 1