1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-15 10:30:25 -08:00

(sgml-lexical-context): Fix up CDATA detection for boundary cases.

This commit is contained in:
Mike Williams 2002-04-03 21:17:38 +00:00
parent ad77ae0bcf
commit 14614b6d3a

View file

@ -872,29 +872,36 @@ If non-nil LIMIT is a nearby position before point outside of any tag."
;; 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.