#!/usr/local/bin/mawk -f BEGIN { redatef = "y%04dm%02dd%02dw%1d" outdatef = "%04d-%02d-%02d" if(length(date)) # BSD ("date -j -f '%F' '" date "' +'%F-%u'") | getline today # GNU #("date -d '" date "' +'%F-%u'") | getline today else "date +'%F-%u'" | getline today split(today, atoday, "-") Y = int(atoday[1]) M = int(atoday[2]) D = int(atoday[3]) W = int(atoday[4]) today = sprintf(redatef, Y, M, D, W) redate["today"] = today remtype["today"] = "today" comment["today"] = "" lastkey = 0 nremline = 0 ntodo = 0 } /^[^# \t]/ { if($1 == "@" || $1 ~ /:$/) { typ = $1 rem = $2 } else { typ = defremtype rem = $1 } sub(/^@?(.*:)?[ \t]+[^ \t]*[ \t]*/, "") lastkey++ remtype[lastkey] = typ redate[lastkey] = rem comment[lastkey] = $0 } /^([ ][ ]+)|[\t]/ && lastkey != 0 { # osYYYY-MM-DDsc sub(/^[ \t]+/, "\n ") comment[lastkey] = comment[lastkey] $0 } END { if(!length(color)) color = 1 if(!length(before)) before = 2 if(!length(after)) after = 4 if(!length(firstday)) firstday = 1 sepwidth = 3 if(color) { markesc["today"] = "\033[7m" markesc["holiday:"] = "\033[31m" markesc["spec:"] = "\033[32m" clrmarkesc = "\033[0m" } else { markstr["today"] = "@" markstr["holiday:"] = "+" } markstr["spec:"] = "!" markstr["birth:"] = "*" dayw[0] = "Su" dayw[1] = "Mo" dayw[2] = "Tu" dayw[3] = "We" dayw[4] = "Th" dayw[5] = "Fr" dayw[6] = "Sa" dayw[7] = "Su" smon[1] = "Jan"; smon[2] = "Feb"; smon[3] = "Mar"; smon[4] = "Apr" smon[5] = "May"; smon[6] = "Jun"; smon[7] = "Jul"; smon[8] = "Aug" smon[9] = "Sep"; smon[10] = "Oct"; smon[11] = "Nov"; smon[12] = "Dec" mon[1] = 31; mon[2] = 29; mon[3] = 31; mon[4] = 30 mon[5] = 31; mon[6] = 30; mon[7] = 31; mon[8] = 31 mon[9] = 30; mon[10] = 31; mon[11] = 30; mon[12] = 31 y = Y m = M d = D w = W movrems() movedate(-W + firstday) for(i = 0; i < before; i++) movedate(-7) ORS = "" for(i = firstday; i <= 6 + firstday; i++) printf("%*s ", 2 + sepwidth, dayw[i]) print("\n") for(i = 0; i < before + 1 + after; i++) { for(j = 0; j < 7; j++) { printday() mch += movedate(1) } if(mch) { print(smon[mch]) mch = 0 } print("\n"); } ORS = "\n" for(i = 0; i < nremline; i++) print(remline[i]) if(ntodo) print("todo:") for(i = 0; i < ntodo; i++) print(todo[i]) } function printday() { curdate = sprintf(redatef, y, m, d, w) mark = "" nstr = 0 for(r in redate) { rt = remtype[r] red = redate[r] cmnt = comment[r] esc = markesc[rt] str = markstr[rt] formatdate() } printf("%*.*s", sepwidth - nstr, sepwidth - nstr, OFS) print(mark) printf("%*s", 2, d) print(clrmarkesc OFS OFS) } function formatdate() { if(rt == "@") { if(!length(cmnt) \ || today != curdate \ || today !~ red) return; str = length(str) ? str : OFS todo[ntodo] = esc str \ clrmarkesc OFS cmnt ntodo++ } else if(length(red) && curdate ~ red) { mark = mark esc if(nstr < sepwidth) { nstr += length(str) mark = mark str } if(!length(cmnt)) return; if(!length(str)) str = OFS date = sprintf(outdatef, y, m, d) remline[nremline] = esc str \ OFS date OFS \ clrmarkesc OFS cmnt nremline++ } } function movedate(days) { d += days w += days w = ((w - 1) % 7) + 1 if(d < 1) { m-- if(m < 1) { y-- movrems() m = 12 } d = mon[m] + d return m } if(d > mon[m]) { d = d - mon[m] m++ if(m > 12) { y++ movrems() m = 1 } return m } return 0 } function movrems() { mon[2] = 28 + leap(y) ("easterdate " y) | getline easter if(split(easter, aeaster, "-") != 3) return ey = int(aeaster[1]) em = int(aeaster[2]) ed = int(aeaster[3]) ew = 7 redate["easter"] = sprintf(redatef, ey, em, ed, 7) remtype["easter"] = "holiday:" comment["easter"] = "Wielkanoc" redate["eastermon"] = sprintf(redatef, ey, em, ed + 1, 1) remtype["eastermon"] = "holiday:" comment["eastermon"] = "Poniedziałek Wielkanocny" pm = em pd = ed + 49 while(pd > mon[pm]) { pd -= mon[pm] pm++ } redate["pentecost"] = sprintf(redatef, ey, pm, pd, 7) remtype["pentecost"] = "holiday:" comment["pentecost"] = "Zesłanie Ducha Świętego" pm = em pd = ed + 60 while(pd > mon[pm]) { pd -= mon[pm] pm++ } redate["corpuschr"] = sprintf(redatef, ey, pm, pd, 4) remtype["corpuschr"] = "holiday:" comment["corpuschr"] = "Boże Ciało" } function leap(y) { if(y % 4) return 0 else if(y % 100) return 1 else if(y % 400) return 0 else return 1 }