Browse code
chore(cells-html): add deliver script and real interface
Edward authored on 25/01/2022 10:38:46
Showing 2 changed files
Showing 2 changed files
1 | 1 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,33 @@ |
1 |
+(defun utf-8-file-encoding (pathname ef-spec buffer length) |
|
2 |
+ (declare (ignore pathname buffer length)) |
|
3 |
+ (system:merge-ef-specs ef-spec :utf-8)) |
|
4 |
+ |
|
5 |
+(setq system:*file-encoding-detection-algorithm* |
|
6 |
+ (substitute 'utf-8-file-encoding |
|
7 |
+ 'system:locale-file-encoding |
|
8 |
+ system:*file-encoding-detection-algorithm*)) |
|
9 |
+(set-default-character-element-type 'simple-char) |
|
10 |
+ |
|
11 |
+(in-package :cl-user) |
|
12 |
+ |
|
13 |
+(format t "~&CURDIR: ~a~%" (truename ".")) |
|
14 |
+(load-all-patches) |
|
15 |
+(load "~/quicklisp/setup.lisp") |
|
16 |
+(ql:quickload '(:cells :drakma :lquery :fwoar-lisputils :alexandria :serapeum)) |
|
17 |
+(compile-file "/Users/edwlan/git_repos/git.fiddlerwoaroof.com/lisp-sandbox/cells-html-scraper.lisp") |
|
18 |
+(load "/Users/edwlan/git_repos/git.fiddlerwoaroof.com/lisp-sandbox/cells-html-scraper") |
|
19 |
+(deliver (intern "STARTUP" "CELLS-HTML-SCRAPER") |
|
20 |
+ (create-macos-application-bundle |
|
21 |
+ "HNReader.app" |
|
22 |
+ :document-types nil |
|
23 |
+ :identifier "fwoar.cj.HNReader" |
|
24 |
+ :version "0.0.never") |
|
25 |
+ 0 |
|
26 |
+;; :keep-conditions :all |
|
27 |
+ ;; :keep-pretty-printer t |
|
28 |
+ :interface :capi |
|
29 |
+ ;; :keep-modules t |
|
30 |
+ ;; :packages-to-keep-symbol-names '(:mfa-tool) |
|
31 |
+ ;; :packages-to-keep '(:mfa-tool :swank) |
|
32 |
+ ;;:startup-bitmap-file nil |
|
33 |
+ ) |
... | ... |
@@ -95,55 +95,65 @@ |
95 | 95 |
|
96 | 96 |
#+lispworks |
97 | 97 |
(progn |
98 |
- (defvar *item-panel* (make-instance 'capi:list-panel |
|
99 |
- :print-function 'title |
|
100 |
- :selection-callback 'open-item)) |
|
101 |
- (defvar *scraper* (make-instance 'hn-scraped)) |
|
102 |
- (defvar *browser-pane* nil) |
|
103 |
- |
|
104 |
- (defun request-new-items (page) |
|
105 |
- (setf (cells-html-scraper::html *scraper*) |
|
98 |
+ (defun request-new-items (interface page) |
|
99 |
+ (setf (cells-html-scraper::html (hnr-scraper interface)) |
|
106 | 100 |
(drakma:http-request (format nil "https://news.ycombinator.com/~a" page)))) |
107 |
- (defun open-item (item) |
|
108 |
- (let ((was-bound-p *browser-pane*) |
|
109 |
- (*browser-pane* |
|
110 |
- (or *browser-pane* |
|
111 |
- (setf *browser-pane* |
|
112 |
- (make-instance 'capi:browser-pane :debug t |
|
113 |
- :initial-constraints '(:external-min-width (/ :screen-width 2) |
|
114 |
- :external-min-height :screen-height)))))) |
|
115 |
- (capi:browser-pane-navigate *browser-pane* (puri:render-uri (url item) nil)) |
|
116 |
- #+(or) |
|
117 |
- (unless was-bound-p |
|
118 |
- (capi:contain *browser-pane*)))) |
|
119 |
- (defvar *pages* |
|
120 |
- (make-instance 'capi:list-panel |
|
121 |
- :items (list "news" "newest" "ask" "show" "jobs") |
|
122 |
- :initial-constraints '(:visible-max-width (:character 30)) |
|
123 |
- :selection-callback 'request-new-items |
|
124 |
- :callback-type :item)) |
|
101 |
+ |
|
102 |
+ (defun open-item (interface item) |
|
103 |
+ (capi:browser-pane-navigate (hnr-browser interface) |
|
104 |
+ (puri:render-uri (url item) |
|
105 |
+ nil))) |
|
106 |
+ |
|
107 |
+ |
|
108 |
+ |
|
125 | 109 |
|
126 |
- (cells:defobserver cells-html-scraper::%items ((self (eql *scraper*)) new-value) |
|
127 |
- (map nil (lambda (it) (princ (cells-html-scraper::title it)) (terpri)) new-value) |
|
128 |
- (capi:apply-in-pane-process #1=*item-panel* |
|
129 |
- (lambda (pane) |
|
130 |
- (let ((cleaned-items (remove-if 'null new-value :key 'cells-html-scraper::title))) |
|
131 |
- (capi:remove-items pane (constantly t)) |
|
132 |
- (capi:append-items pane |
|
133 |
- cleaned-items))) |
|
134 |
- #1#)) |
|
135 |
- (defun main-layout () |
|
136 |
- (let ((result (make-instance 'capi:row-layout |
|
137 |
- :visible-min-width '(:character 120) |
|
138 |
- :visible-min-height '(:character 40) |
|
139 |
- :x-ratios '(1 nil 2) |
|
140 |
- :uniform-size-p nil |
|
141 |
- :children (list *pages* :divider |
|
142 |
- (make-instance 'capi:column-layout |
|
143 |
- :children (list *item-panel* :divider |
|
144 |
- *browser-pane*)))))) |
|
145 |
- (prog1 result))) |
|
146 | 110 |
(capi:define-interface hn-reader () |
147 |
- (:panes ) |
|
148 |
- ) |
|
111 |
+ ((scraper :reader hnr-scraper :initform (make-instance 'hn-scraped))) |
|
112 |
+ (:panes |
|
113 |
+ (pages capi:list-panel |
|
114 |
+ :reader hnr-pages |
|
115 |
+ :items (list "news" "newest" "ask" "show" "jobs") |
|
116 |
+ :initial-constraints '(:visible-max-width (:string "newestest")) |
|
117 |
+ :selection-callback 'request-new-items |
|
118 |
+ :callback-type :interface-item) |
|
119 |
+ (item-panel capi:list-panel |
|
120 |
+ :reader hnr-item-panel |
|
121 |
+ :print-function 'title |
|
122 |
+ :selection-callback 'open-item |
|
123 |
+ :callback-type :interface-item) |
|
124 |
+ (browser capi:browser-pane |
|
125 |
+ :reader hnr-browser |
|
126 |
+ :url "https://fwoar.co")) |
|
127 |
+ (:layouts |
|
128 |
+ (right-side capi:column-layout |
|
129 |
+ '(item-panel :divider browser) |
|
130 |
+ :y-ratios '(1 nil 2) |
|
131 |
+ :uniform-size-p nil) |
|
132 |
+ (main-layout capi:row-layout |
|
133 |
+ '(pages :divider right-side) |
|
134 |
+ :visible-min-width '(:character 120) |
|
135 |
+ :visible-min-height '(:character 40) |
|
136 |
+ :x-ratios '(1 nil 2) |
|
137 |
+ :uniform-size-p nil)) |
|
138 |
+ (:default-initargs |
|
139 |
+ :layout 'main-layout |
|
140 |
+ :title "HN Reader")) |
|
141 |
+ |
|
142 |
+ (defmethod initialize-instance :after ((o hn-reader) &key) |
|
143 |
+ (cells:defobserver |
|
144 |
+ cells-html-scraper::%items ((self (eql (hnr-scraper o))) new-value) |
|
145 |
+ |
|
146 |
+ (capi:apply-in-pane-process |
|
147 |
+ #1=(hnr-item-panel o) |
|
148 |
+ (lambda (pane) |
|
149 |
+ (let ((cleaned-items (remove-if 'null new-value :key 'cells-html-scraper::title))) |
|
150 |
+ (capi:remove-items pane (constantly t)) |
|
151 |
+ (capi:append-items pane |
|
152 |
+ cleaned-items))) |
|
153 |
+ #1#)) |
|
154 |
+ |
|
155 |
+ (setf (cells-html-scraper::html (hnr-scraper o)) |
|
156 |
+ (drakma:http-request "https://news.ycombinator.com/"))) |
|
157 |
+ (defun startup () |
|
158 |
+ (capi:display (make-instance 'hn-reader))) |
|
149 | 159 |
) |