aboutsummaryrefslogtreecommitdiff
path: root/hnreader.el
diff options
context:
space:
mode:
authorThanh Vuong <thanhvg@gmail.com>2019-08-17 09:41:46 -0600
committerThanh Vuong <thanhvg@gmail.com>2019-08-17 09:41:46 -0600
commit40eb75bbcf0c0ee7f0432b455fa0b3590059b522 (patch)
tree2d8ec013605dc630ea2b9b60811c19dd5d2e2c93 /hnreader.el
wip
Diffstat (limited to 'hnreader.el')
-rw-r--r--hnreader.el78
1 files changed, 78 insertions, 0 deletions
diff --git a/hnreader.el b/hnreader.el
new file mode 100644
index 0000000..091fa21
--- /dev/null
+++ b/hnreader.el
@@ -0,0 +1,78 @@
+(require 'request)
+(require 'shr)
+(require 'dom)
+(require 'promise)
+(require 'cl-lib)
+
+
+(defvar hn--buffer "*HN*"
+ "Buffer for HN pages.")
+
+(defun hnreader--get-hn-buffer ()
+ "Get hn buffer."
+ (get-buffer-create hn--buffer))
+
+(defun hnreader--promise-dom (url)
+ "Promise (url . dom) from URL with curl."
+ (promise-new
+ (lambda (resolve reject)
+ (request url
+ :parser (lambda () (libxml-parse-html-region (point-min) (point-max)))
+ :error (cl-function (lambda (&rest args &key error-thrown &allow-other-keys)
+ (message "bad")
+ (funcall reject error-thrown)))
+ :success (cl-function (lambda (&key data &allow-other-keys)
+ (message "yay")
+ (setq thanh data)
+ ;; (message "%s" data)
+ (funcall resolve data)))))))
+
+(defun hnreader--prepare-buffer (buf &optional msg)
+ "Print MSG message and prepare window for BUF buffer."
+ (when (not (equal (window-buffer) buf))
+ ;; (switch-to-buffer-other-window howdoi-buffer))
+ (display-buffer buf '(display-buffer-use-some-window (inhibit-same-window . t))))
+ (with-current-buffer buf
+ (read-only-mode -1)
+ (erase-buffer)
+ (insert (if msg
+ msg
+ "Loading...")))
+ buf)
+
+(defun hnreader--print-frontpage-item (thing subtext)
+ "Print THING dom and SUBTEXT dom."
+ (insert (format "\n* %s %s (%s) [%s]\n"
+ ;; rank
+ (dom-text (dom-by-class thing "^rank$"))
+ ;; title
+ (dom-text (dom-by-class thing "^storylink$"))
+ ;; points
+ (dom-text (dom-by-class subtext "^score$"))
+ ;; comments
+ (dom-text (last (dom-children subtext)))))
+ ;; link
+ (insert (dom-attr (dom-by-class thing "^storylink$") 'href) "\n" )
+ ;; comment link
+ (insert "https://news.ycombinator.com/item?id=" (dom-attr thing 'id)))
+
+(defun hnreader--print-frontpage (dom buf)
+ "Print raw DOM on BUF."
+ (message "am i here")
+ (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#")
+ (cl-mapcar #'hnreader--print-frontpage-item things subtexts))))
+
+(defun hnreader-frontpage ()
+ "Testing."
+ (hnreader--prepare-buffer (hnreader--get-hn-buffer))
+ (promise-chain (hnreader--promise-dom "https://news.ycombinator.com/news")
+ (then (lambda (result)
+ (message "got the dom")
+ (hnreader--print-frontpage result (hnreader--get-hn-buffer))))
+ (promise-catch (lambda (reason)
+ (message "catch error in promise prontpage: %s" reason)))))