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)
|