X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=elopher.el;h=81b2ef20923229380dc9d2d22a07e4fbafe8c72a;hb=046938ba37571d3f549d654763c9852a0d5cc87c;hp=812ebb487507704f985a133f3279c203f037fec0;hpb=7f807b93bfabc32fcf5e17d81511d6bfdbba3acd;p=elpher.git diff --git a/elopher.el b/elopher.el index 812ebb4..81b2ef2 100644 --- a/elopher.el +++ b/elopher.el @@ -15,7 +15,7 @@ (defconst elopher-margin-width 6 "Width of left-hand margin used when rendering indicies.") -(defconst elopher-start-page +(defconst elopher-start-index (string-join (list "i\tfake\tfake\t1" "i--------------------------------------------\tfake\tfake\t1" @@ -78,30 +78,46 @@ ;; Node -(defun elopher-make-node (parent address getter &optional content) - (list parent address getter content)) +(defun elopher-make-node (parent address getter &optional content pos) + (list parent address getter content pos)) (defun elopher-node-parent (node) - (car node)) + (elt node 0)) (defun elopher-node-address (node) - (cadr node)) + (elt node 1)) (defun elopher-node-getter (node) - (caddr node)) + (elt node 2)) (defun elopher-node-content (node) - (cadddr node)) + (elt node 3)) + +(defun elopher-node-pos (node) + (elt node 4)) (defun elopher-set-node-content (node content) - (setcar (cdddr node) content)) + (setcar (nthcdr 3 node) content)) + +(defun elopher-set-node-pos (node pos) + (setcar (nthcdr 4 node) pos)) + +(defun elopher-save-pos () + (when elopher-current-node + (elopher-set-node-pos elopher-current-node (point)))) + +(defun elopher-restore-pos () + (let ((pos (elopher-node-pos elopher-current-node))) + (if pos + (goto-char pos) + (goto-char (point-min))))) ;; Node graph traversal -(defvar elopher-start-node (elopher-make-node nil nil #'elopher-get-index-node)) (defvar elopher-current-node) (defun elopher-visit-node (node) + (elopher-save-pos) (elopher-prepare-buffer) (setq elopher-current-node node) (funcall (elopher-node-getter node))) @@ -109,8 +125,7 @@ (defun elopher-visit-parent-node () (let ((parent-node (elopher-node-parent elopher-current-node))) (when parent-node - (setq elopher-current-node parent-node) - (elopher-visit-node elopher-current-node)))) + (elopher-visit-node parent-node)))) (defun elopher-reload-current-node () (elopher-set-node-content elopher-current-node nil) @@ -137,6 +152,7 @@ (elopher-insert-index-record line)))) (defun elopher-insert-margin (&optional type-name) + "Insert index margin, optionally containing the TYPE-NAME, into the current buffer." (if type-name (progn (insert (format (concat "%" (number-to-string (- elopher-margin-width 1)) "s") @@ -152,7 +168,11 @@ (let* ((type (elt line 0)) (fields (split-string (substring line 1) "\t")) (display-string (elt fields 0)) - (address (elopher-make-address (elt fields 1) (elt fields 2) (elt fields 3)))) + (address (elopher-make-address (elt fields 1) (elt fields 2) (elt fields 3))) + (help-string (format "mouse-1, RET: open %s on %s port %s" + (elopher-address-selector address) + (elopher-address-host address) + (elopher-address-port address)))) (pcase type (?i (elopher-insert-margin) (insert (propertize display-string @@ -164,7 +184,8 @@ address #'elopher-get-text-node) 'action #'elopher-click-link - 'follow-link t)) + 'follow-link t + 'help-echo help-string)) (?1 (elopher-insert-margin "/") (insert-text-button display-string 'face elopher-index-face @@ -172,7 +193,8 @@ address #'elopher-get-index-node) 'action #'elopher-click-link - 'follow-link t)) + 'follow-link t + 'help-echo help-string)) (?.) ; Occurs at end of index, can safely ignore. (tp (elopher-insert-margin (concat (char-to-string tp) "?")) (insert (propertize display-string @@ -205,23 +227,22 @@ (let ((content (elopher-node-content elopher-current-node)) (address (elopher-node-address elopher-current-node))) (if content - (let ((inhibit-read-only t)) - (save-excursion - (insert content))) + (progn + (let ((inhibit-read-only t)) + (insert content)) + (elopher-restore-pos)) (if address (elopher-get-selector address (lambda (proc event) (let ((inhibit-read-only t)) - (erase-buffer) - (save-excursion - (elopher-insert-index elopher-selector-string))) + (elopher-insert-index elopher-selector-string)) + (elopher-restore-pos) (elopher-set-node-content elopher-current-node (buffer-string)))) (progn (let ((inhibit-read-only t)) - (erase-buffer) - (save-excursion - (elopher-insert-index elopher-start-page))) + (elopher-insert-index elopher-start-index)) + (elopher-restore-pos) (elopher-set-node-content elopher-current-node (buffer-string))))))) @@ -234,16 +255,15 @@ (let ((content (elopher-node-content elopher-current-node)) (address (elopher-node-address elopher-current-node))) (if content - (let ((inhibit-read-only t)) - (save-excursion - (insert content))) + (progn + (let ((inhibit-read-only t)) + (insert content)) + (elopher-restore-pos)) (elopher-get-selector address (lambda (proc event) (let ((inhibit-read-only t)) - (erase-buffer) - (save-excursion - (insert - (elopher-strip-CRs elopher-selector-string)))) + (insert (elopher-strip-CRs elopher-selector-string))) + (elopher-restore-pos) (elopher-set-node-content elopher-current-node (buffer-string))))))) @@ -286,14 +306,18 @@ (defun elopher-back () "Go to previous site." (interactive) - (elopher-visit-parent-node)) + (if (elopher-node-parent elopher-current-node) + (elopher-visit-parent-node) + (message "No previous site."))) ;;; Main start procedure ;; (defun elopher () "Start elopher with default landing page." (interactive) - (elopher-visit-node elopher-start-node)) + (setq elopher-current-node nil) + (let ((start-node (elopher-make-node nil nil #'elopher-get-index-node))) + (elopher-visit-node start-node))) ;;; Mode and keymap