diff options
| author | Štěpán Němec | 2020-04-12 19:57:59 +0200 |
|---|---|---|
| committer | Štěpán Němec | 2020-04-13 12:03:38 +0200 |
| commit | 81d07da788e7caea266f4a520cd9922c990d04e9 (patch) | |
| tree | 47305fdb2e8b01ecea49a5f35e058ec7becfd090 | |
| parent | 1dfc497fac22c199a944ef64233266bd6cd2fee6 (diff) | |
| download | emacs-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.el | 24 |
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. |