diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/then.nim | 106 |
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 |
