]> git.eshelyaron.com Git - emacs.git/commitdiff
(sgml-lexical-context): Fix up CDATA detection for boundary cases.
authorMike Williams <mdub@bigfoot.com>
Wed, 3 Apr 2002 21:17:38 +0000 (21:17 +0000)
committerMike Williams <mdub@bigfoot.com>
Wed, 3 Apr 2002 21:17:38 +0000 (21:17 +0000)
lisp/textmodes/sgml-mode.el

index 49201f5a8939e7b888f13098b400f75d7955df35..b308915c948bb6b14385b7833c7b1a968b121c61 100644 (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.