diff --git a/src/filesystem-utils.lisp b/src/filesystem-utils.lisp index 9fccb14..9950e06 100644 --- a/src/filesystem-utils.lisp +++ b/src/filesystem-utils.lisp @@ -126,6 +126,13 @@ (nix:eloop () 0)) (nix:closedir ,dir))))) +(defun collect-children (parent-dir) + (let ((all-paths ())) + (fs:do-directory (path) parent-dir + (push path all-paths)) + (setf all-paths (sort all-paths #'string<)) + all-paths)) + (defun search-matching-file (root-directory &key (name ".*")) "Scan a filesystem saving files that match the provided criteria, does not follow symlinks." diff --git a/src/package.lisp b/src/package.lisp index dda701f..3790fa7 100644 --- a/src/package.lisp +++ b/src/package.lisp @@ -278,7 +278,10 @@ :strip-extension :add-extension :do-directory + :collect-children :search-matching-file + :regular-file-p + :dirp :split-path-elements :path-last-element :path-first-element diff --git a/src/program-events.lisp b/src/program-events.lisp index fe89dc9..3a14bac 100644 --- a/src/program-events.lisp +++ b/src/program-events.lisp @@ -1013,21 +1013,46 @@ keybindings:*gemini-message-keymap*) (when give-focus-to-message-window-p (ui:focus-to-message-window)) - (if (gemini-client:absolute-gemini-url-p url) - (gemini-viewer:request url :use-cached-file-if-exists use-cached-file-if-exists) - (let* ((file-string (fs:slurp-file url)) - (parent-dir (fs:parent-dir-path url)) - (parsed (gemini-parser:parse-gemini-file file-string)) - (links (gemini-parser:sexp->links parsed - nil - nil - parent-dir - :comes-from-local-file t)) - (text (gemini-parser:sexp->text parsed - gemini-client:*gemini-page-theme*))) - (gemini-viewer:maybe-initialize-metadata window) - (refresh-gemini-message-window links file-string text nil) - (windows:draw window))))))) + (cond + ((gemini-client:absolute-gemini-url-p url) + (gemini-viewer:request url :use-cached-file-if-exists use-cached-file-if-exists)) + ((fs:dirp url) + (let* ((all-paths (fs:collect-children url)) + (raw-text (with-output-to-string (stream) + (write-sequence (gemini-parser:geminize-h1 + (format nil + (_ "Index of local directory ~a~2%") + url)) + stream) + (loop for path in all-paths do + (format stream + "~a~%" + (gemini-parser:make-gemini-link path path))))) + (parsed (gemini-parser:parse-gemini-file raw-text)) + (links (gemini-parser:sexp->links parsed + nil + nil + "" + :comes-from-local-file t)) + (text (gemini-parser:sexp->text parsed + gemini-client:*gemini-page-theme*))) + (gemini-viewer:maybe-initialize-metadata window) + (refresh-gemini-message-window links raw-text text nil) + (windows:draw window))) + (t + (let* ((file-string (fs:slurp-file url)) + (parent-dir (fs:parent-dir-path url)) + (parsed (gemini-parser:parse-gemini-file file-string)) + (links (gemini-parser:sexp->links parsed + nil + nil + parent-dir + :comes-from-local-file t)) + (text (gemini-parser:sexp->text parsed + gemini-client:*gemini-page-theme*))) + (gemini-viewer:maybe-initialize-metadata window) + (refresh-gemini-message-window links file-string text nil) + (windows:draw window)))))))) (defclass gemini-back-event (program-event) ())