diff --git a/src/gemini-viewer.lisp b/src/gemini-viewer.lisp index 1ba711d..62b0e82 100644 --- a/src/gemini-viewer.lisp +++ b/src/gemini-viewer.lisp @@ -363,6 +363,13 @@ (fetch-favicon parsed-url))) (swconf:gemini-default-favicon))))))) +(defun fragment->regex (fragment) + (when (and fragment + (swconf:config-gemini-fragment-as-regex-p)) + (if (text-utils:percent-encoded-p fragment) + (text-utils:percent-decode fragment) + fragment))) + (defun request-stream-gemini-document-thread (wrapper-object host port path query fragment favicon gemini-format-p @@ -489,13 +496,11 @@ (setf (stream-status wrapper-object) :completed) (when (and fragment (swconf:config-gemini-fragment-as-regex-p)) - (let* ((regex (if (text-utils:percent-encoded-p fragment) - (text-utils:percent-decode fragment) - fragment)) - (priority program-events:+standard-event-priority+) - (event (make-instance 'program-events:search-message-gemini-fragment-event - :priority priority - :payload regex))) + (when-let* ((regex (fragment->regex fragment)) + (priority program-events:+standard-event-priority+) + (event (make-instance 'program-events:search-message-gemini-fragment-event + :priority priority + :payload regex))) (program-events:push-event event)))) (t (os-utils:open-resource-with-external-program support-file nil))) diff --git a/src/gui/client/main-window.lisp b/src/gui/client/main-window.lisp index b124e7f..3d122c6 100644 --- a/src/gui/client/main-window.lisp +++ b/src/gui/client/main-window.lisp @@ -165,7 +165,16 @@ (ev:with-enqueued-process-and-unblock () (set-bookmark-button-false main-window))) (ev:with-enqueued-process-and-unblock () - (set-gemlog-toolbar-button-appearance main-window iri)))) + (set-gemlog-toolbar-button-appearance main-window iri)) + (ev:with-enqueued-process-and-unblock () + (a:when-let* ((fragment (uri:fragment (iri:iri-parse iri))) + (regexp (gemini-viewer::fragment->regex fragment))) + (setf (gui:text (client-search-frame::entry (search-frame main-window))) + regexp) + (funcall (client-search-frame::start-search-clsr (search-frame main-window) + (gemtext-widget main-window) + nil) + nil))))) (defun set-gemlog-toolbar-button-appearance (main-window iri) (if (comm:make-request :gemini-gemlog-subscribed-p 1 iri) diff --git a/src/gui/client/search-frame.lisp b/src/gui/client/search-frame.lisp index aefb0b7..f975450 100644 --- a/src/gui/client/search-frame.lisp +++ b/src/gui/client/search-frame.lisp @@ -24,6 +24,21 @@ :initarg :counter :accessor counter))) +(defun start-search-clsr (search-frame gemtext-widget case-sensitive) + (lambda (e) + (declare (ignore e)) + (loop for match in (matches search-frame) do + (gui:tag-delete gemtext-widget (gui:match-tag-name match))) + (let ((tags (gui:search-all-text gemtext-widget + (gui:text (entry search-frame)) + :case-insensitive + case-sensitive))) + (setf (matches search-frame) (nreverse tags))) + (loop for match in (matches search-frame) do + (gui:tag-configure gemtext-widget + (gui:match-tag-name match) + :background (gui:cget gemtext-widget + :highlightbackground))))) (defun init-window (main-window) (let* ((frame (make-instance 'search-frame :master main-window)) (gemtext-widget (client-main-window::gemtext-widget main-window)) @@ -50,19 +65,9 @@ (button-close (_ "end searching"))) (gui:bind (entry frame) #$$ - (lambda (e) - (declare (ignore e)) - (loop for match in (matches frame) do - (gui:tag-delete gemtext-widget (gui:match-tag-name match))) - (let ((tags (gui:search-all-text gemtext-widget - (gui:text (entry frame)) - :case-insensitive - (not (gui:value case-sensitive-checkbox))))) - (setf (matches frame) (nreverse tags))) - (loop for match in (matches frame) do - (gui:tag-configure gemtext-widget - (gui:match-tag-name match) - :background (gui:cget gemtext-widget :highlightbackground))))) + (start-search-clsr frame + gemtext-widget + (not (gui:value case-sensitive-checkbox)))) (setf (gui:command (button-next frame)) (lambda () (when (matches frame)