From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Eshel Yaron via "Bug reports for GNU Emacs, the Swiss army knife of text editors" Newsgroups: gmane.emacs.bugs Subject: bug#64126: [PATCH] New command 'eww-copy-alternate-url' Date: Sat, 17 Jun 2023 17:08:24 +0300 Message-ID: References: <83a5wyqltw.fsf@gnu.org> Reply-To: Eshel Yaron Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="7056"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Cc: 64126@debbugs.gnu.org To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sat Jun 17 16:09:30 2023 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1qAWcL-0001dg-Px for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 17 Jun 2023 16:09:29 +0200 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1qAWc2-0006VF-GG; Sat, 17 Jun 2023 10:09:10 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1qAWbu-0006Ul-Oe for bug-gnu-emacs@gnu.org; Sat, 17 Jun 2023 10:09:03 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1qAWbu-00036A-G6 for bug-gnu-emacs@gnu.org; Sat, 17 Jun 2023 10:09:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1qAWbu-0004MM-BZ for bug-gnu-emacs@gnu.org; Sat, 17 Jun 2023 10:09:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Eshel Yaron Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 17 Jun 2023 14:09:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 64126 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 64126-submit@debbugs.gnu.org id=B64126.168701091116689 (code B ref 64126); Sat, 17 Jun 2023 14:09:02 +0000 Original-Received: (at 64126) by debbugs.gnu.org; 17 Jun 2023 14:08:31 +0000 Original-Received: from localhost ([127.0.0.1]:52202 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qAWbP-0004L4-0j for submit@debbugs.gnu.org; Sat, 17 Jun 2023 10:08:31 -0400 Original-Received: from mail.eshelyaron.com ([107.175.124.16]:46936 helo=eshelyaron.com) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1qAWbM-0004Ks-BR for 64126@debbugs.gnu.org; Sat, 17 Jun 2023 10:08:29 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=eshelyaron.com; s=mail; t=1687010907; bh=o3LCJbv+JaDgxgZuqfAfts/z/oddckxo1hXH/krVj0s=; h=From:To:Cc:Subject:In-Reply-To:References:Date:From; b=djCXGkZOQDfucWfAgbRLInltAXicP+U7lg/byn0QsgyRaWwcK73C58C8Q4odiET30 eoir04faEiOyqXC8TwETfWRnUtLMgbQqfun/0OZF55HHE8825hRDZiz/VuWD4dR3s5 3t5uLu4BsZeiyvBmAPEtzSaUFAMJxZd7BhKdeBg8Gb/7o4FqGdP6SUa2jbi+QkomHt NyoKedkzBYxge2fP9+nRDXk5Tvl579g9r6Gv9ZiljnRWyYpD1cp8eWE66MyVfYO89K CTMOp3XvDQHAHj2o9QsuRbznMIAknAwTitnDMueAI9c2z8sBSCP3BUWmPOJH7lCFOn Pern2o99mko/Q== In-Reply-To: <83a5wyqltw.fsf@gnu.org> (Eli Zaretskii's message of "Sat, 17 Jun 2023 16:07:07 +0300") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list 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-mx.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.bugs:263541 Archived-At: --=-=-= Content-Type: text/plain Thanks for your comments, Eli, I'm attaching an updated patch below. Eli Zaretskii writes: >> This adds a new command to EWW that copies an alternate link to the >> currently visited page into the kill ring. This is useful for >> subscribing to website feeds, etc.. > ^^ > Two periods, one of which is probably redunant. > Fixed. >> +@findex eww-copy-alternate-url >> +@kindex A >> + The @kbd{A} command (@code{eww-copy-alternate-url}) copies the URL >> +of an alternate link of the current page (such as an associated RSS >> +feed) into the kill ring. If the page specifies multiple alternate >> +links, this command prompt for one of them in the minibuffer. > > This doesn't say anything about what an "alternate link" could be, it > just provides a single example. Since this is for the manual (as > opposed to the doc string), there's no need to be so terse; we should > instead explain more about what these alternate links are or could be, > and give more than just a single example. Perhaps also tell how the > alternate links are designated in HTML. > Alright, I wasn't sure how much to elaborate here, I've added more details in the updated patch. I hope I got the formatting right for referring to HTML elements, basically I tried to follow similar existing cases in eww.texi. >> +*** New command 'eww-copy-alternate-url'. >> +It copies an alternate link to the page currently visited in EWW into >> +the kill ring. > > Searching the Internet for "alternate link" brings this: > > A type of hyperlink that gives alternate representations of the > current document. > > Is this what is meant here? If so, why are you talking about RSS > feeds? > Yes, websites very often use these alternate links to point to their RSS/Atom feeds. Should I add a couple of words about that in the NEWS entry as well? For instance, https://www.gnu.org/ lists https://planet.gnu.org/rss20.xml as an alternate link (as well as translations of that webpage to other languages). There's more information about alternate links here https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel#alternate >> +(defun eww-read-alternate-url () >> + "Get the URL of an alternate link of this page. >> + >> +If there is just one alternate link, return it's URL. If there > ^^^^ > "its" > Thanks, fixed. >> +are multiple alternate links, prompt for one in the minibuffer. > > I guess the prompt is with completion? If so, please mention that. > Done. >> +(defun eww-copy-alternate-url () >> + "Copy an alternate URL of the current page into the kill ring." > > This doc string says nothing at all about what an alternate link is. > It should say at least something. > Sure, I've added a couple of words here as well. >> + (interactive nil eww-mode) >> + (if-let ((url (eww-read-alternate-url))) >> + (progn >> + (kill-new url) >> + (message "Copied %s to kill ring" url)) >> + (user-error "No feeds found!"))) > > "No feeds"? Can the alternate link be something other than a feed? > In any case, "No feeds found on this page!" is better, I think, as "No > feeds!" is too general. You're right, thanks, I've changed this to "No alternate links found on this page!". --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=v2-0001-New-command-eww-copy-alternate-url.patch >From 70e10c40cf2319b316611c56be53a27b6e67cad5 Mon Sep 17 00:00:00 2001 From: Eshel Yaron Date: Sat, 17 Jun 2023 13:48:51 +0300 Subject: [PATCH v2] New command 'eww-copy-alternate-url' This adds a new command to EWW that copies an alternate link to the currently visited page into the kill ring. This is useful for subscribing to website feeds, etc. * lisp/net/eww.el (eww--alternate-urls) (eww-read-alternate-url): New functions. (eww-copy-alternate-url): New command. (eww-mode-map): Bind it to 'A'. * doc/misc/eww.texi (Basics): Document it. * etc/NEWS: Announce it. --- doc/misc/eww.texi | 15 +++++++++ etc/NEWS | 5 +++ lisp/net/eww.el | 79 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+) diff --git a/doc/misc/eww.texi b/doc/misc/eww.texi index c02e9db11c9..cff48bd601e 100644 --- a/doc/misc/eww.texi +++ b/doc/misc/eww.texi @@ -115,6 +115,21 @@ Basics @kbd{w} calls @code{eww-copy-page-url}, which will copy the current page's URL to the kill ring instead. +@findex eww-copy-alternate-url +@kindex A + The @kbd{A} command (@code{eww-copy-alternate-url}) copies the URL +of an alternate link of the current page into the kill ring. If the +page specifies multiple alternate links, this command prompts for one +of them in the minibuffer, with completion. Alternate links are +references that an @acronym{HTML} page may include to point to other +documents that act as its alternative representations. Notably, +@acronym{HTML} pages can use alternate links to point to their +translated versions and to @acronym{RSS} feeds. Alternate links +appear in the @samp{} section of @acronym{HTML} pages as +@samp{} elements with @samp{rel} attribute equal to +@samp{``alternate''}, they are part of the page's metadata and are not +visible in its rendered content. + @findex eww-open-in-new-buffer @kindex M-RET The @kbd{M-@key{RET}} command (@code{eww-open-in-new-buffer}) opens the diff --git a/etc/NEWS b/etc/NEWS index 61e6e161665..7c94c3efa89 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -253,6 +253,11 @@ The interactive minibuffer prompt when invoking 'eww' now provides completions from 'eww-suggest-uris'. 'eww-suggest-uris' now includes bookmark URIs. ++++ +*** New command 'eww-copy-alternate-url'. +It copies an alternate link to the page currently visited in EWW into +the kill ring. + ** go-ts-mode +++ diff --git a/lisp/net/eww.el b/lisp/net/eww.el index 61f0f47373d..6e8bb5961a0 100644 --- a/lisp/net/eww.el +++ b/lisp/net/eww.el @@ -1086,6 +1086,7 @@ eww-mode-map "&" #'eww-browse-with-external-browser "d" #'eww-download "w" #'eww-copy-page-url + "A" #'eww-copy-alternate-url "C" #'url-cookie-list "v" #'eww-view-source "R" #'eww-readable @@ -2576,4 +2577,82 @@ eww-bookmark-jump (provide 'eww) +;;; Alternate links (RSS and Atom feeds, etc.) + +(defun eww--alternate-urls (dom &optional base) + "Return an alist of alternate links in DOM. + +Each element is a list of the form (URL TYPE TITLE) where URL is +the href attribute of the link expanded relative to BASE, TYPE is +its type attribute, and TITLE is its title attribute. If any of +these attributes is absent, the corresponding element is nil." + (let ((alternates + (seq-filter + (lambda (attrs) (string= (alist-get 'rel attrs) + "alternate")) + (mapcar #'dom-attributes (dom-by-tag dom 'link))))) + (mapcar (lambda (alternate) + (list (url-expand-file-name (alist-get 'href alternate) + base) + (alist-get 'type alternate) + (alist-get 'title alternate))) + alternates))) + +(defun eww-read-alternate-url () + "Get the URL of an alternate link of this page. + +If there is just one alternate link, return its URL. If there +are multiple alternate links, prompt for one in the minibuffer +with completion. If there are none, return nil." + (when-let ((alternates (eww--alternate-urls + (plist-get eww-data :dom) + (plist-get eww-data :url)))) + (let ((max-length + (apply #'max + (mapcar #'length + (mapcar #'car alternates)))) + (max-title + (apply #'max + (mapcar #'length + (mapcar #'caddr alternates))))) + (if (cdr alternates) + (let ((completion-extra-properties + (list :annotation-function + (lambda (feed) + (let* ((attrs (alist-get feed + alternates + nil + nil + #'string=)) + (type (car attrs)) + (title (cadr attrs))) + (concat (when title + (concat (make-string + (1+ (- max-length + (length feed))) + ?\s) + title)) + (when type + (concat + (make-string + (1+ (- max-title + (length title))) + ?\s) + "[" type "]")))))))) + (completing-read "Alternate URL: " alternates nil t)) + (caar alternates))))) + +(defun eww-copy-alternate-url () + "Copy an alternate URL of the current page into the kill ring. + +Alternate links are references that an HTML page may include to +point to its alternative representations, such as a translated +version or an RSS feed." + (interactive nil eww-mode) + (if-let ((url (eww-read-alternate-url))) + (progn + (kill-new url) + (message "Copied %s to kill ring" url)) + (user-error "No alternate links found on this page!"))) + ;;; eww.el ends here -- 2.41.0 --=-=-=--