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.