From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Tom Tromey Newsgroups: gmane.emacs.bugs Subject: bug#18308: 24.4.50; Info viewer cannot follow menu entry for '(texinfo) @- @hyphenation' Date: Sun, 24 Aug 2014 20:07:27 -0600 Message-ID: <87ppfpjp9c.fsf@tromey.com> References: <80wqa132j3.fsf@gmail.com> <83d2btav4x.fsf@gnu.org> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain X-Trace: ger.gmane.org 1408932509 20850 80.91.229.3 (25 Aug 2014 02:08:29 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Mon, 25 Aug 2014 02:08:29 +0000 (UTC) Cc: Vincent.b.1@hotmail.fr, gavinsmith0123@gmail.com, Richard Stallman , 18308@debbugs.gnu.org To: Stefan Monnier Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Aug 25 04:08:20 2014 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1XLjhk-0006t4-AD for geb-bug-gnu-emacs@m.gmane.org; Mon, 25 Aug 2014 04:08:20 +0200 Original-Received: from localhost ([::1]:45848 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XLjhj-00043D-QI for geb-bug-gnu-emacs@m.gmane.org; Sun, 24 Aug 2014 22:08:19 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:46741) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XLjha-00042D-HB for bug-gnu-emacs@gnu.org; Sun, 24 Aug 2014 22:08:17 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XLjhT-0005Bn-Dj for bug-gnu-emacs@gnu.org; Sun, 24 Aug 2014 22:08:10 -0400 Original-Received: from debbugs.gnu.org ([140.186.70.43]:44281) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XLjhT-0005Bg-AH for bug-gnu-emacs@gnu.org; Sun, 24 Aug 2014 22:08:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1XLjhS-0003oI-K9 for bug-gnu-emacs@gnu.org; Sun, 24 Aug 2014 22:08:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Tom Tromey Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 25 Aug 2014 02:08:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 18308 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 18308-submit@debbugs.gnu.org id=B18308.140893247114630 (code B ref 18308); Mon, 25 Aug 2014 02:08:02 +0000 Original-Received: (at 18308) by debbugs.gnu.org; 25 Aug 2014 02:07:51 +0000 Original-Received: from localhost ([127.0.0.1]:51224 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1XLjhG-0003nt-GD for submit@debbugs.gnu.org; Sun, 24 Aug 2014 22:07:51 -0400 Original-Received: from gproxy8-pub.mail.unifiedlayer.com ([67.222.33.93]:46662) by debbugs.gnu.org with smtp (Exim 4.80) (envelope-from ) id 1XLjhA-0003nf-3N for 18308@debbugs.gnu.org; Sun, 24 Aug 2014 22:07:48 -0400 Original-Received: (qmail 17458 invoked by uid 0); 25 Aug 2014 02:07:42 -0000 Original-Received: from unknown (HELO cmgw4) (10.0.90.85) by gproxy8.mail.unifiedlayer.com with SMTP; 25 Aug 2014 02:07:42 -0000 Original-Received: from box522.bluehost.com ([74.220.219.122]) by cmgw4 with id iw7W1o00N2f2jeq01w7Z02; Mon, 25 Aug 2014 02:07:40 -0600 X-Authority-Analysis: v=2.1 cv=KvHehwmN c=1 sm=1 tr=0 a=GsOEXm/OWkKvwdLVJsfwcA==:117 a=GsOEXm/OWkKvwdLVJsfwcA==:17 a=cNaOj0WVAAAA:8 a=f5113yIGAAAA:8 a=4GsTxW34auoA:10 a=XP6X8Mxq5zkA:10 a=lzHNuN_m4c4A:10 a=_cZRQKYwz3QA:10 a=zstS-IiYAAAA:8 a=PnD2wP_eR3oA:10 a=oMhZhQ4-4PIA:10 a=9Hf5Klcfr3kPHGFWq1AA:9 a=cQX2OSBIms4su8uJ:21 a=w80tvFR8TGH0D97U:21 a=stA7LbXeNkR9iN2N:21 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=Content-Type:MIME-Version:Message-ID:In-Reply-To:Date:References:Subject:Cc:To:From; bh=UR/nMdNqMA2iFAwnUY0B+F4BPNR1FoiRgHjj6jT0f8A=; b=QmtHC8XTBSCjM/jkLXNe2GoVydvyWu64K0jnhOPX7gbKwCs7SC1bXjTZ8SnonpdxHVgm3brueem9i0xoYmBC+BE/hvLyqrNtnwBe+Z7H6Sj/9+YkaIYQiZ/3Ug1G0Zxi; Original-Received: from [71.33.141.119] (port=38013 helo=bapiya) by box522.bluehost.com with esmtpsa (TLSv1.2:AES128-GCM-SHA256:128) (Exim 4.82) (envelope-from ) id 1XLjgx-0003YG-T5; Sun, 24 Aug 2014 20:07:32 -0600 X-Attribution: Tom In-Reply-To: (Stefan Monnier's message of "Sun, 24 Aug 2014 10:05:48 -0400") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.4.50 (gnu/linux) X-Identified-User: {36111:box522.bluehost.com:elynrobi:tromey.com} {sentby:smtp auth 71.33.141.119 authed with tom+tromey.com} X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:92646 Archived-At: Stefan> The only vaguely related project I've heard of recently is the one that Stefan> provided an Info-mode-like behavior to view Texinfo docs in your Stefan> web browser. Ages ago I wrote a bit of this. I've appended a patch that adds a few more Info-ish key bindings to eww. (The patch won't apply as-is because parts of it are already in trunk.) Most of the bindings from Info-mode will be pretty easy to replicate. Searching isn't insurmountable but will require a bit of work. Dealing with the index is maybe the hardest thing. Here perhaps a new 'rel="index"' attribute would work ok -- this would let the "i" binding know which links represent the indices, and then enable searching of those. Tom === modified file 'lisp/net/eww.el' --- lisp/net/eww.el 2013-06-18 18:04:09 +0000 +++ lisp/net/eww.el 2013-06-19 19:30:57 +0000 @@ -56,6 +56,17 @@ "Title of current page.") (defvar eww-history nil) +(defvar eww-next-url nil) +(defvar eww-previous-url nil) +(defvar eww-up-url nil) +(defvar eww-home-url nil) +(defvar eww-start-url nil) +(defvar eww-contents-url nil) +(defvar eww-index-url nil) +(defvar eww-info-like-menu nil) +(defvar eww-xrefs nil) +(defvar eww-in-menu-class nil) + ;;;###autoload (defun eww (url) "Fetch URL and render the page." @@ -64,10 +75,26 @@ (setq url (concat "http://" url))) (url-retrieve url 'eww-render (list url))) +;;;###autoload +(defun eww-open-file (file) + "Render a file using EWW." + (interactive "fFile: ") + (eww (concat "file://" (expand-file-name file)))) + (defun eww-render (status url &optional point) (let ((redirect (plist-get status :redirect))) (when redirect (setq url redirect))) + (set (make-local-variable 'eww-next-url) nil) + (set (make-local-variable 'eww-previous-url) nil) + (set (make-local-variable 'eww-up-url) nil) + (set (make-local-variable 'eww-home-url) nil) + (set (make-local-variable 'eww-start-url) nil) + (set (make-local-variable 'eww-contents-url) nil) + (set (make-local-variable 'eww-index-url) nil) + (set (make-local-variable 'eww-info-like-menu) nil) + (set (make-local-variable 'eww-xrefs) nil) + (set (make-local-variable 'eww-in-menu-class) nil) (let* ((headers (eww-parse-headers)) (shr-target-id (and (string-match "#\\(.*\\)" url) @@ -146,11 +173,62 @@ (input . eww-tag-input) (textarea . eww-tag-textarea) (body . eww-tag-body) - (select . eww-tag-select)))) + (select . eww-tag-select) + (link . eww-tag-link) + (a . eww-tag-a) + (table . eww-tag-table)))) (shr-insert-document document) (eww-convert-widgets)) (goto-char (point-min)))) +(defun eww-handle-link (cont) + (let* ((rel (assq :rel cont)) + (href (assq :href cont)) + (where (assoc + ;; The text associated with :rel is case-insensitive. + (if rel (downcase (cdr rel))) + '(("next" . eww-next-url) + ;; Texinfo uses "previous", but HTML specifies + ;; "prev", so recognize both. + ("previous" . eww-previous-url) + ("prev" . eww-previous-url) + ;; HTML specifies "start" but also "contents", + ;; and Gtk seems to use "home". Recognize + ;; them all; but store them in different + ;; variables so that we can readily choose the + ;; "best" one. + ("start" . eww-start-url) + ("home" . eww-home-url) + ("contents" . eww-contents-url) + ("up" . eww-up-url) + ("index" . eww-index-url))))) + (and href + where + (set (cdr where) (cdr href))))) + +(defun eww-tag-table (cont) + (let ((eww-in-menu-class (equal (cdr (assq :class cont)) "menu"))) + (if eww-in-menu-class + (setq eww-info-like-menu nil)) + (shr-tag-table cont) + (if eww-in-menu-class + (setq eww-info-like-menu (nreverse eww-info-like-menu))))) + +(defun eww-tag-link (cont) + (eww-handle-link cont) + (shr-generic cont)) + +(defun eww-tag-a (cont) + (eww-handle-link cont) + (let ((start (point)) + (href (cdr (assoc :href cont)))) + (shr-tag-a cont) + (if href + (let ((text (buffer-substring start (point)))) + (if eww-in-menu-class + (push (cons text href) eww-info-like-menu) + (push (cons text href) eww-xrefs)))))) + (defun eww-update-header-line-format () (if eww-header-line-format (setq header-line-format (format-spec eww-header-line-format @@ -208,7 +286,7 @@ (erase-buffer)) (eww-mode)) -(defvar eww-mode-map +(setq eww-mode-map (let ((map (make-sparse-keymap))) (suppress-keymap map) (define-key map "q" 'eww-quit) @@ -218,8 +296,25 @@ (define-key map [delete] 'scroll-down-command) (define-key map "\177" 'scroll-down-command) (define-key map " " 'scroll-up-command) + (define-key map "l" 'eww-back-url) + (define-key map "n" 'eww-next-url) (define-key map "p" 'eww-previous-url) - ;;(define-key map "n" 'eww-next-url) + (define-key map "u" 'eww-up-url) + (define-key map "t" 'eww-top-url) + (define-key map "<" 'eww-top-url) + (define-key map "T" 'eww-toc) + (define-key map "m" 'eww-menu) + (define-key map "f" 'eww-follow-reference) + (define-key map "1" 'eww-nth-menu-item) + (define-key map "2" 'eww-nth-menu-item) + (define-key map "3" 'eww-nth-menu-item) + (define-key map "4" 'eww-nth-menu-item) + (define-key map "5" 'eww-nth-menu-item) + (define-key map "6" 'eww-nth-menu-item) + (define-key map "7" 'eww-nth-menu-item) + (define-key map "8" 'eww-nth-menu-item) + (define-key map "9" 'eww-nth-menu-item) + (define-key map "0" 'undefined) map)) (define-derived-mode eww-mode nil "eww" @@ -240,7 +335,7 @@ (setq eww-history nil) (kill-buffer (current-buffer))) -(defun eww-previous-url () +(defun eww-back-url () "Go to the previously displayed page." (interactive) (when (zerop (length eww-history)) @@ -248,6 +343,77 @@ (let ((prev (pop eww-history))) (url-retrieve (car prev) 'eww-render (list (car prev) (cadr prev))))) +(defun eww-next-url () + "Go to the page marked `next'. +A page is marked `next' if rel=\"next\" appears in a +or tag." + (interactive) + (if eww-next-url + (eww-browse-url (shr-expand-url eww-next-url eww-current-url)) + (error "No `next' on this page"))) + +(defun eww-previous-url () + "Go to the page marked `previous'. +A page is marked `previous' if rel=\"previous\" appears in a +or tag." + (interactive) + (if eww-previous-url + (eww-browse-url (shr-expand-url eww-previous-url eww-current-url)) + (error "No `previous' on this page"))) + +(defun eww-up-url () + "Go to the page marked `up'. +A page is marked `up' if rel=\"up\" appears in a +or tag." + (interactive) + (if eww-up-url + (eww-browse-url (shr-expand-url eww-up-url eww-current-url)) + (error "No `up' on this page"))) + +(defun eww-top-url () + "Go to the page marked `top'. +A page is marked `top' if rel=\"start\", rel=\"home\", or rel=\"contents\" +appears in a or tag." + (interactive) + (let ((best-url (or eww-start-url + eww-contents-url + eww-home-url))) + (if best-url + (eww-browse-url (shr-expand-url best-url eww-current-url)) + (error "No `top' for this page")))) + +(defun eww-toc () + "Go to the page marked `contents'. +A page is marked `contents' if rel=\"contents\" appears in a +or tag." + (interactive) + (if eww-contents-url + (eww-browse-url (shr-expand-url eww-contents-url eww-current-url)) + (error "No `contents' on this page"))) + +(defun eww-follow-reference (ref) + (interactive + (list (completing-read "Menu item: " eww-xrefs nil t))) ;; FIXME history + (eww-browse-url (shr-expand-url (cdr (assoc ref eww-xrefs)) + eww-current-url))) + +(defun eww-menu (ref) + (interactive + (list (completing-read "Menu item: " eww-info-like-menu nil t))) ;; FIXME history + (eww-browse-url (shr-expand-url (cdr (assoc ref eww-info-like-menu)) + eww-current-url))) + +(defun eww-nth-menu-item () + (interactive) + (let* ((n + (- (aref (this-command-keys) (1- (length (this-command-keys)))) ?1)) + (menu-item (nth n eww-info-like-menu))) + (if menu-item + (eww-browse-url (shr-expand-url (cdr menu-item) eww-current-url)) + (if eww-info-like-menu + (error "Too few items in menu") + (error "No menu in this page"))))) + (defun eww-reload () "Reload the current page." (interactive)