Recognize single quote attribute values in nxml and sgml (Bug#35381)
* lisp/textmodes/sgml-mode.el (sgml-specials): Add single quote. (sgml-syntax-propertize-rules): Handle single quote. * test/lisp/nxml/nxml-mode-tests.el (nxml-mode-font-lock-quotes): New test. * test/lisp/textmodes/sgml-mode-tests.el (sgml-delete-tag-bug-8203-should-not-delete-apostrophe): Now passes.
This commit is contained in:
parent
e4cde42657
commit
7dab3ee7ab
3 changed files with 35 additions and 20 deletions
|
@ -100,24 +100,20 @@ a DOCTYPE or an XML declaration."
|
|||
:group 'sgml
|
||||
:type 'hook)
|
||||
|
||||
;; As long as Emacs's syntax can't be complemented with predicates to context
|
||||
;; sensitively confirm the syntax of characters, we have to live with this
|
||||
;; kludgy kind of tradeoff.
|
||||
(defvar sgml-specials '(?\")
|
||||
;; The official handling of "--" is complicated in SGML, and
|
||||
;; historically not well supported by browser HTML parsers.
|
||||
;; Recommendations for writing HTML comments is to use <!--...-->
|
||||
;; (where ... doesn't contain "--") to avoid the complications
|
||||
;; altogether (XML goes even further by requiring this in the spec).
|
||||
;; So there is probably no need to handle it "correctly".
|
||||
(defvar sgml-specials '(?\" ?\')
|
||||
"List of characters that have a special meaning for SGML mode.
|
||||
This list is used when first loading the `sgml-mode' library.
|
||||
The supported characters and potential disadvantages are:
|
||||
The supported characters are ?\\\", ?\\=', and ?-.
|
||||
|
||||
?\\\" Makes \" in text start a string.
|
||||
?\\=' Makes \\=' in text start a string.
|
||||
?- Makes -- in text start a comment.
|
||||
|
||||
When only one of ?\\\" or ?\\=' are included, \"\\='\" or \\='\"\\=', as can be found in
|
||||
DTDs, start a string. To partially avoid this problem this also makes these
|
||||
self insert as named entities depending on `sgml-quick-keys'.
|
||||
|
||||
Including ?- has the problem of affecting dashes that have nothing to do
|
||||
with comments, so we normally turn it off.")
|
||||
Including ?- makes double dashes into comment delimiters, but
|
||||
they are really only supposed to delimit comments within DTD
|
||||
definitions. So we normally turn it off.")
|
||||
|
||||
(defvar sgml-quick-keys nil
|
||||
"Use <, >, &, /, SPC and `sgml-specials' keys \"electrically\" when non-nil.
|
||||
|
@ -351,12 +347,12 @@ Any terminating `>' or `/' is not matched.")
|
|||
("--[ \t\n]*\\(>\\)" (1 "> b"))
|
||||
("\\(<\\)[?!]" (1 (prog1 "|>"
|
||||
(sgml-syntax-propertize-inside end))))
|
||||
;; Double quotes outside of tags should not introduce strings.
|
||||
;; Quotes outside of tags should not introduce strings.
|
||||
;; 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.
|
||||
("\"" (0 (if (prog1 (zerop (car (syntax-ppss (match-beginning 0))))
|
||||
(goto-char (match-end 0)))
|
||||
(string-to-syntax ".")))))))
|
||||
("[\"']" (0 (if (prog1 (zerop (car (syntax-ppss (match-beginning 0))))
|
||||
(goto-char (match-end 0)))
|
||||
(string-to-syntax ".")))))))
|
||||
|
||||
(defun sgml-syntax-propertize (start end)
|
||||
"Syntactic keywords for `sgml-mode'."
|
||||
|
|
|
@ -58,5 +58,25 @@
|
|||
(nxml-balanced-close-start-tag-inline)
|
||||
(should (equal (buffer-string) "<a><b c=\"\"></b></a>"))))
|
||||
|
||||
(ert-deftest nxml-mode-font-lock-quotes ()
|
||||
(with-temp-buffer
|
||||
(nxml-mode)
|
||||
(insert "<x a=\"dquote attr\" b='squote attr'>\"dquote text\"'squote text'</x>")
|
||||
(font-lock-ensure)
|
||||
(let ((squote-txt-pos (search-backward "squote text"))
|
||||
(dquote-txt-pos (search-backward "dquote text"))
|
||||
(squote-att-pos (search-backward "squote attr"))
|
||||
(dquote-att-pos (search-backward "dquote attr")))
|
||||
;; Just make sure that each quote uses the same face for quoted
|
||||
;; attribute values, and a different face for quoted text
|
||||
;; outside tags. Don't test `font-lock-string-face' vs
|
||||
;; `nxml-attribute-value' here.
|
||||
(should (equal (get-text-property squote-att-pos 'face)
|
||||
(get-text-property dquote-att-pos 'face)))
|
||||
(should (equal (get-text-property squote-txt-pos 'face)
|
||||
(get-text-property dquote-txt-pos 'face)))
|
||||
(should-not (equal (get-text-property squote-txt-pos 'face)
|
||||
(get-text-property dquote-att-pos 'face))))))
|
||||
|
||||
(provide 'nxml-mode-tests)
|
||||
;;; nxml-mode-tests.el ends here
|
||||
|
|
|
@ -125,7 +125,6 @@ The point is set to the beginning of the buffer."
|
|||
(should (string= content (buffer-string))))))
|
||||
|
||||
(ert-deftest sgml-delete-tag-bug-8203-should-not-delete-apostrophe ()
|
||||
:expected-result :failed
|
||||
(sgml-with-content
|
||||
"<title>Winter is comin'</title>"
|
||||
(sgml-delete-tag 1)
|
||||
|
|
Loading…
Add table
Reference in a new issue