From: Michal Nazarewicz Date: Thu, 5 Jun 2014 14:39:18 +0000 (+0200) Subject: tildify.el: Fix matched group indexes in end-regex building X-Git-Tag: emacs-25.0.90~2639^2~113 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=9342feecdd92b769b1f45a6feea8ad34985c5049;p=emacs.git tildify.el: Fix matched group indexes in end-regex building * lisp/textmodes/tildifi.el (tildify-find-env): When looking for a start of an ignore-environment, the regex is built by concatenating regexes of all the environments configured in `tildify-ignored-environments-alist'. So for example, the following list could be used to match TeX's \verb and \verb* commands: (("\\\\verb\\(.\\)" . (1)) ("\\\\verb\\*\\(.\\)" . (1))) This would result in the following regex being used to find the start of any of the variants of the \verb command: \\\\verb\\(.\\)\\|\\\\verb\\*\\(.\\) But now, if “\\\\verb\\*\\(.\\)” matches, the first capture group won't match anything, and thus (match-string 1) will be nil, which will cause building of the end-matching regex to fail. Fix this by using capture groups from the time when the opening regexes are matched individually. * tests/automated/tildify-tests.el (tildify-test-find-env-group-index-bug): New test validating fix to the above bug. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 7bbaf642d3c..936ae225a8b 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,28 @@ 2014-06-05 Michal Nazarewicz + * textmodes/tildify.el (tildify-find-env): Fix matched group + indexes in end-regex building + + When looking for a start of an ignore-environment, the regex is built + by concatenating regexes of all the environments configured in + `tildify-ignored-environments-alist'. So for example, the following + list could be used to match TeX's \verb and \verb* commands: + + (("\\\\verb\\(.\\)" . (1)) + ("\\\\verb\\*\\(.\\)" . (1))) + + This would result in the following regex being used to find the start + of any of the variants of the \verb command: + + \\\\verb\\(.\\)\\|\\\\verb\\*\\(.\\) + + But now, if “\\\\verb\\*\\(.\\)” matches, the first capture group + won't match anything, and thus (match-string 1) will be nil, which + will cause building of the end-matching regex to fail. + + Fix this by using capture groups from the time when the opening + regexes are matched individually. + * textmodes/tildify.el (tildify-find-env): Fix end-regex building in `tildify-find-env' diff --git a/lisp/textmodes/tildify.el b/lisp/textmodes/tildify.el index 7e4b39b615a..7aa338ef207 100644 --- a/lisp/textmodes/tildify.el +++ b/lisp/textmodes/tildify.el @@ -271,22 +271,22 @@ Return regexp for the end of the environment or nil if no environment was found." ;; Find environment (when (re-search-forward regexp nil t) - ;; Build end-env regexp - (let ((match (match-string 0)) - (alist (tildify-mode-alist tildify-ignored-environments-alist))) - (save-match-data + (save-match-data + ;; Build end-env regexp + (let ((match (match-string 0)) + (alist (tildify-mode-alist tildify-ignored-environments-alist))) (while (not (eq (string-match (caar alist) match) 0)) - (setq alist (cdr alist)))) - (let ((expression (cdar alist))) - (if (stringp expression) - expression - (mapconcat - (lambda (expr) - (if (stringp expr) - expr - (regexp-quote (match-string expr)))) - expression - "")))))) + (setq alist (cdr alist))) + (let ((expression (cdar alist))) + (if (stringp expression) + expression + (mapconcat + (lambda (expr) + (if (stringp expr) + expr + (regexp-quote (match-string expr match)))) + expression + ""))))))) (defun tildify-tildify (beg end ask) "Add tilde characters in the region between BEG and END. diff --git a/test/ChangeLog b/test/ChangeLog index db32aae578b..93ef0980c9a 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,5 +1,9 @@ 2014-06-05 Michal Nazarewicz + * automated/tildify-tests.el (tildify-test-find-env-group-index-bug): + New test checking end-regex building when multiple environment pairs + use integers to refer to capture groups. + * automated/tildify-tests.el (tildify-test-find-env-end-re-bug): New test checking end-regex building in `tildify-find-env' function when integers (denoting capture groups) and strings are mixed together. diff --git a/test/automated/tildify-tests.el b/test/automated/tildify-tests.el index 25e9f22adf3..6fee28b3862 100644 --- a/test/automated/tildify-tests.el +++ b/test/automated/tildify-tests.el @@ -112,6 +112,18 @@ latter is missing, SENTENCE will be used in all placeholder positions." (should (string-equal "end-foo" (tildify-find-env "foo\\|bar")))))) +(ert-deftest tildify-test-find-env-group-index-bug () + "Tests generation of match-string indexes" + (with-temp-buffer + (let ((tildify-ignored-environments-alist + `((,major-mode ("start-\\(foo\\|bar\\)" . ("end-" 1)) + ("open-\\(foo\\|bar\\)" . ("close-" 1))))) + (beg-re "start-\\(foo\\|bar\\)\\|open-\\(foo\\|bar\\)")) + (insert "open-foo whatever close-foo") + (goto-char (point-min)) + (should (string-equal "close-foo" (tildify-find-env beg-re)))))) + + (provide 'tildify-tests) ;;; tildify-tests.el ends here