tildify.el: Fix end-regex building in `tildify-find-env'

* lisp/textmodes/tildify.el (tildify-find-env): The
`tildify-ignored-environments-alist' allows the end-regex
to be provided not as a static string but mix of strings and
indexes of groups matched the begin-regex.  For example, the
“\verb!…!” TeX-command (where “!” is an arbitrary character)
is handled using:

    ("\\\\verb\\*?\\(.\\)" . (1))

In the same way, the following should be supported as well:

    ("open-\\(.\\)" . ("end-" 1))

However the tildify-find-env function fails at

    (concat result
            (if (stringp (setq aux (car expression)))
                 expression  ; BUG: expression is a list
               (regexp-quote (match-string aux))))

where the string part is handled incorrectly.

The most trivial fix would be to replace `expression'
in the true-part of the if-statement with `aux', but
instead, this commit optimises `tildify-find-env' by
changing it to use `mapconcat' rather than open-coded
while-loop.

* tests/automated/tildify-tests.el (tildify-test-find-env-end-re-bug):
New test validating fix to the above bug.
This commit is contained in:
Michal Nazarewicz 2014-06-05 16:37:45 +02:00
parent a1d799c25e
commit af9a3b28c0
4 changed files with 66 additions and 22 deletions

View file

@ -1,3 +1,34 @@
2014-06-05 Michal Nazarewicz <mina86@mina86.com>
* textmodes/tildify.el (tildify-find-env): Fix end-regex building
in `tildify-find-env'
The `tildify-ignored-environments-alist' allows the end-regex to
be provided not as a static string but mix of strings and indexes
of groups matched the begin-regex. For example, the “\verb!…!”
TeX-command (where “!” is an arbitrary character) is handled
using:
("\\\\verb\\*?\\(.\\)" . (1))
In the same way, the following should be supported as well:
("open-\\(.\\)" . ("end-" 1))
However the tildify-find-env function fails at
(concat result
(if (stringp (setq aux (car expression)))
expression ; BUG: expression is a list
(regexp-quote (match-string aux))))
where the string part is handled incorrectly.
The most trivial fix would be to replace `expression' in the
true-part of the if-statement with `aux', but instead, this commit
optimises `tildify-find-env' by changing it to use `mapconcat'
rather than open-coded while-loop.
2014-06-05 Mario Lang <mlang@delysid.org>
* woman.el (woman-mapcan): Remove.

View file

@ -3,7 +3,7 @@
;; Copyright (C) 1997-2014 Free Software Foundation, Inc.
;; Author: Milan Zamazal <pdm@zamazal.org>
;; Version: 4.5.1
;; Version: 4.5.2
;; Keywords: text, TeX, SGML, wp
;; This file is part of GNU Emacs.
@ -270,27 +270,23 @@ won't be prompted for confirmation of each substitution."
Return regexp for the end of the environment or nil if no environment was
found."
;; Find environment
(if (re-search-forward regexp nil t)
;; Build end-env regexp
(let ((match (match-string 0))
(alist (tildify-mode-alist tildify-ignored-environments-alist))
expression)
(save-match-data
(while (not (eq (string-match (caar alist) match) 0))
(setq alist (cdr alist))))
(if (stringp (setq expression (cdar alist)))
expression
(let ((result "")
aux)
(while expression
(setq result (concat result
(if (stringp (setq aux (car expression)))
expression
(regexp-quote (match-string aux)))))
(setq expression (cdr expression)))
result)))
;; Return nil if not found
nil))
(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
(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
""))))))
(defun tildify-tildify (beg end ask)
"Add tilde characters in the region between BEG and END.

View file

@ -1,3 +1,9 @@
2014-06-05 Michal Nazarewicz <mina86@mina86.com>
* 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.
2014-06-02 Michael Albinus <michael.albinus@gmx.de>
* automated/tramp-tests.el (tramp-remote-process-environment): Declare.

View file

@ -101,6 +101,17 @@ latter is missing, SENTENCE will be used in all placeholder positions."
(tildify-test--example-tex sentence sentence)
(tildify-test--example-tex sentence with-nbsp))))
(ert-deftest tildify-test-find-env-end-re-bug ()
"Tests generation of end-regex using mix of indexes and strings"
(with-temp-buffer
(let ((tildify-ignored-environments-alist
`((,major-mode ("foo\\|bar" . ("end-" 0))))))
(insert "foo whatever end-foo")
(goto-char (point-min))
(should (string-equal "end-foo" (tildify-find-env "foo\\|bar"))))))
(provide 'tildify-tests)
;;; tildify-tests.el ends here