diff options
author | Thanh Vuong <thanhvg@gmail.com> | 2019-08-17 09:41:46 -0600 |
---|---|---|
committer | Thanh Vuong <thanhvg@gmail.com> | 2019-08-17 09:41:46 -0600 |
commit | 40eb75bbcf0c0ee7f0432b455fa0b3590059b522 (patch) | |
tree | 2d8ec013605dc630ea2b9b60811c19dd5d2e2c93 /hnreader.el |
wip
Diffstat (limited to 'hnreader.el')
-rw-r--r-- | hnreader.el | 78 |
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))))) |