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.
This commit is contained in:
parent
06b35b2f92
commit
e62ad04963
2 changed files with 28 additions and 4 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue