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:
parent
ad77ae0bcf
commit
14614b6d3a
1 changed files with 21 additions and 14 deletions
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue