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.
This commit is contained in:
parent
af9a3b28c0
commit
9342feecdd
4 changed files with 54 additions and 15 deletions
|
@ -1,5 +1,28 @@
|
|||
2014-06-05 Michal Nazarewicz <mina86@mina86.com>
|
||||
|
||||
* 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'
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
2014-06-05 Michal Nazarewicz <mina86@mina86.com>
|
||||
|
||||
* 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.
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue