]> git.armaanb.net Git - bettersearch.git/blobdiff - bettersearch.rkt
Listen on 0.0.0.0
[bettersearch.git] / bettersearch.rkt
index f3acf79eee4fbcc116c41a5697d7f3e53e8d69e8..884bfd08b40a155737b32ad9b5932730a9ddfeed 100644 (file)
@@ -1,41 +1,96 @@
 #lang racket
 
 (require json)
-(require net/url)
+(require web-server/servlet)
+(require web-server/servlet-env)
+(require web-server/templates)
 
 (require "blacklist.rkt")
 
 (define (member-match? itm lst)
-  (ormap (lambda (i)
-          (regexp-match? (regexp i) itm))
-        lst))
-
-(define (get-results query)
-(define engine (string->url
-                "https://search.trom.tf/search?q=facebook&format=json"))
-(define response (get-pure-port engine))
-(define json-raw (port->string response))
-(close-input-port response)
-
-(define json
-  (with-input-from-string
-    json-raw
-    (lambda ()
-      (read-json))))
-
-; Parse and filter results
-; TODO: replace this with tail-call recursion and return instead of printing
-(for-each (lambda (i)
-           (define result-title (hash-ref i 'title ""))
-           (define result-url (url-host (string->url (hash-ref i 'url ""))))
-           (define result-content (hash-ref i 'content ""))
-
-           (unless (member-match? result-url blacklist)
-             (writeln result-title)
-             (writeln result-url)
-             (writeln result-content)
-             (writeln "")
-
-             ))
-         (hash-ref json 'results))
-)
+  (ormap (lambda (i) (regexp-match? (regexp i) itm)) lst))
+
+(define-values (dispatch generate-url)
+  (dispatch-rules
+    [("") do-index]
+    [("search") do-search]
+    ))
+
+(define (do-head title)
+  (include-template "templates/head.html"))
+
+(define (do-footer)
+  (include-template "templates/footer.html"))
+
+(define (do-index req)
+  (http-response (string-append
+                  (do-head "Web Search")
+                  (include-template "templates/index.html")
+                  (do-footer))))
+
+(define (search query pageno)
+  (define engine (string->url
+                  (string-append
+                    (getenv "SEARX_INSTANCE")
+                    "/search?format=json&q="
+                    query
+                    "&pageno="
+                    pageno
+                    )))
+  (define response (get-pure-port engine))
+  (define json-raw (port->string response))
+  (close-input-port response)
+  (with-input-from-string json-raw (lambda () (read-json))))
+
+(define (http-response content)
+  (response/full
+    200
+    #"OK"
+    (current-seconds)
+    TEXT/HTML-MIME-TYPE
+    '()
+    (list
+      (string->bytes/utf-8 content))))
+
+(define (do-search req)
+  (define binds (request-bindings req))
+  (define query (if (exists-binding? 'q binds)
+                 (extract-binding/single 'q binds)
+                 ""))
+
+  (if (non-empty-string? query)
+    (let ()
+      (define pageno (if (exists-binding? 'pageno binds)
+                      (extract-binding/single 'pageno binds)
+                      "1"))
+      (define results
+       (foldr cons '()
+              (filter hash?
+                      (map (lambda (i)
+                             (define result-host
+                               (url-host (string->url
+                                           (hash-ref i 'url ""))))
+                             (define result-url (hash-ref i 'url ""))
+                             (define result-title (hash-ref i 'title ""))
+                             (define result-content (hash-ref i 'content ""))
+                             (define ht (make-hash))
+                             (unless (member-match? result-host blacklist)
+                               (let ()
+                                 (hash-set! ht "title" result-title)
+                                 (hash-set! ht "url" result-url)
+                                 (hash-set! ht "content" result-content)
+                                 )
+                               ht
+                               ))
+                           (hash-ref (search query pageno) 'results)))))
+      (http-response (string-append
+                      (do-head (string-append query " | Web Search"))
+                      (include-template "templates/search.html")
+                      (do-footer))))
+    (redirect-to "/")))
+
+(serve/servlet dispatch
+              #:command-line? #t
+              #:servlet-regexp #rx""
+              #:extra-files-paths (list (build-path "./static"))
+              #:listen-ip "0.0.0.0")