+;; Index retrieval
+
+(defun elopher-index-filter (proc string)
+ (let ((marker (process-mark proc))
+ (inhibit-read-only t))
+ (if (not (marker-position marker))
+ (set-marker marker 0 (current-buffer)))
+ (save-excursion
+ (goto-char marker)
+ (elopher-render-complete-records string)
+ (set-marker marker (point)))))
+
+(defun elopher-get-index (selector host port)
+ (setq elopher-incomplete-record "")
+ (elopher-get-selector selector host port
+ #'elopher-index-filter))
+
+;; Text retrieval
+
+(defun elopher-text-filter (proc string)
+ (let ((marker (process-mark proc))
+ (inhibit-read-only t))
+ (if (not (marker-position marker))
+ (set-marker marker 0 (current-buffer)))
+ (save-excursion
+ (goto-char marker)
+ (dolist (line (split-string string "\r"))
+ (insert line))
+ (set-marker marker (point)))))
+
+(defun elopher-get-text (selector host port)
+ (elopher-get-selector selector host port
+ #'elopher-text-filter))
+
+;; Image retrieval
+
+(defvar elopher-image-buffer "")
+
+(defun elopher-image-filter (proc string)
+ (setq elopher-image-buffer (concat elopher-image-buffer string)))
+
+(defun elopher-image-sentinel (proc event)
+ (let ((inhibit-read-only t))
+ (insert-image (create-image elopher-image-buffer))))
+
+(defun elopher-get-image (selector host port)
+ (setq elopher-image-buffer "")
+ (elopher-get-selector selector host port
+ #'elopher-image-filter
+ #'elopher-image-sentinel))
+
+
+;;; Navigation methods
+;;
+
+(defun elopher-next-link ()
+ (interactive)
+ (forward-button 1))
+
+(defun elopher-prev-link ()
+ (interactive)
+ (backward-button 1))
+
+(defun elopher-click-link (button)
+ (apply (button-get button 'link-getter) (button-get button 'link-address)))
+
+(defun elopher-follow-closest-link ()