[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] emacs-26 e62ad04 2/2: Fix sgml-mode handling of quotes wit
From: |
Noam Postavsky |
Subject: |
[Emacs-diffs] emacs-26 e62ad04 2/2: Fix sgml-mode handling of quotes within parens (Bug#36347) |
Date: |
Tue, 25 Jun 2019 22:06:52 -0400 (EDT) |
branch: emacs-26
commit e62ad04963982ea9cc7622b32484778845bc2ec1
Author: Noam Postavsky <address@hidden>
Commit: Noam Postavsky <address@hidden>
Fix sgml-mode handling of quotes within parens (Bug#36347)
* lisp/textmodes/sgml-mode.el (sgml-syntax-propertize): Use
syntax-ppss-table if set. This is only needed on the release branch,
on master the caller (syntax-propertize) already does this.
(sgml-mode): Set syntax-ppss-table to sgml-tag-syntax-table. This
correctly classifies parens as punctuation, so they won't confuse the
parser.
* test/lisp/textmodes/sgml-mode-tests.el (sgml-tests--quotes-syntax):
New test copied from master, with two cases added for this bug.
---
lisp/textmodes/sgml-mode.el | 10 ++++++----
test/lisp/textmodes/sgml-mode-tests.el | 22 ++++++++++++++++++++++
2 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/lisp/textmodes/sgml-mode.el b/lisp/textmodes/sgml-mode.el
index 128e588..c9724e0 100644
--- a/lisp/textmodes/sgml-mode.el
+++ b/lisp/textmodes/sgml-mode.el
@@ -357,10 +357,11 @@ Any terminating `>' or `/' is not matched.")
(defun sgml-syntax-propertize (start end)
"Syntactic keywords for `sgml-mode'."
(goto-char start)
- (sgml-syntax-propertize-inside end)
- (funcall
- (syntax-propertize-rules sgml-syntax-propertize-rules)
- start end))
+ (with-syntax-table (or syntax-ppss-table (syntax-table))
+ (sgml-syntax-propertize-inside end)
+ (funcall
+ (syntax-propertize-rules sgml-syntax-propertize-rules)
+ start end)))
(defun sgml-syntax-propertize-inside (end)
(let ((ppss (syntax-ppss)))
@@ -568,6 +569,7 @@ Do \\[describe-key] on the following bindings to discover
what they do.
sgml-font-lock-keywords-2)
nil t))
(setq-local syntax-propertize-function #'sgml-syntax-propertize)
+ (setq-local syntax-ppss-table sgml-tag-syntax-table)
(setq-local facemenu-add-face-function 'sgml-mode-facemenu-add-face-function)
(setq-local sgml-xml-mode (sgml-xml-guess))
(unless sgml-xml-mode
diff --git a/test/lisp/textmodes/sgml-mode-tests.el
b/test/lisp/textmodes/sgml-mode-tests.el
index 7318a66..0000b35 100644
--- a/test/lisp/textmodes/sgml-mode-tests.el
+++ b/test/lisp/textmodes/sgml-mode-tests.el
@@ -130,5 +130,27 @@ The point is set to the beginning of the buffer."
(sgml-delete-tag 1)
(should (string= "Winter is comin'" (buffer-string)))))
+(ert-deftest sgml-tests--quotes-syntax ()
+ (dolist (str '("a\"b <t>c'd</t>"
+ "a'b <t>c\"d</t>"
+ "<t>\"a'</t>"
+ "<t>'a\"</t>"
+ "<t>\"a'\"</t>"
+ "<t>'a\"'</t>"
+ "a\"b <tag>c'd</tag>"
+ ;;"<tag>c>'d</tag>" Fixed in master.
+ "<t><!-- \" --></t>"
+ "<t><!-- ' --></t>"
+ "<t>(')</t>"
+ "<t>(\")</t>"
+ ))
+ (with-temp-buffer
+ (sgml-mode)
+ (insert str)
+ (ert-info ((format "%S" str) :prefix "Test case: ")
+ ;; 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