aboutsummaryrefslogtreecommitdiff
path: root/emacs/.emacs.d/lisp/my/my-hnreader.el
blob: 9f3120040f2b051d58ed610c6aca7d5de5d4709e (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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
;;; my-hnreader.el -- Extensions to hnreader -*- lexical-binding: t -*-

;; Copyright (C) 2023 Free Software Foundation.

;; Author: Yuchen Pei <id@ypei.org>
;; Package-Requires: ((emacs "28.2"))

;; This file is part of dotfiles.

;; dotfiles is free software: you can redistribute it and/or modify it under
;; the terms of the GNU Affero General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; dotfiles is distributed in the hope that it will be useful, but WITHOUT
;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General
;; Public License for more details.

;; You should have received a copy of the GNU Affero General Public
;; License along with dotfiles.  If not, see <https://www.gnu.org/licenses/>.

;;; Commentary:

;; Extensions to hnreader.

;;; Code:

;; To override `hnreader--print-frontpage-item'
(defun my-hnreader--print-frontpage-item (thing subtext)
  "Print THING dom and SUBTEXT dom."
  (let* ((url (format "https://news.ycombinator.com/item?id=%s" (dom-attr thing 'id)))
         (a-node (dom-child-by-tag (dom-by-class thing "^titleline$") 'a))
         (title-link (dom-attr a-node 'href)))
    (insert (format "\n* %s [[%s][%s]] (%s) [[elisp:(hnreader-comment \"%s\")][%s]]"
                    ;; rank
                    (dom-text (dom-by-class thing "^rank$"))
                    title-link
                    ;; title
                    (dom-text a-node)
                    ;; points
                    (dom-text (dom-by-class subtext "^score$"))
                    ;; comments
                    url
                    (dom-text (last (dom-by-tag subtext 'a)))))
    ))


;; To override `hnreader--print-frontpage'
(defun my-hnreader--print-frontpage (dom buf url)
  "Print raw DOM and URL on BUF."
  (let ((things (dom-by-class dom "^athing$"))
        (subtexts (dom-by-class dom "^subtext$")))
    (with-current-buffer buf
      (read-only-mode -1)
      (erase-buffer)
      (insert "#+STARTUP: overview indent\n")
      (hnreader--print-header)
      (insert (hnreader--get-route-top-info dom))
      (cl-mapcar #'hnreader--print-frontpage-item things subtexts)
      ;; (setq-local org-confirm-elisp-link-function nil)
      (if hnreader--history
          (insert "\n* "(format "[[elisp:(hnreader-back)][< Back]]" ) " | ")
        (insert "\n* "))
      (insert (hnreader--get-morelink dom) " | ")
      (insert (format "[[elisp:(hnreader-read-page-back \"%s\")][Reload]]" url) )
      (org-mode)
      (goto-char (point-min))
      (forward-line 2))))

;; To override `hnreader--get-title'
(defun my-hnreader--get-title (dom)
  "Get title and link from DOM comment page."
  (let ((a-link (dom-by-tag (dom-by-class dom "^titleline$") 'a)))
    (cons (dom-text a-link) (dom-attr a-link 'href))))

;; To override `hnreader--print-comments'
(defun my-hnreader--print-comments (dom url)
  "Print DOM comment and URL to buffer."
  (let ((comments (dom-by-class dom "^athing comtr$"))
        (title (hnreader--get-title dom))
        (info (hnreader--get-post-info dom))
        (more-link (dom-by-class dom "morelink"))
        (buffer (my-hnreader-buffer url)))
    (with-current-buffer buffer
      (read-only-mode -1)
      (erase-buffer)
      (insert "-*- org -*-\n")
      (insert "#+TITLE: " (car title))
      (insert (format "\n%s\n" (cdr title)))
      (insert (car info))
      (when (cdr info)
        (insert "\n")
        (shr-insert-document (cdr info)))
      (dolist (comment comments)
        (insert (format "%s %s\n"
                        (hnreader--get-indent
                         (hnreader--get-img-tag-width comment))
                        (hnreader--get-comment-owner comment)))
        (shr-insert-document (hnreader--get-comment comment)))
      (when more-link
        (insert "\n* " (format "[[elisp:(hnreader-comment \"%s\")][More]]" (concat "https://news.ycombinator.com/"
                                                                                   (dom-attr more-link 'href)))))
      (insert "\n* " (format  "[[elisp:(hnreader-comment \"%s\")][Reload]]" url))
      (goto-char (point-min))
      (forward-line 2)
      (save-buffer))
    (switch-to-buffer buffer)))

(defvar my-hnreader-save-dir (locate-user-emacs-file "hn-archive")
  "The directory to save hnreader org files.")

(defun my-hnreader-buffer (url)
  "Return file name to save to for URL."
  (if (string-match
       "https://news\\.ycombinator\\.com/item\\?id=\\([0-9]+\\)" url)
      (find-file-noselect
       (expand-file-name (format "%s.org" (match-string 1 url))
                         my-hnreader-save-dir))
    (error "URL %s not supported." url)))

(provide 'my-hnreader)
;;; my-hnreader.el ends here