Rewrite timestamps in Org-export
While making figuring out how much running I've done this summer, I realized that I wanted to gussy up the way that published timestamps look. The way it looks in Emacs is more like this:
| Date | Distance (km) | Time | Minutes | Pace (min/km) | |------------------+---------------+----------+---------+---------------| | [2023-07-22 Sat] | 12.93 | 01:30:31 | 90.52 | 7.0 | | [2023-06-17 Sat] | 13.40 | 01:11:58 | 71.97 | 5.4 | | [2023-06-10 Sat] | 17.52 | 01:58:23 | 118.38 | 6.8 | #+TBLFM: $4='(org-duration-to-minutes $3);%.2f::$5='(/ $4 $2);%.1fN
I want to keep those in the actual file, but maybe make them look nicer for humans when I export it. I use ox-hugo and Org-mode's built-in publish so I can use a convenient feature, org-export-filter-timestamp-functions
. It's a list of functions to run specifically on timestamps on export, so that seems remarkably convenient.
(with-eval-after-load 'ox
;;(require 'ox-icalendar)
(add-to-list 'org-export-filter-timestamp-functions
#'env-filter-timestamp))
I started by adding a custom function to org-export-filter-timestamp-functions
which I'll set up now.
(defun env-filter-timestamp (string _backend _comm) "Remove [<>] around time-stamps from STRING. I actually don't know what _COMM is. BACKEND is the type of conversion we're doing, in this case either some form of HTML/Markdown or LaTeX. The filter receives the entire output timestamp as STRING and then processes it before saving." (if (string-match-p ":" string) (format-time-string "%A, %B %-e, %Y at %H:%M" (org-time-string-to-time string)) (format-time-string "%A, %B %-e, %Y" (org-time-string-to-time string))))
The function which I'm calling env-filter-timestamp
takes three things, a string which is timestamp from the Org file, the output backend such as Markdown, HTML or Hugo, and something called a communication channel plist. No idea what that is.
I'm not sure if there's a better way to figure out if the timestamp has an actual time in it. I tried the function org-timestamp-has-time-p
but it didn't work the way I wanted, so I just look to see if there's a colon that must be present as the HH:MM separator. Emacs time conversion does not make sense to me, so I use Org's system. That's not an issue here as I can rely on it existing. It's pretty easy to make work; format-time-string
requires time in the form of (TICKS . HZ)
which is what the function org-times-string-to-time
provides. So it's easy to format the time any way I want here. And look at how nice it came out (this is a copy-paste from above):
Date | Distance (km) | Time | Minutes | Pace (min/km) |
---|---|---|---|---|
Saturday, July 22, 2023 | 12.93 | 01:30:31 | 90.52 | 7.0 |
Saturday, June 17, 2023 | 13.40 | 01:11:58 | 71.97 | 5.4 |
Saturday, June 10, 2023 | 17.52 | 01:58:23 | 118.38 | 6.8 |
See? That's great!