diff --git a/etc/default-theme.conf b/etc/default-theme.conf index 35e5d17..57bfa84 100644 --- a/etc/default-theme.conf +++ b/etc/default-theme.conf @@ -683,6 +683,8 @@ gopher-window.line.prefix.image-file = "🖼 " gopher-window.line.prefix.gif-file = "🖼 " +gopher-window.line.prefix.search = "🔎 " + gopher-window.line.prefix.foreground = cyan gopher-window.line.prefix.attribute = bold diff --git a/src/gopher-window.lisp b/src/gopher-window.lisp index f2bf5ed..2c70905 100644 --- a/src/gopher-window.lisp +++ b/src/gopher-window.lisp @@ -203,6 +203,21 @@ (win-clear win) (windows:draw win))) +(defun make-search-query (selector search-expression) + (format nil "~a~a~a" selector #\tab search-expression)) + +(defun search-index-server (host port selector) + (flet ((on-input-complete (search-expression) + (when (string-not-empty-p search-expression) + (program-events:with-enqueued-process () + (make-request host + port + gopher-parser:+line-type-dir+ + (make-search-query selector search-expression)))))) + (ui:ask-string-input #'on-input-complete + :prompt (_ "Enter search terms: ") + :complete-fn #'complete:complete-always-empty))) + (defun make-request (host port type selector) (let ((message-win specials:*message-window*)) (gemini-viewer:maybe-initialize-metadata message-win) @@ -227,6 +242,8 @@ (gopher-parser:parse-menu (text-utils:to-s data))) (select-row *gopher-window* 0) (draw *gopher-window*))) + ((gopher-parser::%line-type-index-search-p type) + (search-index-server host port selector)) ((gopher-parser::%line-type-file-p type) (win-close *gopher-window*) (let ((data (misc:make-fresh-array 0 :type '(unsigned-int 8)))) diff --git a/src/gopher/parser.lisp b/src/gopher/parser.lisp index c9e472e..a68197d 100644 --- a/src/gopher/parser.lisp +++ b/src/gopher/parser.lisp @@ -257,7 +257,7 @@ :host (sixth line) :port (elt line 7))))) -(defrule menu (and (* dir-entity) last-line) +(defrule menu (and (* dir-entity) (? last-line)) (:function first)) (defun parse-menu (data)