From 4677edd8dd65b5d956732821e78794f35b275418 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sat, 18 May 2019 00:04:01 -0400 Subject: [PATCH] Fix Bug#33887 for mixed quote usage * lisp/textmodes/sgml-mode.el (sgml-syntax-propertize-rules): Only skip syntax-ppss for matched quotes. * test/lisp/textmodes/sgml-mode-tests.el (sgml-tests--quotes-syntax): Expand test. --- lisp/textmodes/sgml-mode.el | 4 ++-- test/lisp/textmodes/sgml-mode-tests.el | 17 ++++++++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/lisp/textmodes/sgml-mode.el b/lisp/textmodes/sgml-mode.el index 1b064fb825..e3cf56aa0e 100644 --- a/lisp/textmodes/sgml-mode.el +++ b/lisp/textmodes/sgml-mode.el @@ -345,8 +345,8 @@ sgml-font-lock-keywords ;; the resulting number of calls to syntax-ppss made it too slow ;; (bug#33887), so we're now careful to leave alone any pair ;; of quotes that doesn't hold a < or > char, which is the vast majority. - ("\\(?:\\(?1:\"\\)[^\"<>]*[<>\"]\\|\\(?1:'\\)[^'<>]*[<>']\\)" - (1 (unless (memq (char-before) '(?\' ?\")) + ("\\([\"']\\)[^<>\"']*[<>\"']" + (1 (unless (eq (char-after (match-beginning 1)) (char-before)) ;; Be careful to call `syntax-ppss' on a position before the one ;; we're going to change, so as not to need to flush the data we ;; just computed. diff --git a/test/lisp/textmodes/sgml-mode-tests.el b/test/lisp/textmodes/sgml-mode-tests.el index a900e8dcf2..ffcc2cd840 100644 --- a/test/lisp/textmodes/sgml-mode-tests.el +++ b/test/lisp/textmodes/sgml-mode-tests.el @@ -161,11 +161,18 @@ sgml-with-content (should (string= "&&" (buffer-string)))))) (ert-deftest sgml-tests--quotes-syntax () - (with-temp-buffer - (sgml-mode) - (insert "a\"b c'd") - (should (= 1 (car (syntax-ppss (1- (point-max)))))) - (should (= 0 (car (syntax-ppss (point-max))))))) + (dolist (str '("a\"b c'd" + "a'b c\"d" + "\"a'" + "'a\"" + "\"a'\"" + "'a\"'")) + (with-temp-buffer + (sgml-mode) + (insert str) + ;; Check that last tag is parsed as a tag. + (should (= 1 (car (syntax-ppss (1- (point-max)))))) + (should (= 0 (car (syntax-ppss (point-max)))))))) (provide 'sgml-mode-tests) ;;; sgml-mode-tests.el ends here -- 2.11.0