aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorŠtěpán Němec2020-04-12 19:57:59 +0200
committerŠtěpán Němec2020-04-13 12:03:38 +0200
commit81d07da788e7caea266f4a520cd9922c990d04e9 (patch)
tree47305fdb2e8b01ecea49a5f35e058ec7becfd090
parent1dfc497fac22c199a944ef64233266bd6cd2fee6 (diff)
downloademacs-81d07da788e7caea266f4a520cd9922c990d04e9.tar.gz
emacs-81d07da788e7caea266f4a520cd9922c990d04e9.zip
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.
-rw-r--r--lisp/gnus/gnus-sum.el24
1 files changed, 17 insertions, 7 deletions
diff --git a/lisp/gnus/gnus-sum.el b/lisp/gnus/gnus-sum.el
index a40e563e755..9b11d5878d9 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'."
9493 (push primary urls)) 9493 (push primary urls))
9494 (delete-dups urls))) 9494 (delete-dups urls)))
9495 9495
9496;; cf. `ediff-truncate-string-left', to become `string-truncate-left'
9497;; in Emacs 28
9498(defun gnus--string-truncate-left (string length)
9499 "Truncate STRING to LENGTH, replacing initial surplus with \"...\"."
9500 (let ((strlen (length string)))
9501 (if (<= strlen length)
9502 string
9503 (setq length (max 0 (- length 3)))
9504 (concat "..." (substring string (max 0 (- strlen 1 length)))))))
9505
9496(defun gnus-shorten-url (url max) 9506(defun gnus-shorten-url (url max)
9497 "Return an excerpt from URL." 9507 "Return an excerpt from URL not exceeding MAX characters."
9498 (if (<= (length url) max) 9508 (if (<= (length url) max)
9499 url 9509 url
9500 (let ((parsed (url-generic-parse-url url))) 9510 (let* ((parsed (url-generic-parse-url url))
9501 (concat (url-host parsed) 9511 (host (url-host parsed))
9502 "..." 9512 (rest (concat (url-filename parsed)
9503 (substring (url-filename parsed) 9513 (when-let ((target (url-target parsed)))
9504 (- (length (url-filename parsed)) 9514 (concat "#" target)))))
9505 (max (- max (length (url-host parsed))) 0))))))) 9515 (concat host (gnus--string-truncate-left rest (- max (length host)))))))
9506 9516
9507(defun gnus-summary-browse-url (&optional external) 9517(defun gnus-summary-browse-url (&optional external)
9508 "Scan the current article body for links, and offer to browse them. 9518 "Scan the current article body for links, and offer to browse them.