From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Mekeor Melire Newsgroups: gmane.emacs.bugs Subject: bug#67615: [PATCH v7] Add option Info-url-alist Date: Sun, 21 Jan 2024 01:43:04 +0000 Message-ID: <87a5oz30om.fsf@posteo.de> References: <87plzmsuge.fsf@posteo.de> <87leaast8s.fsf@posteo.de> <87sf4ii8oi.fsf@posteo.de> <87o7f6hsfj.fsf@posteo.de> <87y1e5tumu.fsf@posteo.de> <83fs0byanf.fsf@gnu.org> <87y1e3ei0t.fsf@posteo.de> <878r5pzsxy.fsf@posteo.de> <83bkahdyjy.fsf@gnu.org> <87sf37v5fi.fsf@posteo.de> <83a5p9h87s.fsf@gnu.org> <87edec3jcl.fsf@posteo.de> <835xzov57b.fsf@gnu.org> 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="14859"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Eli Zaretskii To: 67615@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sun Jan 21 03:01:40 2024 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 1rRN9Y-0003hy-4L for geb-bug-gnu-emacs@m.gmane-mx.org; Sun, 21 Jan 2024 03:01:40 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rRN97-0002vb-8L; Sat, 20 Jan 2024 21:01:13 -0500 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 1rRN8w-0002tv-LQ for bug-gnu-emacs@gnu.org; Sat, 20 Jan 2024 21:01:03 -0500 Original-Received: from debbugs.gnu.org ([2001:470:142:5::43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1rRN8s-00033z-UP for bug-gnu-emacs@gnu.org; Sat, 20 Jan 2024 21:01:00 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1rRN8v-0002I2-S7 for bug-gnu-emacs@gnu.org; Sat, 20 Jan 2024 21:01:01 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Mekeor Melire Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sun, 21 Jan 2024 02:01:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 67615 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 67615-submit@debbugs.gnu.org id=B67615.17058024608788 (code B ref 67615); Sun, 21 Jan 2024 02:01:01 +0000 Original-Received: (at 67615) by debbugs.gnu.org; 21 Jan 2024 02:01:00 +0000 Original-Received: from localhost ([127.0.0.1]:36225 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rRN8t-0002He-Mp for submit@debbugs.gnu.org; Sat, 20 Jan 2024 21:01:00 -0500 Original-Received: from mout01.posteo.de ([185.67.36.65]:37827) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1rRN8q-0002HM-LB for 67615@debbugs.gnu.org; Sat, 20 Jan 2024 21:00:58 -0500 Original-Received: from submission (posteo.de [185.67.36.169]) by mout01.posteo.de (Postfix) with ESMTPS id CD68D240027 for <67615@debbugs.gnu.org>; Sun, 21 Jan 2024 03:00:47 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=posteo.de; s=2017; t=1705802447; bh=06em10uNRUfm4apiRhib3GbG3AtRgFCpd/ubxRdgOD4=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version:Content-Type: From; b=BrAzNRAumAnzRPJaBvHN0wcwrvlMMXKa+lrojFU6MEVzo6atgi1uxS9LVZVKYXTYH YPhiCTgRIjcN9Gddpn8KwMhALKiE+NmSt30osUbw0ITCVnFDtvJr3S8W4GGBaToE3n z0jshgqf68RXMmWfoGiQT5i+u8oCdfzHjlEWhsS7PPeGHoUN8HhaLusckpFFfqhQaJ zbsfqJ+09lzFU1HLfrYGBIdcxPqW1trZe1X3JfDJo7lG7rPOUbuzfa4tWp9jyMf5pY 2AJHZKckoY0vWkz1r9OtUUD/OjKWay2fVhfMMdScBmOQ8ouG9rB/4WfGatzwZUhrz4 OBdnXuIdJ3YMA== Original-Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4THc5B2wqnz9rxB; Sun, 21 Jan 2024 03:00:46 +0100 (CET) In-reply-to: <835xzov57b.fsf@gnu.org> 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:278636 Archived-At: --=-=-= Content-Type: text/plain 2024-01-20 09:23 eliz@gnu.org: > What about the case where the HTML docs are produced with one file per > node? doesn't Texinfo create in that case directories that are named > like the manual, but without the .html extension? I tested this and found out that Texinfo does not create directories for each node in that case. The reason why after omitting the .html-suffix gnu.org still serves the html-manual is its web-server configuration. This was confirmed to me via IRC in the #gnu channel on libera.chat server. Attached is a new version of that patch with following changes: - Let Info-url-for-node skip whitespace and newlines between closing parenthesis and node-name. This mimics Texinfo as can be traced here: https://git.savannah.gnu.org/cgit/texinfo.git/tree/info/info.h?h=114e10b2a1cb5ee07ae6b9d1228d6d016c9f86e6#n44 https://git.savannah.gnu.org/cgit/texinfo.git/tree/info/scan.c?h=114e10b2a1cb5ee07ae6b9d1228d6d016c9f86e6#n123 It also makes Info-url-for-node work with the string that is put into kill-ring with the Info-copy-current-node-name command which uses a whitespace. - Do not use a .html suffix, neither in the default value for the new Info-url-alist, nor in the %e format-thing that can be in user-defined values of it. Users still can add a ".html" suffix themselves, if the respective web-server does not support omitting it. - More tests, including manuals in all relevant directories and formats and "special" characters. --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Add-option-Info-url-alist.patch >From 856ea96868c54af8649cd604b5f92cf5cab4ca3c Mon Sep 17 00:00:00 2001 From: Mekeor Melire Date: Mon, 4 Dec 2023 16:37:37 +0100 Subject: [PATCH] Add option Info-url-alist * lisp/info.el (Info-url-alist): New option mapping manuals to URLs. (Info-url-for-node): Use it. * test/lisp/info-tests.el (test-info-urls): Add more tests. In particular, Info-url-for-node should error when manual-name is not handled in Info-url-alist. * etc/NEWS: Announce the change. --- etc/NEWS | 9 ++++ lisp/info.el | 108 ++++++++++++++++++++++++++++++++-------- test/lisp/info-tests.el | 14 ++++-- 3 files changed, 105 insertions(+), 26 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index a6b0beb6ee5..f0540df95f7 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -402,6 +402,15 @@ respectively, in addition to the existing translations 'C-x 8 / e' and * Changes in Specialized Modes and Packages in Emacs 30.1 +** Info + +--- +*** New user option 'Info-url-alist'. +This user option associates manual-names with URLs. It affects the +'Info-goto-node-web' command. By default, associations for all +Emacs-included manuals are set. Further associations can be added for +arbitrary Info manuals. + +++ ** New command 'lldb'. Run the LLDB debugger, analogous to the 'gud-gdb' command. diff --git a/lisp/info.el b/lisp/info.el index 39ca88c358c..4b3df1b98a1 100644 --- a/lisp/info.el +++ b/lisp/info.el @@ -213,6 +213,53 @@ Info-additional-directory-list These directories are searched after those in `Info-directory-list'." :type '(repeat directory)) +(defcustom Info-url-alist + '((("auth" "autotype" "bovine" "calc" "ccmode" "cl" "dbus" "dired-x" + "ebrowse" "ede" "ediff" "edt" "efaq" "efaq-w32" "eglot" "eieio" + "eintr" "elisp" "emacs" "emacs-gnutls" "emacs-mime" "epa" "erc" + "ert" "eshell" "eudc" "eww" "flymake" "forms" "gnus" + "htmlfontify" "idlwave" "ido" "info" "mairix-el" "message" + "mh-e" "modus-themes" "newsticker" "nxml-mode" "octave-mode" + "org" "pcl-cvs" "pgg" "rcirc" "reftex" "remember" "sasl" "sc" + "semantic" "ses" "sieve" "smtpmail" "speedbar" "srecode" + "todo-mode" "tramp" "transient" "url" "use-package" "vhdl-mode" + "vip" "viper" "vtable" "widget" "wisent" "woman") . + "https://www.gnu.org/software/emacs/manual/html_node/%m/%e")) + "Alist telling `Info-mode' where manuals are accessible online. + +Each element of this list has the form (MANUALs . URL-SPEC). +MANUALs represents the name of one or more manuals. It can +either be a string or a list of strings. URL-SPEC can be a +string in which the substring \"%m\" will be expanded to the +manual-name, \"%n\" to the node-name, and \"%e\" to the +URL-encoded node-name (without a `.html' suffix). (The +URL-encoding of the node-name mimics GNU Texinfo, as documented +at Info node `(texinfo)HTML Xref Node Name Expansion'.) +Alternatively, URL-SPEC can be a function which is given +manual-name, node-name and URL-encoded node-name as arguments, +and is expected to return the corresponding URL as a string. + +This variable particularly affects the command +`Info-goto-node-web', which see. + +The default value of this variable refers to the official, +HTTPS-accessible HTML-representations of all manuals that Emacs +includes. These URLs refer to the most recently released version +of Emacs, disregarding the version of the running Emacs. In +other words, the content of your local Info node and the +associated online node may differ. The resource represented by +the generated URL may even be not found by the gnu.org server." + :version "30.1" + :type '(alist + :tag "Mapping from manual-name(s) to URL-specification" + :key-type (choice + (string :tag "A single manual-name") + (repeat :tag "List of manual-names" string)) + :value-type (choice + (string :tag "URL-specification string") + (function + :tag "URL-specification function")))) + (defcustom Info-scroll-prefer-subnodes nil "If non-nil, \\\\[Info-scroll-up] in a menu visits subnodes. @@ -1807,33 +1854,50 @@ Info-goto-node-web (Info-url-for-node (format "(%s)%s" filename node))))) (defun Info-url-for-node (node) - "Return a URL for NODE, a node in the GNU Emacs or Elisp manual. -NODE should be a string on the form \"(manual)Node\". Only emacs -and elisp manuals are supported." - (unless (string-match "\\`(\\(.+\\))\\(.+\\)\\'" node) - (error "Invalid node name %s" node)) - (let ((manual (match-string 1 node)) - (node (match-string 2 node))) - (unless (member manual '("emacs" "elisp")) - (error "Only emacs/elisp manuals are supported")) - ;; Encode a bunch of characters the way that makeinfo does. - (setq node - (mapconcat (lambda (ch) - (if (or (< ch 32) ; ^@^A-^Z^[^\^]^^^- + "Return the URL corresponding to NODE. + +NODE should be a string of the form \"(manual)Node\"." + ;; GNU Texinfo skips whitespaces and newlines between the closing + ;; parenthesis and the node-name, i.e. space, tab, line feed and + ;; carriage return. + (unless (string-match "\\`(\\(.+\\))[ \t\n\r]*\\(.+\\)\\'" node) + (error "Invalid node-name %s" node)) + ;; Use `if-let*' instead of `let*' so we check if an association was + ;; found. + (if-let* ((manual (match-string 1 node)) + (node (match-string 2 node)) + (association (seq-find + (lambda (pair) + (seq-contains-p (ensure-list (car pair)) + manual #'string-equal-ignore-case)) + Info-url-alist)) + (url-spec (cdr association)) + (encoded-node + ;; Reproduce GNU Texinfo's way of URL-encoding. + ;; (info "(texinfo) HTML Xref Node Name Expansion") + (if (equal node "Top") + "" + (url-hexify-string + (string-replace " " "-" + (mapconcat + (lambda (ch) + (if (or (< ch 32) ; ^@^A-^Z^[^\^]^^^- (<= 33 ch 47) ; !"#$%&'()*+,-./ (<= 58 ch 64) ; :;<=>?@ (<= 91 ch 96) ; [\]_` (<= 123 ch 127)) ; {|}~ DEL (format "_00%x" ch) - (char-to-string ch))) - node - "")) - (concat "https://www.gnu.org/software/emacs/manual/html_node/" - manual "/" - (and (not (equal node "Top")) - (concat - (url-hexify-string (string-replace " " "-" node)) - ".html"))))) + (char-to-string ch))) + node "")))))) + (cond + ((stringp url-spec) + (format-spec url-spec + `((?m . ,manual) (?n . ,node) (?e . ,encoded-node)))) + ((functionp url-spec) + (funcall url-spec manual node encoded-node)) + (t (error "URL-specification neither string nor function"))) + (error "No URL-specification associated with manual-name `%s'" + manual))) (defvar Info-read-node-completion-table) diff --git a/test/lisp/info-tests.el b/test/lisp/info-tests.el index ebe718167bf..0dfdbf417e8 100644 --- a/test/lisp/info-tests.el +++ b/test/lisp/info-tests.el @@ -29,11 +29,17 @@ (ert-deftest test-info-urls () (should (equal (Info-url-for-node "(emacs)Minibuffer") - "https://www.gnu.org/software/emacs/manual/html_node/emacs/Minibuffer.html")) + "https://www.gnu.org/software/emacs/manual/html_node/emacs/Minibuffer")) (should (equal (Info-url-for-node "(emacs)Minibuffer File") - "https://www.gnu.org/software/emacs/manual/html_node/emacs/Minibuffer-File.html")) + "https://www.gnu.org/software/emacs/manual/html_node/emacs/Minibuffer-File")) (should (equal (Info-url-for-node "(elisp)Backups and Auto-Saving") - "https://www.gnu.org/software/emacs/manual/html_node/elisp/Backups-and-Auto_002dSaving.html")) - (should-error (Info-url-for-node "(gnus)Minibuffer File"))) + "https://www.gnu.org/software/emacs/manual/html_node/elisp/Backups-and-Auto_002dSaving")) + (should (equal (Info-url-for-node "(eintr)car & cdr") + "https://www.gnu.org/software/emacs/manual/html_node/eintr/car-_0026-cdr")) + (should (equal (Info-url-for-node "(emacs-mime)\tIndex") + "https://www.gnu.org/software/emacs/manual/html_node/emacs-mime/Index")) + (should (equal (Info-url-for-node "(gnus) Don't Panic") + "https://www.gnu.org/software/emacs/manual/html_node/gnus/Don_0027t-Panic")) + (should-error (Info-url-for-node "(nonexistent)Example"))) ;;; info-tests.el ends here -- 2.41.0 --=-=-=--