;;; Global constants
;;
-(defconst elpher-version "1.0.0"
+(defconst elpher-version "1.1.0"
"Current version of elpher.")
(defconst elpher-margin-width 6
(mapconcat
'identity
(list "i\tfake\tfake\t1"
- "i--------------------------------------------\tfake\tfake\t1"
- "i Elpher Gopher Client \tfake\tfake\t1"
- (format "i version %s\tfake\tfake\t1" elpher-version)
- "i--------------------------------------------\tfake\tfake\t1"
+ "i --------------------------------------------\tfake\tfake\t1"
+ "i Elpher Gopher Client \tfake\tfake\t1"
+ (format "i version %s\tfake\tfake\t1" elpher-version)
+ "i --------------------------------------------\tfake\tfake\t1"
"i\tfake\tfake\t1"
"iUsage:\tfake\tfake\t1"
"i\tfake\tfake\t1"
"isearch terms:\tfake\tfake\t1"
"i\tfake\tfake\t1"
"7Veronica-2 Gopher Search Engine\t/v2/vs\tgopher.floodgap.com\t70"
- ".")
+ ".\r\n")
"\r\n")
"Source for elpher start page.")
;; Node graph traversal
-(defvar elpher-current-node)
+(defvar elpher-current-node nil)
(defun elpher-visit-node (node &optional getter)
"Visit NODE using its own getter or GETTER, if non-nil."
(defmacro elpher-with-clean-buffer (&rest args)
"Evaluate ARGS with a clean *elpher* buffer as current."
- (list 'progn
- '(switch-to-buffer "*elpher*")
+ (list 'with-current-buffer "*elpher*"
'(elpher-mode)
(append (list 'let '((inhibit-read-only t))
'(erase-buffer))
"Insert the index corresponding to STRING into the current buffer."
;; Should be able to split directly on CRLF, but some non-conformant
;; LF-only servers sadly exist, hence the following.
- (dolist (line (split-string (replace-regexp-in-string "\r" "" string) "\n"))
- (unless (= (length line) 0)
- (elpher-insert-index-record line))))
+ (let* ((str-no-period (replace-regexp-in-string "\r\n\.\r\n$" "\r\n" string))
+ (str-no-cr (replace-regexp-in-string "\r" "" str-no-period)))
+ (dolist (line (split-string str-no-cr "\n"))
+ (unless (= (length line) 0)
+ (elpher-insert-index-record line)))))
(defun elpher-insert-margin (&optional type-name)
"Insert index margin, optionally containing the TYPE-NAME, into the current buffer."
'action #'elpher-click-url
'follow-link t
'help-echo (format "mouse-1, RET: open url %s" url))))
- (?.) ;; Occurs at end of index, can safely ignore.
(tp (elpher-insert-margin (concat (char-to-string tp) "?"))
(insert (propertize display-string
'face 'elpher-unknown-face)))))
(if content
(progn
(elpher-with-clean-buffer
- (insert content))
- (elpher-restore-pos))
+ (insert content)
+ (elpher-restore-pos)))
(if address
(progn
(elpher-with-clean-buffer
(lambda (proc event)
(unless (string-prefix-p "deleted" event)
(elpher-with-clean-buffer
- (elpher-insert-index elpher-selector-string))
- (elpher-restore-pos)
- (elpher-set-node-content elpher-current-node
- (buffer-string))))))
+ (elpher-insert-index elpher-selector-string)
+ (elpher-restore-pos)
+ (elpher-set-node-content elpher-current-node
+ (buffer-string)))))))
(progn
(elpher-with-clean-buffer
- (elpher-insert-index elpher-start-index))
- (elpher-restore-pos)
- (elpher-set-node-content elpher-current-node
- (buffer-string)))))))
+ (elpher-insert-index elpher-start-index)
+ (elpher-restore-pos)
+ (elpher-set-node-content elpher-current-node
+ (buffer-string))))))))
;; Text retrieval
(if content
(progn
(elpher-with-clean-buffer
- (insert content))
- (elpher-restore-pos))
+ (insert content)
+ (elpher-restore-pos)))
(progn
(elpher-with-clean-buffer
(insert "LOADING TEXT..."))
(lambda (proc event)
(unless (string-prefix-p "deleted" event)
(elpher-with-clean-buffer
- (insert (elpher-process-text elpher-selector-string)))
- (elpher-restore-pos)
- (elpher-set-node-content elpher-current-node
- (buffer-string)))))))))
+ (insert (elpher-process-text elpher-selector-string))
+ (elpher-restore-pos)
+ (elpher-set-node-content elpher-current-node
+ (buffer-string))))))))))
;; Image retrieval
(if content
(progn
(elpher-with-clean-buffer
- (insert-image content))
- (setq cursor-type nil)
- (elpher-restore-pos))
+ (insert-image content)
+ (elpher-restore-pos)))
(if (display-images-p)
(progn
(elpher-with-clean-buffer
'no-conversion)
nil t)))
(elpher-with-clean-buffer
- (insert-image image))
- (setq cursor-type nil)
- (elpher-restore-pos)
+ (insert-image image)
+ (elpher-restore-pos))
(if elpher-cache-images
(elpher-set-node-content elpher-current-node
image)))))))
(if content
(progn
(elpher-with-clean-buffer
- (insert content))
- (elpher-restore-pos)
+ (insert content)
+ (elpher-restore-pos))
(message "Displaying cached search results. Reload to perform a new search."))
(unwind-protect
(let* ((query-string (read-string "Query: "))
(lambda (proc event)
(unless (string-prefix-p "deleted" event)
(elpher-with-clean-buffer
- (insert elpher-selector-string))
- (goto-char (point-min)))))
+ (insert elpher-selector-string)
+ (goto-char (point-min))))))
(progn
(elpher-with-clean-buffer
(insert elpher-start-index))
(defun elpher-go ()
"Go to a particular gopher site."
(interactive)
+ (switch-to-buffer "*elpher*")
(let* (
(hostname (read-string "Gopher host: "))
(selector (read-string "Selector (default none): " nil nil ""))
(defun elpher-redraw ()
"Redraw current page."
(interactive)
- (elpher-visit-node elpher-current-node))
+ (if elpher-current-node
+ (elpher-visit-node elpher-current-node)
+ (message "No current site.")))
(defun elpher-reload ()
"Reload current page."
(interactive)
- (elpher-reload-current-node))
+ (if elpher-current-node
+ (elpher-reload-current-node)
+ (message "No current site.")))
(defun elpher-view-raw ()
"View current page as plain text."
(interactive)
- (elpher-visit-node elpher-current-node
- #'elpher-get-node-raw))
+ (if elpher-current-node
+ (elpher-visit-node elpher-current-node
+ #'elpher-get-node-raw)
+ (message "No current site.")))
(defun elpher-back ()
"Go to previous site."
(defun elpher ()
"Start elpher with default landing page."
(interactive)
- (setq elpher-current-node nil)
- (let ((start-node (elpher-make-node nil
- elpher-start-address
- #'elpher-get-index-node)))
- (elpher-visit-node start-node))
+ (if (get-buffer "*elpher*")
+ (switch-to-buffer "*elpher*")
+ (switch-to-buffer "*elpher*")
+ (setq elpher-current-node nil)
+ (let ((start-node (elpher-make-node nil
+ elpher-start-address
+ #'elpher-get-index-node)))
+ (elpher-visit-node start-node)))
"Started Elpher.") ; Otherwise (elpher) evaluates to start page string.
;;; elpher.el ends here