changeset 44243:c3ee131a3ab1

(xml-lite-get-context): Don't stop parsing at unclosed tags unless it is at indentation. Kill nested unclosed tags. (xml-lite-calculate-indent, xml-lite-indent-line): Remove. (xml-lite-mode): Use sgml-indent-line instead.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Fri, 29 Mar 2002 22:16:38 +0000
parents 84ff52bf6d2f
children 31f1fc31fd45
files lisp/textmodes/xml-lite.el
diffstat 1 files changed, 16 insertions(+), 74 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/textmodes/xml-lite.el	Fri Mar 29 20:10:46 2002 +0000
+++ b/lisp/textmodes/xml-lite.el	Fri Mar 29 22:16:38 2002 +0000
@@ -223,7 +223,11 @@
     (skip-chars-backward " \t\n")      ; Make sure we're not at indentation.
     (while
 	(and (or ignore (not (if full (eq full 'empty) context))
-		 (not (xml-lite-at-indentation-p)))
+		 (not (xml-lite-at-indentation-p))
+		 (and (not sgml-xml-mode) context
+		      (/= (point) (xml-lite-tag-start (car context)))
+		      (member-ignore-case (xml-lite-tag-name (car context))
+					  sgml-unclosed-tags)))
 	     (setq tag-info (xml-lite-parse-tag-backward)))
       
       ;; This tag may enclose things we thought were tags.  If so,
@@ -242,7 +246,16 @@
        ;; start-tag
        ((eq (xml-lite-tag-type tag-info) 'open)
 	(cond
-	 ((null ignore) (push tag-info context))
+	 ((null ignore)
+	  (if (and (not sgml-xml-mode) context
+		   (member-ignore-case (xml-lite-tag-name tag-info)
+				       sgml-unclosed-tags)
+		   (eq t (compare-strings
+			  (xml-lite-tag-name tag-info) nil nil
+			  (xml-lite-tag-name (car context)) nil nil t)))
+	      ;; There was an implicit end-tag.
+	      nil
+	    (push tag-info context)))
 	 ((eq t (compare-strings (xml-lite-tag-name tag-info) nil nil
 				 (car ignore) nil nil t))
 	  (setq ignore (cdr ignore)))
@@ -278,77 +291,6 @@
 
 ;; Indenting
 
-(defun xml-lite-calculate-indent ()
-  "Calculate the column to which this line should be indented."
-  (let* ((here (point))
-         (context (save-excursion (xml-lite-get-context)))
-         (ref-tag-info (car context))
-         (last-tag-info (car (last context))))
-
-    (save-excursion
-      (cond
-
-       ;; no context
-       ((null context) 0)
-
-       ;; inside a comment
-       ((eq 'comment (xml-lite-tag-type last-tag-info))
-        (let ((mark (looking-at "--")))
-          (goto-char (xml-lite-tag-start last-tag-info))
-	  (forward-char 2)
-	  (if mark (current-column)
-	    (forward-char 2)
-	    (+ (if (zerop (skip-chars-forward " \t")) 1 0)
-	       (current-column)))))
-
-       ;; inside a tag
-       ((xml-lite-inside-tag-p last-tag-info here)
-        
-        (let ((start-of-enclosing-string
-               (xml-lite-in-string-p (xml-lite-tag-start last-tag-info))))
-          (cond
-           ;; inside an attribute value
-           (start-of-enclosing-string
-            (goto-char start-of-enclosing-string)
-            (1+ (current-column)))
-           ;; if we have a tag-name, base indent on that
-           ((and (xml-lite-tag-name-end last-tag-info)
-                 (progn
-                   (goto-char (xml-lite-tag-name-end last-tag-info))
-                   (not (looking-at "[ \t]*$"))))
-            (1+ (current-column)))
-           ;; otherwise, add indent-offset
-           (t
-            (goto-char (xml-lite-tag-start last-tag-info))
-            (+ (current-column) xml-lite-basic-offset)))))
-
-       ;; inside an element
-       (t
-        ;; indent to start of tag
-        (let ((indent-offset xml-lite-basic-offset))
-          ;; add xml-lite-basic-offset, unless we're looking at the
-          ;; matching end-tag
-          (if (and (eq (length context) 1)
-                   (xml-lite-looking-at "</"))
-              (setq indent-offset 0))
-          (goto-char (xml-lite-tag-start ref-tag-info))
-          (+ (current-column) indent-offset)))
-
-       ))))
-
-(defun xml-lite-indent-line ()
-  "Indent the current line as XML."
-  (interactive)
-  (let* ((savep (point))
-	 (indent-col
-	  (save-excursion
-	    (back-to-indentation)
-	    (if (>= (point) savep) (setq savep nil))
-	    (xml-lite-calculate-indent))))
-    (if savep
-	(save-excursion (indent-line-to indent-col))
-      (indent-line-to indent-col))))
-
 
 ;; Editing shortcuts
 
@@ -431,7 +373,7 @@
 	(set (make-local-variable 'sgml-xml-mode) t)
         (set (make-local-variable 'xml-lite-orig-indent-line-function)
 	     indent-line-function)
-	(set (make-local-variable 'indent-line-function) 'xml-lite-indent-line))
+	(set (make-local-variable 'indent-line-function) 'sgml-indent-line))
     (kill-local-variable 'sgml-xml-mode)
     (setq indent-line-function xml-lite-orig-indent-line-function)))