From 0e151a03ef9d9b80e15b22870043a1cc66f5a69a Mon Sep 17 00:00:00 2001 From: bw Date: Mon, 2 Feb 2026 23:42:02 -0500 Subject: [PATCH] hywiki-delimited-p, hywiki-word-at - Fix to handle edge cases --- ChangeLog | 15 +++++++++++++++ hibtypes.el | 4 ++-- hywiki.el | 46 +++++++++++++++++++++++++++++--------------- test/hywiki-tests.el | 8 ++++---- 4 files changed, 52 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5d523304..fa0c0e19 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2026-02-02 Bob Weiner + +* test/hywiki-tests.el (hywiki-tests--edit-string-pairs): Enable two more tests + that now pass. + +* hywiki.el (hywiki-word-at): Near the end, change the string-match to not + have to match the entire string since it may contain disallowed characters. + Cut the reference string off at the first invalid character. + This fixes a problem that prevented highlighting a reference when a trailing + double quote was deleted. + (hywiki-delimited-p): Remove doc constraint that only delimiters around + a single HyWikiWord reference are allowed; also trim any trailing whitespace. + (hywiki-delimited-p): Fix to handle matching quotes when checking + matching delimiters. + 2026-02-02 Mats Lidell * hibtypes.el (hywiki-active-in-current-buffer-p) diff --git a/hibtypes.el b/hibtypes.el index b8287ede..3c465fa4 100644 --- a/hibtypes.el +++ b/hibtypes.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 19-Sep-91 at 20:45:31 -;; Last-Mod: 5-Jan-26 at 23:42:19 by Bob Weiner +;; Last-Mod: 2-Feb-26 at 18:22:19 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -65,8 +65,8 @@ (declare-function htype:def-symbol "hact") (declare-function hui:help-ebut-highlight "hui") (declare-function hyperb:stack-frame "hversion") -(declare-function hywiki-active-in-current-buffer-p "hywiki") (declare-function hyrolo-get-file-list "hyrolo") +(declare-function hywiki-active-in-current-buffer-p "hywiki") (declare-function hywiki-get-singular-wikiword "hywiki") (declare-function hywiki-highlight-word-get-range "hywiki") (declare-function hywiki-referent-exists-p "hywiki") diff --git a/hywiki.el b/hywiki.el index c071db99..511d23a0 100644 --- a/hywiki.el +++ b/hywiki.el @@ -3,7 +3,7 @@ ;; Author: Bob Weiner ;; ;; Orig-Date: 21-Apr-24 at 22:41:13 -;; Last-Mod: 1-Feb-26 at 19:16:29 by Bob Weiner +;; Last-Mod: 2-Feb-26 at 23:16:23 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -3432,14 +3432,19 @@ non-nil or this will return nil." end (match-end 0) ;; No following char wikiword (string-trim (match-string-no-properties 0))))))))) - ;; If `wikiword' reference has a #section, ensure there are - ;; no invalid chars. One set of \n\r characters is allowed. + ;; If `wikiword' reference has a #section, ensure + ;; it stops when there are any disallowed characters + ;; and reset the value of 'end' to match any reduction. + ;; One set of \n\r characters is allowed but no + ;; whitespace at the end of the reference. (if (and (stringp wikiword) (string-match "#" wikiword)) - (string-match "#[^][#()<>{}\"\f]+\\'" wikiword) + (when (string-match "#[^][#()<>{}\"\f]*[^][#()<>{}\"\f\t\n\r ]" wikiword) + (setq end (- end (- (length wikiword) + (match-end 0))) + wikiword (substring wikiword 0 (match-end 0)))) t)) (if range-flag - (progn - (list wikiword start end)) + (list wikiword start end) wikiword) (when range-flag '(nil nil nil)))))) @@ -3533,9 +3538,6 @@ or this will return nil." Any non-nil value returned is a list of (hywikiword-ref start-pos end-pos). The delimited range must be two lines or less with point on the first line. -Matching delimiters around anything other than a single HyWikiWord reference -are ignored. - Use `hywiki-word-at', which calls this, to determine whether there is a HyWikiWord at point." (save-excursion @@ -3545,13 +3547,27 @@ a HyWikiWord at point." ;; Limit balanced pair checks to current through next lines for speed. ;; Point must be either on the opening line. (narrow-to-region (line-beginning-position) (line-end-position 2)) - (or (hypb:in-string-p nil t) - (let ((range (hargs:delimited "[\[<\(\{]" "[\]\}\)\>]" t t t))) - (and range - ;; Ensure closing delimiter is a match for the opening one - (eq (matching-paren (char-before (nth 1 range))) + (let* ((range (or (hypb:in-string-p nil t) + (hargs:delimited "[\[<\(\{]" "[\]\}\)\>]" t t t))) + (wikiword (car range)) + range-trimmed + wikiword-trimmed) + (if (and wikiword (string-match "[ \t\n\r\f]+\\'" wikiword)) + ;; Strip any trailing whitespace + (setq wikiword-trimmed (substring wikiword 0 (match-beginning 0)) + range-trimmed (list wikiword-trimmed (nth 1 range) + (- (nth 2 range) (length (match-string + 0 wikiword))))) + (setq range-trimmed range)) + (and range-trimmed + ;; Ensure closing delimiter is a match for the opening one + (or (eq (matching-paren (char-before (nth 1 range))) (char-after (nth 2 range))) - range)))))) + ;; May be string quotes where matching-paren returns nil. + (and (eq (char-before (nth 1 range)) + (char-after (nth 2 range))) + (eq (char-syntax (char-before (nth 1 range))) ?\"))) + range-trimmed))))) (defun hywiki-word-face-at-p (&optional pos) "Non-nil if point or optional POS has the `hywiki-word-face' property. diff --git a/test/hywiki-tests.el b/test/hywiki-tests.el index 3dee417b..42b31bf3 100644 --- a/test/hywiki-tests.el +++ b/test/hywiki-tests.el @@ -3,7 +3,7 @@ ;; Author: Mats Lidell ;; ;; Orig-Date: 18-May-24 at 23:59:48 -;; Last-Mod: 2-Feb-26 at 00:32:30 by Bob Weiner +;; Last-Mod: 2-Feb-26 at 23:37:48 by Bob Weiner ;; ;; SPDX-License-Identifier: GPL-3.0-or-later ;; @@ -28,12 +28,12 @@ (defconst hywiki-tests--edit-string-pairs [ - ;; !! TODO: These tests fail - ;; ("Hi#a cd" "{Hi#ab} cd") + ;; !! TODO: This test fails ;; ("\"WikiWord#section with spaces\"" "\"{WikiWord#section} with spaces") ;; shrink highlight to "{WikiWord#section} - ;; ("\"WikiWord#a b c" "\"{WikiWord#a} b") ;; These tests pass + ("Hi#a cd" "{Hi#ab} cd") + ("\"WikiWord#a b c" "\"{WikiWord#a} b") ("Hi" "{Hi}") ("HyWikiWord HyWikiWord" "{HyWikiWord} {HyWikiWord}")