summary refs log tree commit diff
path: root/emacs/elisp/my-cheeseboard.el
blob: 9713e14f0b1a64147c415bb8adb6c2ab8709d3ca (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
;;; my-cheeseboard.el --- summary -*- lexical-binding: t -*-
;; Author: Franck Cuny <franck@fcuny.net>

;;; Commentary:

;; commentary:
;; As everybody knows, the best pizza in the world is at
;; cheeseboard[0]. I like to check during the week the pizzas for the
;; week and see if there are any we would like to have. This module
;; gets the list of pizzas for the week and display them in a buffer.
;;
;; [0] https://cheeseboardcollective.coop/

;;; Code:

(require 'dom)

(defconst my/cheeseboard-buffer "*cheeseboard-menu*"
  "Name of the buffer for displaying the week's menu.")

(defconst my/cheeseboard-url "https://cheeseboardcollective.coop/pizza/"
  "URL to fetch to get the list of pizzas for the week.")

(defun my/cheeseboard-menu ()
  "Display the list of pizzas for the week."
  (interactive)
  (let* ((dom (with-current-buffer (url-retrieve-synchronously my/cheeseboard-url)
                                (libxml-parse-html-region (point-min) (point-max))))
         ;; a class named `pizza-list' contains all the items for the
         ;; week. they are wrapped in a `article' tag.
         (menus (dom-by-tag (dom-by-class dom "pizza-list") 'article))
         (inhibit-read-only t)
         (buffer-undo-list t))
    (pop-to-buffer my/cheeseboard-buffer)
    (erase-buffer)
    (insert (format "if you want to look at the menu on the website => %s\n\n" my/cheeseboard-url))
    (dolist (menu menus)
      (my/pizza-of-the-day menu))
    (special-mode)))

(defun my/pizza-of-the-day (menu)
  "Print the pizzas for the day from the MENU."
  (let* ((date (car (dom-strings (dom-by-tag (dom-by-class menu "date") 'p))))
         (pizza (dom-by-tag (dom-by-class menu "menu") 'p)))
    (if (string= "The pizzeria is closed today." (nth 0 (dom-strings pizza)))
        (insert (format "%s: cheeseboard is closed :(\n\n" (propertize date 'face 'italic)))
      (insert (format "%s: 🍕 %s\n(note: %s, %s)\n\n"
                      (propertize date 'face 'italic)
                      (propertize (replace-regexp-in-string "\n" "" (nth 2 (dom-strings pizza))) 'face 'highlight)
                      (nth 0 (dom-strings pizza))
                      (nth 1 (dom-strings pizza)))))))

(provide 'my-cheeseboard)

;;; my-cheeseboard.el ends here