aboutsummaryrefslogtreecommitdiff
path: root/luwak.el
blob: 4fd69d5af536a6556595b09ed8b04871331455c2 (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
;; -*- lexical-binding: t; -*-
(defvar luwak-buffer "*luwak*")
(defun luwak-lynx-buffer (url) (format "*luwak-lynx %s*" url))

(defun luwak-open (url)
  (interactive "sUrl to open: ")
  (setq url (eww--dwim-expand-url url))
  (set-process-sentinel
   (start-process-with-torsocks
    current-prefix-arg
    "luwak-lynx" (luwak-lynx-buffer url)
    "lynx" "-dump" "--display_charset" "utf-8" url)
   (lambda (process _)
     (with-current-buffer (get-buffer-create luwak-buffer)
       (erase-buffer)
       (insert-buffer-substring (process-buffer process))
       (kill-buffer (process-buffer process))
       (goto-char (point-min))
       (luwak-render-links (luwak-get-links)))
     (display-buffer luwak-buffer))))

(defun luwak-follow-link (marker)
  (luwak-open
   (get-text-property marker 'url)))

(defun luwak-render-links (urls)
  (with-current-buffer luwak-buffer
    (save-excursion
      (goto-char (point-min))
      (let ((i 1))
        (dolist (url urls)
          (when (re-search-forward (format "\\[%d\\]" i) nil t)
            (replace-match "")
            (make-text-button (point) (1+ (point))
                              'url url
                              'action 'luwak-follow-link
                              'face 'button))
          (setq i (1+ i)))))))

(defun luwak-get-links ()
  (with-current-buffer luwak-buffer
    (save-excursion
      (goto-char (point-min))
      (re-search-forward "^References\n\n\\(\\ *Visible links:\n\\)?")
      (let ((results))
        (while (re-search-forward "^\\ *\\([0-9]+\\)\\.\\ *\\(.*\\)$" nil t)
          (push (match-string 2) results))
        (reverse results)))))

(provide 'luwak)