git.fiddlerwoaroof.com
Browse code

chore(cells-html): add deliver script and real interface

Edward authored on 25/01/2022 10:38:46
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
   )