(defun elpher-address-port (address)
"Retrieve port from ADDRESS."
- (elt address 2))
+ (elt address 3))
+
++(defun elpher-address-special-p (address)
++ (not (elpher-address-host address)))
+
;; Node
-(defun elpher-make-node (parent address getter &optional content pos)
+(defun elpher-make-node (display-string parent address)
"Create a node in the gopher page hierarchy.
-PARENT specifies the parent of the node, ADDRESS specifies the address of
-the gopher page, GETTER provides the getter function used to obtain this
-page.
+DISPLAY-STRING records the display string used for the page.
+
+PARENT specifies the parent of the node, and ADDRESS specifies the
+address of the gopher page."
+ (list display-string parent address))
-The optional arguments CONTENT and POS can be used to fill the cached
-content and cursor position fields of the node."
- (list parent address getter content pos))
+(defun elpher-node-display-string (node)
+ "Retrieve the display string of NODE."
+ (elt node 0))
(defun elpher-node-parent (node)
"Retrieve the parent node of NODE."
(insert " "))
(insert (make-string elpher-margin-width ?\s))))
-(defun elpher-insert-index-record (line)
- "Insert the index record corresponding to LINE into the current buffer."
- (let* ((type (elt line 0))
- (fields (split-string (substring line 1) "\t"))
- (display-string (elt fields 0))
- (selector (elt fields 1))
- (host (elt fields 2))
- (port (elt fields 3))
- (address (elpher-make-address selector host port))
- (type-map-entry (alist-get type elpher-type-map)))
+(defun elpher-node-button-help (node)
+ "Return a string containing the help text for a button corresponding to NODE."
+ (let ((address (elpher-node-address node)))
+ (if (eq (elpher-address-type address) ?h)
+ (let ((url (cadr (split-string (elpher-address-selector address) "URL:"))))
+ (format "mouse-1, RET: open url '%s'" url))
+ (format "mouse-1, RET: open '%s' on %s port %s"
+ (elpher-address-selector address)
+ (elpher-address-host address)
+ (elpher-address-port address)))))
+
+(defun elpher-insert-index-record (display-string type selector host port)
+ "Function to insert an index record into the current buffer.
+The contents of the record are dictated by TYPE, DISPLAY-STRING, SELECTOR, HOST
+and PORT."
+ (let ((address (elpher-make-address type selector host port))
+ (type-map-entry (alist-get type elpher-type-map)))
(if type-map-entry
- (let* ((margin-code (cadr type-map-entry))
- (let ((getter (car type-map-entry))
- (margin-code (cadr type-map-entry))
- (face (elt type-map-entry 2)))
++ (let* ((margin-code (elt type-map-entry 1))
+ (face (elt type-map-entry 2))
+ (node (elpher-make-node display-string elpher-current-node address)))
(elpher-insert-margin margin-code)
(insert-text-button display-string
'face face
(message "No current site.")))
(defun elpher-view-raw ()
-- "View current page as plain text."
++ "View raw server response for current page."
(interactive)
(if elpher-current-node
-- (elpher-visit-node elpher-current-node
-- #'elpher-get-node-raw)
++ (if (elpher-address-special-p (elpher-node-address elpher-current-node))
++ (error "This page was not generated by a server.")
++ (elpher-visit-node elpher-current-node
++ #'elpher-get-node-raw))
(message "No current site.")))
(defun elpher-back ()
(let ((button (button-at (point))))
(if button
(let ((node (button-get button 'elpher-node)))
-- (if node
-- (elpher-visit-node (button-get button 'elpher-node)
-- #'elpher-get-node-download)
- (error "Can only download gopher links, not general URLs")))
- (message "Can only download gopher links, not general URLs.")))
- (message "No link selected."))))
++ (if (elpher-address-special-p (elpher-node-address node))
++ (error "Cannot download this link")
++ (elpher-visit-node (button-get button 'elpher-node)
++ #'elpher-get-node-download)))
+ (error "No link selected"))))
(defun elpher-build-link-map ()
"Build alist mapping link names to destination nodes in current buffer."