Fixing my old ambiguous sketch references
| blogging, 11ty, emacs
At some point during the conversion of my blog from Wordpress to 11ty,
I wanted to change my sketch links to use a custom shortcode instead
of referring to the sketch in my old wp-uploads directory. Because
Wordpress changed the filenames a little, I used the ID at the start
of the filename. I forgot that many of my filenames from 2013 to 2015
just had the date without a uniquely identifying letter or number
suffix, so many old references were ambiguous and my static site
generator just linked to the first matching file. When I was listening
to my old monthly reviews as part of my upcoming 10-year review, I
noticed the repeated links. So I wrote these functions to help me find
and replace markup of the form sketchLink "2013-10-06"
with
sketchLink "2013-10-06 Daily drawing - thinking on paper #drawing"
,
replacing references to the same date with the next sketch in the
list. I figured that would be enough to get the basic use case sorted
out (usually a list of sketches in my monthly/weekly reviews), taking advantage of the my-list-sketches
function I defined in my Emacs config.
(defun my-replace-duplicate-sketch-list-references () (interactive) (goto-char (point-min)) (let (seen) (while (re-search-forward "sketchLink \\\"\\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\\)\\\"" nil t) (if (assoc (match-string 1) seen) (setcdr (assoc (match-string 1) seen) (1+ (assoc-default (match-string 1) seen))) (setq seen (cons (cons (match-string 1) 1) seen)))) (mapc (lambda (entry) (goto-char (point-min)) (mapc (lambda (sketch) (if (re-search-forward (format "sketchLink \\\"\\(%s\\)\\\"" (regexp-quote (car entry))) nil t) (replace-match (save-match-data (file-name-sans-extension sketch)) nil t nil 1) (message "Skipping %s possible ref to %s" (buffer-file-name) sketch))) (my-list-sketches (concat "^" (regexp-quote (car entry))) nil '("~/sync/sketches")))) seen)))
Sometimes I needed to delete the whole list and start again:
(defun my-insert-sketch-list-between (start-date end-date) (insert (mapconcat (lambda (f) (format "<li>%s sketchLink \"%s\" %s</li>\n" (concat "{" "%") ; avoid confusing 11ty when I export this (file-name-sans-extension f) (concat "%" "}"))) (sort (seq-filter (lambda (f) (and (string< f end-date) (not (string< f start-date)))) (my-list-sketches nil nil '("~/sync/sketches"))) 'string<) "")))
I used find-grep-dired
to search for sketchLink
\"[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\"
and then I just used a
keyboard macro to process each file.
Anyway, really old monthly reviews like this one for October 2013 should mostly make sense again. I could probably pull out the correct references from the Wordpress database backup, but what I've got is probably okay. I would probably have gotten much grumpier trying to do this without Emacs Lisp. Yay Emacs!