[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