Mercurial > emacs
changeset 44387:a8edf3f6811d
(sgml-lexical-context): Fix up CDATA detection for boundary cases.
author | Mike Williams <mdub@bigfoot.com> |
---|---|
date | Wed, 03 Apr 2002 21:17:38 +0000 |
parents | b3544d5a262d |
children | 01d388c4b0a3 |
files | lisp/textmodes/sgml-mode.el |
diffstat | 1 files changed, 21 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/textmodes/sgml-mode.el Wed Apr 03 19:56:59 2002 +0000 +++ b/lisp/textmodes/sgml-mode.el Wed Apr 03 21:17:38 2002 +0000 @@ -872,29 +872,36 @@ ;; any string or tag or comment or ... (save-excursion (let ((pos (point)) - text-start cdata-start state) + text-start state) (if limit (goto-char limit) ;; Hopefully this regexp will match something that's not inside ;; a tag and also hopefully the match is nearby. (re-search-backward "^[ \t]*<[_:[:alpha:]/%!?#]" nil 'move)) - ;; (setq text-start (point)) (with-syntax-table sgml-tag-syntax-table (while (< (point) pos) ;; When entering this loop we're inside text. (setq text-start (point)) (skip-chars-forward "^<" pos) - (setq cdata-start (if (looking-at "<!\\[[A-Z]+\\[") (point))) - ;; We skipped text and reached a tag. Parse it. - ;; FIXME: Handle net-enabling start-tags - (if cdata-start - (search-forward "]]>" pos 'move) - (setq state (parse-partial-sexp (point) pos 0)))) - (cond - (cdata-start (cons 'cdata cdata-start)) - ((nth 3 state) (cons 'string (nth 8 state))) - ((nth 4 state) (cons 'comment (nth 8 state))) - ((and state (> (nth 0 state) 0)) (cons 'tag (nth 1 state))) - (t (cons 'text text-start))))))) + (setq state + (cond + ((= (point) pos) + ;; We got to the end without seeing a tag. + nil) + ((looking-at "<!\\[[A-Z]+\\[") + ;; We've found a CDATA section or similar. + (let ((cdata-start (point))) + (unless (search-forward "]]>" pos 'move) + (list 0 nil nil 'cdata nil nil nil nil cdata-start)))) + (t + ;; We've reached a tag. Parse it. + ;; FIXME: Handle net-enabling start-tags + (parse-partial-sexp (point) pos 0)))))) + (cond + ((eq (nth 3 state) 'cdata) (cons 'cdata (nth 8 state))) + ((nth 3 state) (cons 'string (nth 8 state))) + ((nth 4 state) (cons 'comment (nth 8 state))) + ((and state (> (nth 0 state) 0)) (cons 'tag (nth 1 state))) + (t (cons 'text text-start)))))) (defun sgml-beginning-of-tag (&optional top-level) "Skip to beginning of tag and return its name.