emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

emacs-27 81d07da 1/2: gnus-shorten-url: Improve and avoid args-out-of-ra


From: Št?pán N?mec
Subject: emacs-27 81d07da 1/2: gnus-shorten-url: Improve and avoid args-out-of-range error
Date: Mon, 13 Apr 2020 06:20:34 -0400 (EDT)

branch: emacs-27
commit 81d07da788e7caea266f4a520cd9922c990d04e9
Author: Štěpán Němec <address@hidden>
Commit: Štěpán Němec <address@hidden>

    gnus-shorten-url: Improve and avoid args-out-of-range error
    
    'gnus-shorten-url' (used by 'gnus-summary-browse-url') ignored
    fragment identifiers and didn't check substring bounds, in some cases
    leading to runtime errors, e.g.:
    
      (gnus-shorten-url "https://some.url.with/path/and#also_a_long_target"; 40)
      ;; => Lisp error: (args-out-of-range "/path/and" -18 nil)
    
    This commit makes it account for #fragments and fixes faulty string
    computation.  (bug#39980)
    
    Do not merge to master, where the helper is put to subr-x.el.
    
    * lisp/gnus/gnus-sum.el (gnus--string-truncate-left): New helper
    function (copied from 'ediff-truncate-string-left').
    (gnus-shorten-url): Use it and don't drop #fragments.
---
 lisp/gnus/gnus-sum.el | 24 +++++++++++++++++-------
 1 file changed, 17 insertions(+), 7 deletions(-)

diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
index a40e563..9b11d58 100644
--- a/lisp/gnus/gnus-sum.el
+++ b/lisp/gnus/gnus-sum.el
@@ -9493,16 +9493,26 @@ The 1st element is the button named by 
`gnus-collect-urls-primary-text'."
       (push primary urls))
     (delete-dups urls)))
 
+;; cf. `ediff-truncate-string-left', to become `string-truncate-left'
+;; in Emacs 28
+(defun gnus--string-truncate-left (string length)
+  "Truncate STRING to LENGTH, replacing initial surplus with \"...\"."
+  (let ((strlen (length string)))
+    (if (<= strlen length)
+       string
+      (setq length (max 0 (- length 3)))
+      (concat "..." (substring string (max 0 (- strlen 1 length)))))))
+
 (defun gnus-shorten-url (url max)
-  "Return an excerpt from URL."
+  "Return an excerpt from URL not exceeding MAX characters."
   (if (<= (length url) max)
       url
-    (let ((parsed (url-generic-parse-url url)))
-      (concat (url-host parsed)
-             "..."
-             (substring (url-filename parsed)
-                        (- (length (url-filename parsed))
-                           (max (- max (length (url-host parsed))) 0)))))))
+    (let* ((parsed (url-generic-parse-url url))
+           (host (url-host parsed))
+           (rest (concat (url-filename parsed)
+                         (when-let ((target (url-target parsed)))
+                           (concat "#" target)))))
+      (concat host (gnus--string-truncate-left rest (- max (length host)))))))
 
 (defun gnus-summary-browse-url (&optional external)
   "Scan the current article body for links, and offer to browse them.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]