unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#67615: [PATCH] * lisp/info.el (Info-url-for-node): Support all Emacs info manuals.
@ 2023-12-04  0:04 Mekeor Melire
  2023-12-04  0:30 ` Mekeor Melire
  0 siblings, 1 reply; 23+ messages in thread
From: Mekeor Melire @ 2023-12-04  0:04 UTC (permalink / raw)
  To: 67615

This is my first patch to Emacs. I probably made some mistakes regarding the many conventions. I tried my best, including regarding the code formatting. Also, I hope that my mail client is configured well and formats the patch well. Last but not least, note that my FSF-copyright-assignment is still ongoing.
---
 ChangeLog.4  |   7 ++++
 etc/NEWS     |   8 ++++
 lisp/info.el | 101 
 ++++++++++++++++++++++++++++++++++++++-------------
 3 files changed, 90 insertions(+), 26 deletions(-)

diff --git a/ChangeLog.4 b/ChangeLog.4
index 24afabdbbb1..6e54264a32b 100644
--- a/ChangeLog.4
+++ b/ChangeLog.4
@@ -1,3 +1,10 @@
+2023-12-03  Mekeor Melire  <mekeor@posteo.de>
+
+	Support online-browsing all Emacs-contained manuals.
+
+	* lisp/info.el (Info-urls): New defcustom that maps 
manual-names
+	to URL-specifications.
+
 2023-10-16  Po Lu  <luangruo@yahoo.com>

 	Correctly register focus events concomitant with alpha changes
diff --git a/etc/NEWS b/etc/NEWS
index 29f4e5c0b66..6b5928bd74e 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -356,6 +356,14 @@ respectively, in addition to the existing 
translations 'C-x 8 / e' and
 \f
 * Changes in Specialized Modes and Packages in Emacs 30.1

+** Info
+
+---
+*** New user option 'Info-urls'.
+Browse any online info manual, not just the 'emacs' and 'elisp'
+manuals. By default, allow browsing online info manuals of all
+Emacs-contained manuals.
+
 +++
 ** New command 'lldb'.
 Run the LLDB debugger, analogous to the 'gud-gdb' command.  Note 
 that
diff --git a/lisp/info.el b/lisp/info.el
index 51e9eb72edf..0e16ee7340c 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -213,6 +213,45 @@ Info-additional-directory-list
 These directories are searched after those in 
 `Info-directory-list'."
   :type '(repeat directory))

+(defcustom Info-urls
+  '((("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" "gawk" 
"gnus"
+       "htmlfontify" "idlwave" "ido" "info" "mairix" "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/%n.html"))
+  "Alist telling `Info-mode' where manuals are accessible online.
+
+Each element of this list should match the pattern (MANUALS
+. URL-SPEC).  MANUALS represents the name of one or many
+manuals. It should either be a string or a list of
+strings. URL-SPEC should be a string in which the substring
+\"%m\" will be expanded to the manual-name, and \"%n\" to the
+URL-encoded node-name. This URL-encoding of the node-name matches
+Texinfo's HTML cross-reference node name
+expansion. Alternatively, URL-SPEC can be the symbol of a
+function receiving the manual-name, the node-name and the
+URL-encoded node-name as arguments, returning a URL as string.
+
+The default value of this variable refers to the HTTP-accessible
+HTML-manuals of all manuals that Emacs includes. Specifically,
+the URL refers to the latest version of Emacs, disregarding the
+locally installed version."
+  :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-item
+                           :tag "URL-specification function"))))
+
 (defcustom Info-scroll-prefer-subnodes nil
   "If non-nil, \\<Info-mode-map>\\[Info-scroll-up] in a menu 
   visits subnodes.

@@ -1807,33 +1846,43 @@ 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."
+  "Return a URL for NODE. NODE should be a string of the form
+\"(manual)Node\"."
   (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^[^\^]^^^-
-                               (<= 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")))))
+    (error "Invalid node-name %s" node))
+  (if-let* ((manual (match-string 1 node))
+             (node (match-string 2 node))
+             (matched-pair (seq-find
+                             (lambda (pair)
+                               (seq-contains (ensure-list (car 
pair))
+                                 manual 
#'string-equal-ignore-case))
+                             Info-urls)))
+    (if-let* ((encoded-node
+                ;; Reproduce GNU Texinfo's way of URL-encoding.
+                ;; (info "(texinfo) HTML Xref Node Name 
Expansion")
+                (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
+                      ""))))
+               (url-spec (cdr matched-pair))
+               (url-spec (cond
+                           ((functionp url-spec)
+                             (funcall url-spec
+                               manual node encoded-node))
+                           ((stringp url-spec) url-spec))))
+      (format-spec url-spec `((?m . ,manual) (?n . 
,encoded-node)))
+      (error "`Info-urls' associates an invalid URL-specification 
with manual-name \"%s\"."
+        manual))
+    (error "`Info-urls' does not associate any URL-specification 
with manual-name \"%s\"."
+      manual)))

 (defvar Info-read-node-completion-table)

--
2.41.0





^ permalink raw reply related	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH] * lisp/info.el (Info-url-for-node): Support all Emacs info manuals.
  2023-12-04  0:04 bug#67615: [PATCH] * lisp/info.el (Info-url-for-node): Support all Emacs info manuals Mekeor Melire
@ 2023-12-04  0:30 ` Mekeor Melire
  2023-12-04 10:02   ` bug#67615: [PATCH v2] " Mekeor Melire
  0 siblings, 1 reply; 23+ messages in thread
From: Mekeor Melire @ 2023-12-04  0:30 UTC (permalink / raw)
  To: 67615

2023-12-04 00:04 mekeor@posteo.de:

> I hope that my mail client is configured well and formats the 
> patch well.

Apparently, format=flowed is a bad idea for Git patches. Sorry. I'll resend soon.





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v2] * lisp/info.el (Info-url-for-node): Support all Emacs info manuals.
  2023-12-04  0:30 ` Mekeor Melire
@ 2023-12-04 10:02   ` Mekeor Melire
  2023-12-04 15:51     ` Mekeor Melire
  0 siblings, 1 reply; 23+ messages in thread
From: Mekeor Melire @ 2023-12-04 10:02 UTC (permalink / raw)
  To: Mekeor Melire; +Cc: 67615

[-- Attachment #1: Type: text/plain, Size: 139 bytes --]

Here's another attempt to send my patch; this time, without
format=flowed. I hope it works now. In any case, sorry for the
inconvenience.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-lisp-info.el-Info-url-for-node-Support-all-Emacs-inf.patch --]
[-- Type: text/x-patch, Size: 7279 bytes --]

From 2f91e43aadaa6d23df4df9c676e19de27cad6404 Mon Sep 17 00:00:00 2001
From: user <>
Date: Mon, 4 Dec 2023 00:47:00 +0100
Subject: [PATCH] * lisp/info.el (Info-url-for-node): Support all Emacs info
 manuals.

---
 ChangeLog.4  |   7 ++++
 etc/NEWS     |   8 ++++
 lisp/info.el | 101 ++++++++++++++++++++++++++++++++++++++-------------
 3 files changed, 90 insertions(+), 26 deletions(-)

diff --git a/ChangeLog.4 b/ChangeLog.4
index 24afabdbbb1..6e54264a32b 100644
--- a/ChangeLog.4
+++ b/ChangeLog.4
@@ -1,3 +1,10 @@
+2023-12-03  Mekeor Melire  <mekeor@posteo.de>
+
+	Support online-browsing all Emacs-contained manuals.
+
+	* lisp/info.el (Info-urls): New defcustom that maps manual-names
+	to URL-specifications.
+
 2023-10-16  Po Lu  <luangruo@yahoo.com>
 
 	Correctly register focus events concomitant with alpha changes
diff --git a/etc/NEWS b/etc/NEWS
index 29f4e5c0b66..6b5928bd74e 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -356,6 +356,14 @@ respectively, in addition to the existing translations 'C-x 8 / e' and
 \f
 * Changes in Specialized Modes and Packages in Emacs 30.1
 
+** Info
+
+---
+*** New user option 'Info-urls'.
+Browse any online info manual, not just the 'emacs' and 'elisp'
+manuals. By default, allow browsing online info manuals of all
+Emacs-contained manuals.
+
 +++
 ** New command 'lldb'.
 Run the LLDB debugger, analogous to the 'gud-gdb' command.  Note that
diff --git a/lisp/info.el b/lisp/info.el
index 51e9eb72edf..0e16ee7340c 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -213,6 +213,45 @@ Info-additional-directory-list
 These directories are searched after those in `Info-directory-list'."
   :type '(repeat directory))
 
+(defcustom Info-urls
+  '((("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" "gawk" "gnus"
+       "htmlfontify" "idlwave" "ido" "info" "mairix" "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/%n.html"))
+  "Alist telling `Info-mode' where manuals are accessible online.
+
+Each element of this list should match the pattern (MANUALS
+. URL-SPEC).  MANUALS represents the name of one or many
+manuals. It should either be a string or a list of
+strings. URL-SPEC should be a string in which the substring
+\"%m\" will be expanded to the manual-name, and \"%n\" to the
+URL-encoded node-name. This URL-encoding of the node-name matches
+Texinfo's HTML cross-reference node name
+expansion. Alternatively, URL-SPEC can be the symbol of a
+function receiving the manual-name, the node-name and the
+URL-encoded node-name as arguments, returning a URL as string.
+
+The default value of this variable refers to the HTTP-accessible
+HTML-manuals of all manuals that Emacs includes. Specifically,
+the URL refers to the latest version of Emacs, disregarding the
+locally installed version."
+  :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-item
+                           :tag "URL-specification function"))))
+
 (defcustom Info-scroll-prefer-subnodes nil
   "If non-nil, \\<Info-mode-map>\\[Info-scroll-up] in a menu visits subnodes.
 
@@ -1807,33 +1846,43 @@ 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."
+  "Return a URL for NODE. NODE should be a string of the form
+\"(manual)Node\"."
   (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^[^\^]^^^-
-                               (<= 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")))))
+    (error "Invalid node-name %s" node))
+  (if-let* ((manual (match-string 1 node))
+             (node (match-string 2 node))
+             (matched-pair (seq-find
+                             (lambda (pair)
+                               (seq-contains (ensure-list (car pair))
+                                 manual #'string-equal-ignore-case))
+                             Info-urls)))
+    (if-let* ((encoded-node
+                ;; Reproduce GNU Texinfo's way of URL-encoding.
+                ;; (info "(texinfo) HTML Xref Node Name Expansion")
+                (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
+                      ""))))
+               (url-spec (cdr matched-pair))
+               (url-spec (cond
+                           ((functionp url-spec)
+                             (funcall url-spec
+                               manual node encoded-node))
+                           ((stringp url-spec) url-spec))))
+      (format-spec url-spec `((?m . ,manual) (?n . ,encoded-node)))
+      (error "`Info-urls' associates an invalid URL-specification with manual-name \"%s\"."
+        manual))
+    (error "`Info-urls' does not associate any URL-specification with manual-name \"%s\"."
+      manual)))
 
 (defvar Info-read-node-completion-table)
 
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v2] * lisp/info.el (Info-url-for-node): Support all Emacs info manuals.
  2023-12-04 10:02   ` bug#67615: [PATCH v2] " Mekeor Melire
@ 2023-12-04 15:51     ` Mekeor Melire
  2023-12-04 16:24       ` Eli Zaretskii
                         ` (2 more replies)
  0 siblings, 3 replies; 23+ messages in thread
From: Mekeor Melire @ 2023-12-04 15:51 UTC (permalink / raw)
  To: 67615

Please do not yet commit this patch. There are some TODOs left:

- Remove "gawk" and "mairix" manual-names from default value of
  Info-urls since they response with HTTP status "not found".
- Check if there are more Emacs-included manuals, perhaps ones that are
  not "one page per node".
- Improve and revisit NEWS, CHANGELOG and commit message.
- Adhere to fill-column.
- FSF copyright assignment.

Also I have some questions:

- What do you think about the naming of the Info-urls variable?
- Is the position of the definition of Info-urls fine?





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v2] * lisp/info.el (Info-url-for-node): Support all Emacs info manuals.
  2023-12-04 15:51     ` Mekeor Melire
@ 2023-12-04 16:24       ` Eli Zaretskii
  2023-12-05  1:06         ` bug#67615: Org-Mode story on how I gathered the list of Emacs-contained online-manuals Mekeor Melire
  2023-12-07  2:48       ` bug#67615: [PATCH v2] * lisp/info.el (Info-url-for-node): Support all Emacs info manuals Richard Stallman
  2023-12-08  0:15       ` bug#67615: [PATCH v3] * lisp/info.el (Info-url-alist): New option mapping manuals to URLs Mekeor Melire
  2 siblings, 1 reply; 23+ messages in thread
From: Eli Zaretskii @ 2023-12-04 16:24 UTC (permalink / raw)
  To: Mekeor Melire; +Cc: 67615

> From: Mekeor Melire <mekeor@posteo.de>
> Date: Mon, 04 Dec 2023 15:51:32 +0000
> 
> Please do not yet commit this patch. There are some TODOs left:
> 
> - Remove "gawk" and "mairix" manual-names from default value of

Gawk and mairix are not parts of Emacs, they are separately-maintained
programs.  So their manuals cannot be reached via the common base of
the Emacs manuals, and therefore they should not be in that list,
indeed.

>   Info-urls since they response with HTTP status "not found".
> - Check if there are more Emacs-included manuals, perhaps ones that are
>   not "one page per node".
> - Improve and revisit NEWS, CHANGELOG and commit message.
> - Adhere to fill-column.
> - FSF copyright assignment.
> 
> Also I have some questions:
> 
> - What do you think about the naming of the Info-urls variable?
> - Is the position of the definition of Info-urls fine?

I will review the patch in a couple of days, so if you have more
changes, please feel free to post updated patches.  There's no rush.





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#67615: Org-Mode story on how I gathered the list of Emacs-contained online-manuals
  2023-12-04 16:24       ` Eli Zaretskii
@ 2023-12-05  1:06         ` Mekeor Melire
  0 siblings, 0 replies; 23+ messages in thread
From: Mekeor Melire @ 2023-12-05  1:06 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 67615

[-- Attachment #1: Type: text/plain, Size: 994 bytes --]

2023-12-04 18:24 eliz@gnu.org:

> > From: Mekeor Melire <mekeor@posteo.de>
> > Date: Mon, 04 Dec 2023 15:51:32 +0000
> >
> > - Remove "gawk" and "mairix" manual-names from default value of
>
> Gawk and mairix are not parts of Emacs, they are separately-maintained
> programs.  So their manuals cannot be reached via the common base of
> the Emacs manuals, and therefore they should not be in that list,
> indeed.

For Gawk, my heuristics for gathering the list of manuals failed for an
unknown reason.

For mairix, it's "mairix" in
https://www.gnu.org/software/emacs/manual/mairix.html but "mairix-el" in
https://www.gnu.org/software/emacs/manual/html_node/mairix-el/index.html
but I don't know why. That's why my heuristics failed here too. But
yeah, "mairix-el" is the right one.

To ensure a complete list, I revisited my heuristics and wrote a little
story with Org Mode how I gathered the list of Emacs-included
online-manuals. Anyone who's really interested, can read the attachment.
:D


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: story.org --]
[-- Type: text/x-org, Size: 6306 bytes --]

* Sources

Let's gather a list of Emacs-included manuals from different sources.

** Included of Guix-installed Emacs

Gather a list of manuals that an Guix-installed Emacs includes:

#+begin_src sh :results raw :wrap
for f in $(find $(guix package -I | grep emacs-next | cut -f 4)/share/info -type f); do
    basename $f | cut -d . -f 1
done | sort
#+end_src

#+NAME: from_guix
#+results:
#+begin_results
auth
autotype
bovine
calc
ccmode
cl
dbus
dired-x
ebrowse
ede
ediff
edt
efaq
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
#+end_results
rcirc
vtable
vhdl-mode
ses
ido
mh-e
ccmode
efaq
info
sieve
emacs-gnutls
mairix-el
calc
widget
message
transient
cl
forms
autotype
htmlfontify
elisp
pgg
ebrowse
wisent
auth
newsticker
pcl-cvs
erc
sc
org
nxml-mode
remember
ediff
vip
dired-x
bovine
emacs-mime
epa
edt
semantic
eshell
use-package
gnus
viper
ert
speedbar
srecode
eww
woman
idlwave
eudc
todo-mode
dbus
eieio
eintr
ede
eglot
modus-themes
octave-mode
url
flymake
smtpmail
emacs
sasl
reftex
tramp

** Mentioned on gnu.org

Gather a list of Emacs-included manuals by parsing https://www.gnu.org/software/emacs/manual/.

#+begin_src elisp
(string-join
  (sort
    (seq-map #'cadr
      (s-match-strings-all "href=\"\\([a-zA-Z0-9_-]+\\)\.html"
        (plz 'get "https://www.gnu.org/software/emacs/manual/")))
    #'string<)
  "\n")
#+end_src

#+NAME: from_gnu_org
#+RESULTS:
#+begin_example
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
epa
erc
ert
eshell
eudc
eww
flymake
forms
gnus
htmlfontify
idlwave
ido
info
mairix
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
#+end_example

** Checked into emacs repository

Gather a list of Emacs-included manuals from Emacs' repository; from a local clone in particular.

#+begin_src sh :results raw :wrap
find ~/store/host/permanent/git/foreign/emacs/doc/misc/ -type f -iname '*.texi' -exec basename \{\} .texi \; | sort
#+end_src

#+NAME: from_repo
#+RESULTS:
#+begin_results
auth
autotype
bovine
calc
cc-mode
cl
dbus
dired-x
doclicense
ebrowse
ede
ediff
edt
efaq
efaq-w32
eglot
eieio
emacs-gnutls
emacs-mime
epa
erc
ert
eshell
eudc
eww
flymake
forms
gnus
gnus-faq
gpl
htmlfontify
idlwave
ido
info
mairix-el
message
mh-e
newsticker
nxml-mode
octave-mode
pcl-cvs
pgg
rcirc
reftex
remember
sasl
sc
semantic
sem-user
ses
sieve
smtpmail
speedbar
srecode
todo-mode
tramp
trampver
transient
url
use-package
vhdl-mode
vip
viper
vtable
widget
wisent
woman
#+end_results

* Merge manual-lists from all sources

Merge all sources; make sure each manual-name is unique.

#+begin_src sh :var from_guix=from_guix :var from_gnu_org=from_gnu_org :var from_repo=from_repo :results raw :wrap
for m in $from_guix $from_gnu_org $from_repo; do
    echo $m
done | sort | uniq
#+end_src

#+NAME: merged
#+RESULTS:
#+begin_results
auth
autotype
bovine
calc
cc-mode
ccmode
cl
dbus
dired-x
doclicense
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
gnus-faq
gpl
htmlfontify
idlwave
ido
info
mairix
mairix-el
message
mh-e
modus-themes
newsticker
nxml-mode
octave-mode
org
pcl-cvs
pgg
rcirc
reftex
remember
sasl
sc
semantic
sem-user
ses
sieve
smtpmail
speedbar
srecode
todo-mode
tramp
trampver
transient
url
use-package
vhdl-mode
vip
viper
vtable
widget
wisent
woman
#+end_results

* Check online availability of each manual

** Filter manuals with "one page per node" online-manuals

#+begin_src sh :var manuals=merged :results raw :wrap
for m in $manuals; do
    if [ 200 = "$(curl -s -i https://www.gnu.org/software/emacs/manual/html_node/$m/index.html | head -n 1 | cut -d ' ' -f 2)" ]; then
        echo $m;
    fi
done
#+end_src

#+NAME: available_per_node
#+RESULTS:
#+begin_results
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
#+end_results

** Filter manuals with "entirely on one page" online-manuals

Find out if there are manuals that do not have a "one page per node" online-manual, but have only a "entirely on one page" online-manual. It could be!

First, determine those manuals without "one page per node" online-manuals:

#+begin_src sh :var merged=merged :var available_per_node=available_per_node :results raw :wrap
for m in $merged $available_per_node; do echo $m; done | sort | uniq -c | grep ' 1 ' | rev | cut -d ' ' -f 1 | rev
#+end_src

#+NAME: not_available_per_node
#+RESULTS:
#+begin_results
cc-mode
doclicense
gnus-faq
gpl
mairix
sem-user
trampver
#+end_results

Well, these manuals are known to not exist because of following reasons:

- cc-mode:    It's =cc-mode.texi= but =ccmode.info=: https://git.sv.gnu.org/cgit/emacs.git/tree/doc/misc/cc-mode.texi?h=88a6209a7f881b6cab5f1fd9761f1b8ae7cad6fa#n84
- doclicense: Only used via ~@include ....texi~
- gnus-faq:   Only used via ~@include ....texi~
- gpl:        Only used via ~@include ....texi~
- mairix:     It's "mairix" in https://www.gnu.org/software/emacs/manual/mairix.html but "mairix-el" in https://www.gnu.org/software/emacs/manual/html_node/mairix-el/index.html
- sem-user:   Only used via ~@include ....texi~
- trampver:   Only used via ~@include ....texi~

Thus, there is no (online-)manual for these texi-files, particularly no "entirely on one page" online-manual.

* Conclusion

See results named =available_per_node= for list of all Emacs-included online manuals.

^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v2] * lisp/info.el (Info-url-for-node): Support all Emacs info manuals.
  2023-12-04 15:51     ` Mekeor Melire
  2023-12-04 16:24       ` Eli Zaretskii
@ 2023-12-07  2:48       ` Richard Stallman
  2023-12-07  7:19         ` Eli Zaretskii
  2023-12-08  0:15       ` bug#67615: [PATCH v3] * lisp/info.el (Info-url-alist): New option mapping manuals to URLs Mekeor Melire
  2 siblings, 1 reply; 23+ messages in thread
From: Richard Stallman @ 2023-12-07  2:48 UTC (permalink / raw)
  To: Mekeor Melire; +Cc: 67615

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > - Remove "gawk" and "mairix" manual-names from default value of
  >   Info-urls since they response with HTTP status "not found".

What is the intended meaning of Info-urls?  What is the criterion for
what to include, and what is the reason for choosing that criterion?

I ask becaise Gawk is a GNU package.  It is reasonable, as a matter of
general principle, for Emacs to refer people to GAWK and its
documentation.

Whether it is useful to do so _in this specific case_, I don't have an
opinion about, because I don't know ebough about this specific case.

-- 
Dr Richard Stallman (https://stallman.org)
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)







^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v2] * lisp/info.el (Info-url-for-node): Support all Emacs info manuals.
  2023-12-07  2:48       ` bug#67615: [PATCH v2] * lisp/info.el (Info-url-for-node): Support all Emacs info manuals Richard Stallman
@ 2023-12-07  7:19         ` Eli Zaretskii
  2023-12-07 11:56           ` Mekeor Melire
  0 siblings, 1 reply; 23+ messages in thread
From: Eli Zaretskii @ 2023-12-07  7:19 UTC (permalink / raw)
  To: rms; +Cc: mekeor, 67615

> Cc: 67615@debbugs.gnu.org
> From: Richard Stallman <rms@gnu.org>
> Date: Wed, 06 Dec 2023 21:48:52 -0500
> 
>   > - Remove "gawk" and "mairix" manual-names from default value of
>   >   Info-urls since they response with HTTP status "not found".
> 
> What is the intended meaning of Info-urls?  What is the criterion for
> what to include, and what is the reason for choosing that criterion?
> 
> I ask becaise Gawk is a GNU package.  It is reasonable, as a matter of
> general principle, for Emacs to refer people to GAWK and its
> documentation.

We decided first to support manuals that come with Emacs, and Gawk's
manual doesn't.

Supporting all GNU manuals is a much larger job, since there's no
single base URL from which they all can be reached (although many of
them can be reached from the GNU site).  Also, the arrangement of the
manuals of the other packages is slightly different from that of
Emacs, which needs more specialized processing.

So I think for now it should be enough to have only the Emacs manuals
by default, and let users add more associations for other packages if
they like.





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v2] * lisp/info.el (Info-url-for-node): Support all Emacs info manuals.
  2023-12-07  7:19         ` Eli Zaretskii
@ 2023-12-07 11:56           ` Mekeor Melire
  2023-12-07 17:02             ` Eli Zaretskii
  0 siblings, 1 reply; 23+ messages in thread
From: Mekeor Melire @ 2023-12-07 11:56 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 67615, rms

2023-12-07 09:19 eliz@gnu.org:

> We decided first to support manuals that come with Emacs, and Gawk's
> manual doesn't.
>
> Supporting all GNU manuals is a much larger job, since there's no
> single base URL from which they all can be reached (although many of
> them can be reached from the GNU site).  Also, the arrangement of the
> manuals of the other packages is slightly different from that of
> Emacs, which needs more specialized processing.

It would be of great help if the administrators of gnu.org could provide
a strict pattern for online-manual-URLs on gnu.org. Additionally, it'd
be nice if gnu.org would not only provide the manual for the latest
version of GNU packages, but also for prior versions. This would allow
Emacs' info.el to browse the version-matching online-manual
corresponding to the locally-installed, currently-read Emacs-included
manual. But all of this needs to be discussed on another mailing-list,
related to the administration of gnu.org.

> So I think for now it should be enough to have only the Emacs manuals
> by default, and let users add more associations for other packages if
> they like.

By the way, I'm planning to release a FSF-assigned Emacs-package
providing more associations.





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v2] * lisp/info.el (Info-url-for-node): Support all Emacs info manuals.
  2023-12-07 11:56           ` Mekeor Melire
@ 2023-12-07 17:02             ` Eli Zaretskii
  2023-12-09  4:05               ` Richard Stallman
  0 siblings, 1 reply; 23+ messages in thread
From: Eli Zaretskii @ 2023-12-07 17:02 UTC (permalink / raw)
  To: Mekeor Melire; +Cc: 67615, rms

> From: Mekeor Melire <mekeor@posteo.de>
> Cc: rms@gnu.org, 67615@debbugs.gnu.org
> Date: Thu, 07 Dec 2023 11:56:34 +0000
> 
> 2023-12-07 09:19 eliz@gnu.org:
> 
> > We decided first to support manuals that come with Emacs, and Gawk's
> > manual doesn't.
> >
> > Supporting all GNU manuals is a much larger job, since there's no
> > single base URL from which they all can be reached (although many of
> > them can be reached from the GNU site).  Also, the arrangement of the
> > manuals of the other packages is slightly different from that of
> > Emacs, which needs more specialized processing.
> 
> It would be of great help if the administrators of gnu.org could provide
> a strict pattern for online-manual-URLs on gnu.org. Additionally, it'd
> be nice if gnu.org would not only provide the manual for the latest
> version of GNU packages, but also for prior versions. This would allow
> Emacs' info.el to browse the version-matching online-manual
> corresponding to the locally-installed, currently-read Emacs-included
> manual. But all of this needs to be discussed on another mailing-list,
> related to the administration of gnu.org.

I think each GNU project uses slightly different arrangements.  Also,
how exactly the HTML manuals are arranged on gnu.org is up to the
projects, not gnu.org admmins (which just provide technical support).
In any case, this is not the right place to talk about GNU-wide
conventions and decisions.

> > So I think for now it should be enough to have only the Emacs manuals
> > by default, and let users add more associations for other packages if
> > they like.
> 
> By the way, I'm planning to release a FSF-assigned Emacs-package
> providing more associations.

That is okay, but one problem with such associations is the need to
maintain them so they remain accurate, tracking whatever changes in
other GNU projects that could affect this.  This is one reason I
suggested that we stop short of doing that, and only limit ourselves
to the manuals which we control.





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v3] * lisp/info.el (Info-url-alist): New option mapping manuals to URLs.
  2023-12-04 15:51     ` Mekeor Melire
  2023-12-04 16:24       ` Eli Zaretskii
  2023-12-07  2:48       ` bug#67615: [PATCH v2] * lisp/info.el (Info-url-for-node): Support all Emacs info manuals Richard Stallman
@ 2023-12-08  0:15       ` Mekeor Melire
  2023-12-09  9:42         ` Eli Zaretskii
  2 siblings, 1 reply; 23+ messages in thread
From: Mekeor Melire @ 2023-12-08  0:15 UTC (permalink / raw)
  To: 67615; +Cc: Eli Zaretskii

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: 0001-lisp-info.el-Info-url-alist-New-option-mapping-manua.patch --]
[-- Type: text/x-patch, Size: 7413 bytes --]

From 1e9b31174ab4cfb2edb73f23aa1a3ec86943ba42 Mon Sep 17 00:00:00 2001
From: Mekeor Melire <mekeor@posteo.de>
Date: Mon, 4 Dec 2023 16:37:37 +0100
Subject: [PATCH] * lisp/info.el (Info-url-alist): New option mapping manuals
 to URLs.

---
 ChangeLog.4  |   8 +++++
 etc/NEWS     |   9 +++++
 lisp/info.el | 100 ++++++++++++++++++++++++++++++++++++++++-----------
 3 files changed, 96 insertions(+), 21 deletions(-)

diff --git a/ChangeLog.4 b/ChangeLog.4
index 24afabdbbb1..0aabd9f52bb 100644
--- a/ChangeLog.4
+++ b/ChangeLog.4
@@ -1,3 +1,11 @@
+2023-12-08  Mekeor Melire  <mekeor@posteo.de>
+
+	Support online-browsing all Emacs-contained manuals or any other.
+
+	* lisp/info.el (Info-url-alist): New defcustom that maps
+	manual-names to URL-specifications.
+	(Info-url-for-node): Use it.
+
 2023-10-16  Po Lu  <luangruo@yahoo.com>
 
 	Correctly register focus events concomitant with alpha changes
diff --git a/etc/NEWS b/etc/NEWS
index 29f4e5c0b66..4730cc3a351 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -356,6 +356,15 @@ respectively, in addition to the existing translations 'C-x 8 / e' and
 \f
 * 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.  Note that
diff --git a/lisp/info.el b/lisp/info.el
index 51e9eb72edf..c0e342a62d6 100644
--- a/lisp/info.el
+++ b/lisp/info.el
@@ -213,6 +213,52 @@ 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 should match the pattern (MANUALS
+. URL-SPEC).  MANUALS represents the name of one or many 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 with 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 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."
+  :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-mode-map>\\[Info-scroll-up] in a menu visits subnodes.
 
@@ -1807,33 +1853,45 @@ 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."
+  "Return a URL for NODE.  NODE should be a string of the form
+\"(manual)Node\"."
   (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^[^\^]^^^-
+    (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 (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'")))
 
 (defvar Info-read-node-completion-table)
 
-- 
2.41.0






^ permalink raw reply related	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v2] * lisp/info.el (Info-url-for-node): Support all Emacs info manuals.
  2023-12-07 17:02             ` Eli Zaretskii
@ 2023-12-09  4:05               ` Richard Stallman
  0 siblings, 0 replies; 23+ messages in thread
From: Richard Stallman @ 2023-12-09  4:05 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: mekeor, 67615

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

  > I think each GNU project uses slightly different arrangements.  Also,
  > how exactly the HTML manuals are arranged on gnu.org is up to the
  > projects, not gnu.org admmins (which just provide technical support).
  > In any case, this is not the right place to talk about GNU-wide
  > conventions and decisions.

We could adopt a standard for this, if that would make it possible
to integrate finding more manuals.  I suggest people work on designing
a standard to propose, then send it to gnu-prog-discuss@gnu.org.



-- 
Dr Richard Stallman (https://stallman.org)
Chief GNUisance of the GNU Project (https://gnu.org)
Founder, Free Software Foundation (https://fsf.org)
Internet Hall-of-Famer (https://internethalloffame.org)







^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v3] * lisp/info.el (Info-url-alist): New option mapping manuals to URLs.
  2023-12-08  0:15       ` bug#67615: [PATCH v3] * lisp/info.el (Info-url-alist): New option mapping manuals to URLs Mekeor Melire
@ 2023-12-09  9:42         ` Eli Zaretskii
  2023-12-09 11:21           ` Mekeor Melire
  0 siblings, 1 reply; 23+ messages in thread
From: Eli Zaretskii @ 2023-12-09  9:42 UTC (permalink / raw)
  To: Mekeor Melire; +Cc: 67615

> From: Mekeor Melire <mekeor@posteo.de>
> Cc: Eli Zaretskii <eliz@gnu.org>
> Date: Fri, 08 Dec 2023 00:15:15 +0000
> 
> >From 1e9b31174ab4cfb2edb73f23aa1a3ec86943ba42 Mon Sep 17 00:00:00 2001
> From: Mekeor Melire <mekeor@posteo.de>
> Date: Mon, 4 Dec 2023 16:37:37 +0100
> Subject: [PATCH] * lisp/info.el (Info-url-alist): New option mapping manuals
>  to URLs.

Thanks, a few comments below.

> diff --git a/ChangeLog.4 b/ChangeLog.4
> index 24afabdbbb1..0aabd9f52bb 100644
> --- a/ChangeLog.4
> +++ b/ChangeLog.4
> @@ -1,3 +1,11 @@
> +2023-12-08  Mekeor Melire  <mekeor@posteo.de>
> +
> +	Support online-browsing all Emacs-contained manuals or any other.
> +
> +	* lisp/info.el (Info-url-alist): New defcustom that maps
> +	manual-names to URL-specifications.
> +	(Info-url-for-node): Use it.
> +

This is an auto-generated file, so no need to patch it by hand.

> +*** New user option 'Info-url-alist'.
> +This user option associates manual-names with URLs. It affects the
                                                     ^^
Our convention is to leave two spaces between sentences.

> +'Info-goto-node-web' command.  By default, associations for all
> +Emacs-included manuals are set.  Further associations can be added for
> +arbitrary info manuals.
             ^^^^
"Info", capitalized.

> +(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 should match the pattern (MANUALS
> +. URL-SPEC).

Our style is to say

  Each element of this list should have the form (MANUALs . URL-SPEC)

>               MANUALS represents the name of one or many manuals.
                                               ^^^^^^^^^^^
"one or more"

> +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 string.
                         ^^^^^^^^^
"as a string"

> +  :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"))))

Each defcustom should have the :version tag.

>  (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."
> +  "Return a URL for NODE.  NODE should be a string of the form
> +\"(manual)Node\"."

The first line of a doc string should be a single complete sentence.
This is important because apropos commands show only the first line of
each doc string.

> +  ;; use `if-let*' instead of `let*' so we check if an association was
> +  ;; found.

Comments should be preferably complete sentences, starting with a
capitalized letter and ending with a period.





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v3] * lisp/info.el (Info-url-alist): New option mapping manuals to URLs.
  2023-12-09  9:42         ` Eli Zaretskii
@ 2023-12-09 11:21           ` Mekeor Melire
  2023-12-19 23:08             ` bug#67615: [PATCH v4] " Mekeor Melire
  0 siblings, 1 reply; 23+ messages in thread
From: Mekeor Melire @ 2023-12-09 11:21 UTC (permalink / raw)
  To: 67615; +Cc: Eli Zaretskii

[-- Attachment #1: Type: text/plain, Size: 147 bytes --]

2023-12-09 11:42 eliz@gnu.org:

> Thanks, a few comments below.

Thanks for reviewing. I implemented the requested changes. Here's the
new patch:


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-lisp-info.el-Info-url-alist-New-option-mapping-manua.patch --]
[-- Type: text/x-patch, Size: 6930 bytes --]

From a30f11d1112a08a32f3da7adce37d8e09b390041 Mon Sep 17 00:00:00 2001
From: Mekeor Melire <mekeor@posteo.de>
Date: Mon, 4 Dec 2023 16:37:37 +0100
Subject: [PATCH] * lisp/info.el (Info-url-alist): New option mapping manuals
 to URLs.

---
 etc/NEWS     |   9 +++++
 lisp/info.el | 102 ++++++++++++++++++++++++++++++++++++++++-----------
 2 files changed, 90 insertions(+), 21 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index 29f4e5c0b66..cd1d3b1c060 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -356,6 +356,15 @@ respectively, in addition to the existing translations 'C-x 8 / e' and
 \f
 * 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.  Note that
diff --git a/lisp/info.el b/lisp/info.el
index 51e9eb72edf..4ee62c1e729 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 should have 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 with 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-mode-map>\\[Info-scroll-up] in a menu visits subnodes.
 
@@ -1807,33 +1854,46 @@ 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."
+  "Return the URL corresponding to NODE.
+
+NODE should be a string of the form \"(manual)Node\"."
   (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^[^\^]^^^-
+    (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 (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'")))
 
 (defvar Info-read-node-completion-table)
 
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v4] * lisp/info.el (Info-url-alist): New option mapping manuals to URLs.
  2023-12-09 11:21           ` Mekeor Melire
@ 2023-12-19 23:08             ` Mekeor Melire
  2023-12-23 10:05               ` Eli Zaretskii
  0 siblings, 1 reply; 23+ messages in thread
From: Mekeor Melire @ 2023-12-19 23:08 UTC (permalink / raw)
  To: 67615; +Cc: Eli Zaretskii

[-- Attachment #1: Type: text/plain, Size: 362 bytes --]

Hello again :)

Firstly, I'm happy to announce that my FSF-copyright-assignment is done.

Secondly, I'd like to re-share the same version of the patch from my
last e-mail. Perhaps it was forgotten, perhaps because I did not choose
a new subject line. (I did so for this e-mail.) So here it is again. I'd
appreciate a review or even a commit/merge if it's done.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-lisp-info.el-Info-url-alist-New-option-mapping-manua.patch --]
[-- Type: text/x-patch, Size: 6930 bytes --]

From a30f11d1112a08a32f3da7adce37d8e09b390041 Mon Sep 17 00:00:00 2001
From: Mekeor Melire <mekeor@posteo.de>
Date: Mon, 4 Dec 2023 16:37:37 +0100
Subject: [PATCH] * lisp/info.el (Info-url-alist): New option mapping manuals
 to URLs.

---
 etc/NEWS     |   9 +++++
 lisp/info.el | 102 ++++++++++++++++++++++++++++++++++++++++-----------
 2 files changed, 90 insertions(+), 21 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index 29f4e5c0b66..cd1d3b1c060 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -356,6 +356,15 @@ respectively, in addition to the existing translations 'C-x 8 / e' and
 \f
 * 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.  Note that
diff --git a/lisp/info.el b/lisp/info.el
index 51e9eb72edf..4ee62c1e729 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 should have 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 with 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-mode-map>\\[Info-scroll-up] in a menu visits subnodes.
 
@@ -1807,33 +1854,46 @@ 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."
+  "Return the URL corresponding to NODE.
+
+NODE should be a string of the form \"(manual)Node\"."
   (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^[^\^]^^^-
+    (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 (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'")))
 
 (defvar Info-read-node-completion-table)
 
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v4] * lisp/info.el (Info-url-alist): New option mapping manuals to URLs.
  2023-12-19 23:08             ` bug#67615: [PATCH v4] " Mekeor Melire
@ 2023-12-23 10:05               ` Eli Zaretskii
  2024-01-08 21:56                 ` bug#67615: [PATCH v5] " Mekeor Melire
  0 siblings, 1 reply; 23+ messages in thread
From: Eli Zaretskii @ 2023-12-23 10:05 UTC (permalink / raw)
  To: Mekeor Melire; +Cc: 67615

> From: Mekeor Melire <mekeor@posteo.de>
> Cc: Eli Zaretskii <eliz@gnu.org>
> Date: Tue, 19 Dec 2023 23:08:29 +0000
> 
> Secondly, I'd like to re-share the same version of the patch from my
> last e-mail. Perhaps it was forgotten, perhaps because I did not choose
> a new subject line.

It wasn't forgotten, but thanks anyway.

I have a few minor comments to this version:

> +(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 should have the form (MANUALs
> +. URL-SPEC).  MANUALS represents the name of one or more manuals.

Please reformat/refill this so that "(MANUALs . URL-SPEC)" is not
broken between two lines.

> +  (if-let* ((manual (match-string 1 node))
> +             (node (match-string 2 node))
> +             (association (seq-find
> +                            (lambda (pair)
> +                              (seq-contains (ensure-list (car pair))
                                 ^^^^^^^^^^^^^
This triggers a byte-compiler warning:

  In Info-url-for-node:
  info.el:1868:32: Warning: `seq-contains' is an obsolete function (as of 27.1); use `seq-contains-p' instead.

> +    (error "No URL-specification associated with manual-name `%s'")))

And this line triggers the following byte-compiler warning:

  info.el:1896:6: Warning: `error' called with 0 args to fill 1 format field(s)





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v5] * lisp/info.el (Info-url-alist): New option mapping manuals to URLs.
  2023-12-23 10:05               ` Eli Zaretskii
@ 2024-01-08 21:56                 ` Mekeor Melire
  2024-01-13  9:51                   ` Eli Zaretskii
  0 siblings, 1 reply; 23+ messages in thread
From: Mekeor Melire @ 2024-01-08 21:56 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 67615

[-- Attachment #1: Type: text/plain, Size: 446 bytes --]

2023-12-23 12:05 eliz@gnu.org:

> It wasn't forgotten, but thanks anyway.

> I have a few minor comments to this version

Thanks for...

- not forgetting,
- for all the patience, and
- the comments.

Attached is a new version of the patch which includes the requested
improvements:

- In a docstring, do not break line within form specification.
- Pass a previously missing argument to `error'.
- Use `seq-contains-p' instead of `seq-contains'.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-lisp-info.el-Info-url-alist-New-option-mapping-manua.patch --]
[-- Type: text/x-patch, Size: 6927 bytes --]

From 438c259a23e9f6ed6f8c3c460e6856404bfe002d Mon Sep 17 00:00:00 2001
From: Mekeor Melire <mekeor@posteo.de>
Date: Mon, 4 Dec 2023 16:37:37 +0100
Subject: [PATCH] * lisp/info.el (Info-url-alist): New option mapping manuals
 to URLs.

---
 etc/NEWS     |   9 +++++
 lisp/info.el | 103 ++++++++++++++++++++++++++++++++++++++++-----------
 2 files changed, 91 insertions(+), 21 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
 \f
 * 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..1edf663f9b3 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 with 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-mode-map>\\[Info-scroll-up] in a menu visits subnodes.
 
@@ -1807,33 +1854,47 @@ 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."
+  "Return the URL corresponding to NODE.
+
+NODE should be a string of the form \"(manual)Node\"."
   (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^[^\^]^^^-
+    (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)
 
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v5] * lisp/info.el (Info-url-alist): New option mapping manuals to URLs.
  2024-01-08 21:56                 ` bug#67615: [PATCH v5] " Mekeor Melire
@ 2024-01-13  9:51                   ` Eli Zaretskii
  2024-01-20  0:50                     ` bug#67615: [PATCH v6] Add option Info-url-alist Mekeor Melire
  0 siblings, 1 reply; 23+ messages in thread
From: Eli Zaretskii @ 2024-01-13  9:51 UTC (permalink / raw)
  To: Mekeor Melire; +Cc: 67615

> From: Mekeor Melire <mekeor@posteo.de>
> Cc: 67615@debbugs.gnu.org
> Date: Mon, 08 Jan 2024 21:56:03 +0000
> 
> > It wasn't forgotten, but thanks anyway.
> 
> > I have a few minor comments to this version
> 
> Thanks for...
> 
> - not forgetting,
> - for all the patience, and
> - the comments.
> 
> Attached is a new version of the patch which includes the requested
> improvements:
> 
> - In a docstring, do not break line within form specification.
> - Pass a previously missing argument to `error'.
> - Use `seq-contains-p' instead of `seq-contains'.

Thanks.  I was going to install this, but it causes info-tests in the
test suite to fail:

  Test test-info-urls backtrace:
    signal(ert-test-failed (((should (equal (Info-url-for-node "(emacs)M
    ert-fail(((should (equal (Info-url-for-node "(emacs)Minibuffer") "ht
    (if (unwind-protect (setq value-2 (apply fn-0 args-1)) (setq form-de
    (let (form-description-4) (if (unwind-protect (setq value-2 (apply f
    (let ((value-2 'ert-form-evaluation-aborted-3)) (let (form-descripti
    (let* ((fn-0 #'equal) (args-1 (condition-case err (list (Info-url-fo
    (closure (t) nil (let* ((fn-0 #'equal) (args-1 (condition-case err (
    #f(compiled-function () #<bytecode 0x122f3388eba94dc5>)()
    handler-bind-1(#f(compiled-function () #<bytecode 0x122f3388eba94dc5
    ert--run-test-internal(#s(ert--test-execution-info :test #s(ert-test
    ert-run-test(#s(ert-test :name test-info-urls :documentation nil :bo
    ert-run-or-rerun-test(#s(ert--stats :selector (not (or ... ...)) :te
    ert-run-tests((not (or (tag :unstable) (tag :nativecomp))) #f(compil
    ert-run-tests-batch((not (or (tag :unstable) (tag :nativecomp))))
    ert-run-tests-batch-and-exit((not (or (tag :unstable) (tag :nativeco
    eval((ert-run-tests-batch-and-exit '(not (or (tag :unstable) (tag :n
    command-line-1(("-L" ";." "-l" "ert" "-l" "lisp/info-tests.el" "--ev
    command-line()
    normal-top-level()
  Test test-info-urls condition:
      (ert-test-failed
       ((should
	 (equal (Info-url-for-node "(emacs)Minibuffer")
		"https://www.gnu.org/software/emacs/manual/html_node/emacs/Minibuffer.html"))
	:form
	(equal
	 "https://www.gnu.org/software/emacs/manual/html_node/emacs/Minibuffer"
	 "https://www.gnu.org/software/emacs/manual/html_node/emacs/Minibuffer.html")
	:value nil :explanation
	(arrays-of-different-length 68 73
				    "https://www.gnu.org/software/emacs/manual/html_node/emacs/Minibuffer"
				    "https://www.gnu.org/software/emacs/manual/html_node/emacs/Minibuffer.html"
				    first-mismatch-at 68)))
     FAILED  1/1  test-info-urls (0.187500 sec) at lisp/info-tests.el:30

If we want the result to include the "html" extension (which might not
be correct, since perhaps we could have Minibuffer.htm?), then please
update the test.  Otherwise, it sounds like the code needs some
adjustment to behave as before?

> Subject: [PATCH] * lisp/info.el (Info-url-alist): New option mapping manuals
>  to URLs.

Please also improve the commit log message to mention all the changes,
not just the new option.  See CONTRIBUTE for details, and you can use
"git log" to see many examples of how we do that.





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v6] Add option Info-url-alist
  2024-01-13  9:51                   ` Eli Zaretskii
@ 2024-01-20  0:50                     ` Mekeor Melire
  2024-01-20  1:41                       ` Orhan Kemal Yüksel
  2024-01-20  7:23                       ` Eli Zaretskii
  0 siblings, 2 replies; 23+ messages in thread
From: Mekeor Melire @ 2024-01-20  0:50 UTC (permalink / raw)
  To: 67615; +Cc: Eli Zaretskii

[-- Attachment #1: Type: text/plain, Size: 1406 bytes --]

2024-01-13 11:51 eliz@gnu.org:

> > From: Mekeor Melire <mekeor@posteo.de>
> > Cc: 67615@debbugs.gnu.org
> > Date: Mon, 08 Jan 2024 21:56:03 +0000

> I was going to install this, but it causes info-tests in the test
> suite to fail:

> If we want the result to include the "html" extension (which might not
> be correct, since perhaps we could have Minibuffer.htm?), then please
> update the test.  Otherwise, it sounds like the code needs some
> adjustment to behave as before?

I vote for keeping the ".html" suffix because I can imagine that Texinfo
creates only files with that suffix and it's depends on the web-server
and its configuration if the file is also served when the suffix is
missed in the URL.

Unfortunately, I was not able to verify this in the Texinfo
documentation or source code.

I had to make another adjustment info-test.el to make the test succeed:
Previously, Info-node-for-url failed when the passed manual-name was
neither "emacs" nor "elisp". In particular, it failed for "gnus". Now
that "gnus" is a handled manual-name, it succeeds. But it should still
error when the manual-name is not handled (by the default value of the
newly introduced Info-url-alist).

> Please also improve the commit log message to mention all the changes,
> not just the new option.  See CONTRIBUTE for details, and you can use
> "git log" to see many examples of how we do that.

I gave my best.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Add-option-Info-url-alist.patch --]
[-- Type: text/x-patch, Size: 8323 bytes --]

From 1e75f8397fb6396b2244e87d5a66062c8a11ee16 Mon Sep 17 00:00:00 2001
From: Mekeor Melire <mekeor@posteo.de>
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): 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            | 113 +++++++++++++++++++++++++++++++---------
 test/lisp/info-tests.el |   4 +-
 3 files changed, 100 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
 \f
 * 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..78512d0d518 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 with 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-mode-map>\\[Info-scroll-up] in a menu visits subnodes.
 
@@ -1807,33 +1854,49 @@ 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."
+  "Return the URL corresponding to NODE.
+
+NODE should be a string of the form \"(manual)Node\"."
   (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^[^\^]^^^-
-                               (<= 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"))
+    (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")
+                 ""
                  (concat
-                  (url-hexify-string (string-replace " " "-" node))
-                  ".html")))))
+                   (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 "")))
+                   ".html"))))
+    (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..b4f94b77030 100644
--- a/test/lisp/info-tests.el
+++ b/test/lisp/info-tests.el
@@ -34,6 +34,8 @@ test-info-urls
                  "https://www.gnu.org/software/emacs/manual/html_node/emacs/Minibuffer-File.html"))
   (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")))
+  (should (equal (Info-url-for-node  "(gnus)Don't Panic")
+                 "https://www.gnu.org/software/emacs/manual/html_node/gnus/Don_0027t-Panic.html"))
+  (should-error (Info-url-for-node "(nonexistent)Example")))
 
 ;;; info-tests.el ends here
-- 
2.41.0


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v6] Add option Info-url-alist
  2024-01-20  0:50                     ` bug#67615: [PATCH v6] Add option Info-url-alist Mekeor Melire
@ 2024-01-20  1:41                       ` Orhan Kemal Yüksel
  2024-01-20  7:23                       ` Eli Zaretskii
  1 sibling, 0 replies; 23+ messages in thread
From: Orhan Kemal Yüksel @ 2024-01-20  1:41 UTC (permalink / raw)
  To: 67615; +Cc: eliz

[-- Attachment #1: Type: text/plain, Size: 1919 bytes --]

On January 20, 2024 1:50:22 AM GMT+01:00, Mekeor Melire <mekeor@posteo.de> wrote:
>2024-01-13 11:51 eliz@gnu.org:
>
>> > From: Mekeor Melire <mekeor@posteo.de>
>> > Cc: 67615@debbugs.gnu.org
>> > Date: Mon, 08 Jan 2024 21:56:03 +0000
>
>> I was going to install this, but it causes info-tests in the test
>> suite to fail:
>
>> If we want the result to include the "html" extension (which might not
>> be correct, since perhaps we could have Minibuffer.htm?), then please
>> update the test.  Otherwise, it sounds like the code needs some
>> adjustment to behave as before?
>
>I vote for keeping the ".html" suffix because I can imagine that Texinfo
>creates only files with that suffix and it's depends on the web-server
>and its configuration if the file is also served when the suffix is
>missed in the URL.
>
>Unfortunately, I was not able to verify this in the Texinfo
>documentation or source code.
>
>I had to make another adjustment info-test.el to make the test succeed:
>Previously, Info-node-for-url failed when the passed manual-name was
>neither "emacs" nor "elisp". In particular, it failed for "gnus". Now
>that "gnus" is a handled manual-name, it succeeds. But it should still
>error when the manual-name is not handled (by the default value of the
>newly introduced Info-url-alist).
>
>> Please also improve the commit log message to mention all the changes,
>> not just the new option.  See CONTRIBUTE for details, and you can use
>> "git log" to see many examples of how we do that.
>
>I gave my best.
>

I will send another version of the patch. The %e provided to URL-SPECs in Info-url-alist should not contain the ".html"-suffix. Since we know that the webserver of gnu.org does serve the docs even if the URL omits the HTML-suffix, we should prefer that shorter version since it's easier on the eyes (and better e.g. for IRC etc.).

Sorry for the noise.


[-- Attachment #2: Type: text/html, Size: 3093 bytes --]

^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v6] Add option Info-url-alist
  2024-01-20  0:50                     ` bug#67615: [PATCH v6] Add option Info-url-alist Mekeor Melire
  2024-01-20  1:41                       ` Orhan Kemal Yüksel
@ 2024-01-20  7:23                       ` Eli Zaretskii
  2024-01-21  1:43                         ` bug#67615: [PATCH v7] " Mekeor Melire
  1 sibling, 1 reply; 23+ messages in thread
From: Eli Zaretskii @ 2024-01-20  7:23 UTC (permalink / raw)
  To: Mekeor Melire; +Cc: 67615

> From: Mekeor Melire <mekeor@posteo.de>
> Cc: Eli Zaretskii <eliz@gnu.org>
> Date: Sat, 20 Jan 2024 00:50:22 +0000
> 
> > I was going to install this, but it causes info-tests in the test
> > suite to fail:
> 
> > If we want the result to include the "html" extension (which might not
> > be correct, since perhaps we could have Minibuffer.htm?), then please
> > update the test.  Otherwise, it sounds like the code needs some
> > adjustment to behave as before?
> 
> I vote for keeping the ".html" suffix because I can imagine that Texinfo
> creates only files with that suffix and it's depends on the web-server
> and its configuration if the file is also served when the suffix is
> missed in the URL.

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?





^ permalink raw reply	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v7] Add option Info-url-alist
  2024-01-20  7:23                       ` Eli Zaretskii
@ 2024-01-21  1:43                         ` Mekeor Melire
  2024-01-27 10:21                           ` Eli Zaretskii
  0 siblings, 1 reply; 23+ messages in thread
From: Mekeor Melire @ 2024-01-21  1:43 UTC (permalink / raw)
  To: 67615; +Cc: Eli Zaretskii

[-- Attachment #1: Type: text/plain, Size: 1482 bytes --]

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.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Add-option-Info-url-alist.patch --]
[-- Type: text/x-patch, Size: 9077 bytes --]

From 856ea96868c54af8649cd604b5f92cf5cab4ca3c Mon Sep 17 00:00:00 2001
From: Mekeor Melire <mekeor@posteo.de>
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
 \f
 * 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-mode-map>\\[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


^ permalink raw reply related	[flat|nested] 23+ messages in thread

* bug#67615: [PATCH v7] Add option Info-url-alist
  2024-01-21  1:43                         ` bug#67615: [PATCH v7] " Mekeor Melire
@ 2024-01-27 10:21                           ` Eli Zaretskii
  0 siblings, 0 replies; 23+ messages in thread
From: Eli Zaretskii @ 2024-01-27 10:21 UTC (permalink / raw)
  To: Mekeor Melire; +Cc: 67615-done

> From: Mekeor Melire <mekeor@posteo.de>
> Cc: Eli Zaretskii <eliz@gnu.org>
> Date: Sun, 21 Jan 2024 01:43:04 +0000
> 
> 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.

Thanks, installed on the master branch, and closing the bug.





^ permalink raw reply	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2024-01-27 10:21 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-12-04  0:04 bug#67615: [PATCH] * lisp/info.el (Info-url-for-node): Support all Emacs info manuals Mekeor Melire
2023-12-04  0:30 ` Mekeor Melire
2023-12-04 10:02   ` bug#67615: [PATCH v2] " Mekeor Melire
2023-12-04 15:51     ` Mekeor Melire
2023-12-04 16:24       ` Eli Zaretskii
2023-12-05  1:06         ` bug#67615: Org-Mode story on how I gathered the list of Emacs-contained online-manuals Mekeor Melire
2023-12-07  2:48       ` bug#67615: [PATCH v2] * lisp/info.el (Info-url-for-node): Support all Emacs info manuals Richard Stallman
2023-12-07  7:19         ` Eli Zaretskii
2023-12-07 11:56           ` Mekeor Melire
2023-12-07 17:02             ` Eli Zaretskii
2023-12-09  4:05               ` Richard Stallman
2023-12-08  0:15       ` bug#67615: [PATCH v3] * lisp/info.el (Info-url-alist): New option mapping manuals to URLs Mekeor Melire
2023-12-09  9:42         ` Eli Zaretskii
2023-12-09 11:21           ` Mekeor Melire
2023-12-19 23:08             ` bug#67615: [PATCH v4] " Mekeor Melire
2023-12-23 10:05               ` Eli Zaretskii
2024-01-08 21:56                 ` bug#67615: [PATCH v5] " Mekeor Melire
2024-01-13  9:51                   ` Eli Zaretskii
2024-01-20  0:50                     ` bug#67615: [PATCH v6] Add option Info-url-alist Mekeor Melire
2024-01-20  1:41                       ` Orhan Kemal Yüksel
2024-01-20  7:23                       ` Eli Zaretskii
2024-01-21  1:43                         ` bug#67615: [PATCH v7] " Mekeor Melire
2024-01-27 10:21                           ` Eli Zaretskii

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).