diff options
| author | historia <gravel.justness270@slmail.me> | 2024-07-30 00:26:29 -0400 |
|---|---|---|
| committer | historia <gravel.justness270@slmail.me> | 2024-07-30 00:26:29 -0400 |
| commit | 43d1d1ef9b75e694f1b3e49ceaf319d87f6b14a9 (patch) | |
| tree | 9a6bf1474ae77363f115f32b2a4ce2b475c6b728 /src | |
| parent | 2438fe0116bb4c8abafb4e236c148ba0f8290e6a (diff) | |
| download | soon-43d1d1ef9b75e694f1b3e49ceaf319d87f6b14a9.tar.gz | |
Removed ! from Julian dates. Minor work on logic.
Diffstat (limited to 'src')
| -rw-r--r-- | src/then.nim | 70 |
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 |
