[Remind-Fans] Weekly Planner?

Retourné du Japon khatre at gmail.com
Mon Dec 23 11:15:32 EST 2019


Hi,

Sorry for not getting back earlier to you. That script's terrific, thanks a
lot!
Maybe I'll try to tune it to output markdown instead of html (which can
then easily be turned into multiple formats, using pandoc,
https://pandoc.org/). Since everything is in a table, it should not be too
hard.

Thanks again!
Clément.

Le mer. 18 déc. 2019 à 17:13, Tim Chase <remind at tim.thechases.com> a écrit :

> here's a modest script to generate output akin to what you described.
> A few caveats:
>
> 1) if an event begins before your START_TIME or after your END_TIME,
> it doesn't get printed
>
> 2) it prints whole-day events at the top
>
> 3) if something has a DURATION specified, only its start gets
> noted, it doesn't extend
>
> 4) it doesn't respect start-of-week, so it really only creates one
> column/entry for each date output, so if "rem" outputs more than one
> week, you'll get that many columns (the `rem -s` is REALLY wide)
>
> The actual generation portion is moved out to functions, so if you
> wanted to emit LaTeX or some other markup instead, it shouldn't be as
> taxing.
>
> Usage:
>
>  $ rem -s+ | awk -f planner.awk > this_week.html
>
> or, if you want to override the START_TIME/END_TIME for your day
>
>  $ rem -s+ | awk -vSTART_TIME=7:00 -vEND_TIME=16:00 -vNO_WRAP=1 -f
>  planner.awk > this_week_as_fragment.html
>
> the NO_WRAP=1 controls whether it gets wrapped in some basic HTML to
> form a whole page (the default behavior if NO_WRAP is unset) or just
> the <table> is emitted (any non-blank value for NO_WRAP).
>
> If wrapped (the default) you can then point your favorite browser at
> it to print if you want:
>
>   $ firefox this_week.html &
>
> Hope this helps.
>
> -tim
>
> ------[>8 planner.awk >8]-------------------------
> #!/usr/bin/awk -f
> function err(s) {
>   print s >> "/dev/stderr"
>   exit
> }
>
> function hm2time(timestr) {
>   if (split(timestr, hm, /:/) > 1) {
>     h = int(hm[1])
>     m = int(hm[2])
>     return h * 60 + m
>   } else {
>     err(sprintf("Invalid time: [%s]", timestr))
>   }
> }
>
> function time2hm(t) {
>   h = int(t / 60)
>   m = t % 60
>   return sprintf("%02i:%02i", h, m)
> }
>
> function htmlescape(s) {
>   gsub(/&/, "&", s)
>   gsub(/</, "<", s)
>   gsub(/>/, ">", s)
>   return s
> }
>
> # to change the output type,
> # adjust these functions:
> function wrap_header(title) {
>   printf("<html><head><title>Calendar for %s</title></head><body>\n",
> title) }
> function wrap_footer() {
>   printf("</body></html>\n")
> }
> function headers_start() {
>   printf("<table><thead><tr>")
> }
> function emit_header(h) {
>   printf("<th>%s</th>", h)
> }
> function headers_end() {
>   printf("</tr></thead>\n")
> }
> function body_begin() {
>   printf("<tbody>\n")
> }
> function body_end() {
>   printf("</tbody></table>\n")
> }
> function row_start(time) {
>   printf("<tr><th>%s</th>", time)
> }
> function row_end() {
>   printf("</tr>\n")
> }
> function emit_cell(s) {
>   printf("<td>%s</td>", s)
> }
> function emit_list(items) {
>   printf("<td><ul>")
>   for (i in items) printf("<li>%s</li>", htmlescape(items[i]))
>   print "</ul></td>"
> }
>
> BEGIN {
>   if (START_TIME !~ /[0-9]+:[0-9]+/) START_TIME="7:00"
>   if (END_TIME !~ /[0-9]+:[0-9]+/) END_TIME="17:00"
>
>   START_TIME = hm2time(START_TIME)
>   END_TIME = hm2time(END_TIME)
>
>   if (INTERVAL=="") INTERVAL=30
>   else INTERVAL=int(INTERVAL)
>
>   WRAP = (NO_WRAP=="")
> }
>
> {
>   DATE = $1
>   SPECIAL = $2
>   TAG = $3
>   DUR = $4
>   TIME = $5
>   msg = $6
>   for (i=7; i<= NF; i++) msg = msg " " $i
> }
>
> SPECIAL != "*" { next }
>
> DATE != last_date {
>   i2d[col_count++] = last_date = $1
> }
>
> TIME == "*" {
>   # all day
>   if (DATE in allday) allday[DATE]=allday[DATE] SUBSEP msg
>   else allday[DATE] = msg
> }
>
> TIME != "*" {
>   # a timed event
>   if (DATE in times) {
>     times[DATE]=times[DATE] SUBSEP TIME
>   } else {
>     times[DATE] = TIME
>   }
>   if ((DATE SUBSEP TIME) in dt2msg)
>     dt2msg[DATE, TIME] = dt2msg[DATE, TIME] SUBSEP  msg
>   else
>     dt2msg[DATE, TIME] = msg
> }
>
> END {
>   if (WRAP) wrap_header(i2d[0])
>   headers_start()
>   emit_header("")
>   for (i=0; i<col_count; i++) {
>     date = i2d[i]
>     emit_header(date)
>   }
>   headers_end()
>   body_begin()
>   row_start("All day")
>   for (col=0; col<col_count; col++) {
>     if (col in i2d) {
>       date = i2d[col]
>       split(allday[i2d[col]], msgs, SUBSEP)
>       if (length(msgs) > 1) {
>         emit_list(msgs)
>       } else {
>         emit_cell(msgs[1])
>       }
>     }
>   }
>   row_end()
>
>   currently_printing_time = START_TIME
>   while (currently_printing_time <= END_TIME) {
>     row_start(time2hm(currently_printing_time))
>     for (col=0; col<col_count; col++) {
>       if (col in i2d) {
>         date = i2d[col]
>         split(times[date], subset_of_times, SUBSEP)
>         delete msgs_to_print
>         msg_index = 1
>         for (time_index in subset_of_times) {
>           item_time = subset_of_times[time_index]
>           if (item_time >= currently_printing_time &&
>               item_time < currently_printing_time + INTERVAL) {
>             if ((date, item_time) in dt2msg) {
>               msgs_to_print[msg_index++] = dt2msg[date, item_time]
>             }
>           }
>         }
>
>         if (length(msgs_to_print) > 1) {
>           emit_list(msgs_to_print)
>         } else {
>           emit_cell(msgs_to_print[1])
>         }
>       } else emit_cell("")
>     }
>     row_end()
>     currently_printing_time += INTERVAL
>   }
>   body_end()
>   if (WRAP) wrap_footer()
> }
> _______________________________________________
> Remind-fans mailing list
> Remind-fans at lists.skoll.ca
> https://dianne.skoll.ca/mailman/listinfo/remind-fans
> Remind is at https://dianne.skoll.ca/projects/remind/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://dianne.skoll.ca/pipermail/remind-fans/attachments/20191223/15696ce1/attachment.html>


More information about the Remind-fans mailing list