Переглянути джерело

2006-08-10 Atsushi Enomoto <[email protected]>

	* XmlTextWriter2.cs : more indentation fixes. Now I believe it is
	  almost MS compat, but it won't help poor Mike.

	* XmlTextWriterTests.cs : more indentation tests.


svn path=/trunk/mcs/; revision=63574
Atsushi Eno 19 роки тому
батько
коміт
fc826ee0c8

+ 5 - 0
mcs/class/System.XML/System.Xml/ChangeLog

@@ -1,3 +1,8 @@
+2006-08-10  Atsushi Enomoto <[email protected]>
+
+	* XmlTextWriter2.cs : more indentation fixes. Now I believe it is
+	  almost MS compat, but it won't help poor Mike.
+
 2006-08-07  Atsushi Enomoto <[email protected]>
 
 	* XmlTextWriter2.cs : WriteBinHex() is allowed at Attribute state.

+ 29 - 21
mcs/class/System.XML/System.Xml/XmlTextWriter2.cs

@@ -749,16 +749,20 @@ namespace Mono.Xml
 			CloseStartElementCore ();
 
 			nsmanager.PopScope ();
-			bool doIndent = !elements [open_count - 1].HasSimple;
-			if (open_count > 1)
-				doIndent &= !elements [open_count - 2].HasSimple;
+
+			if (state == WriteState.Element) {
+				if (full)
+					writer.Write ('>');
+				else
+					writer.Write (" />");
+			}
+
+			if (full || state == WriteState.Content)
+				WriteIndentEndElement ();
+
 			XmlNodeInfo info = elements [--open_count];
 
 			if (full || state == WriteState.Content) {
-				if (state == WriteState.Element)
-					writer.Write ('>');
-				if (doIndent && (full || !isEmpty))
-					DoWriteIndent ();
 				writer.Write ("</");
 				if (info.Prefix.Length > 0) {
 					writer.Write (info.Prefix);
@@ -766,8 +770,6 @@ namespace Mono.Xml
 				}
 				writer.Write (info.LocalName);
 				writer.Write ('>');
-			} else {
-				writer.Write (" />");
 			}
 
 			state = WriteState.Content;
@@ -1215,21 +1217,25 @@ namespace Mono.Xml
 
 		void WriteIndent ()
 		{
-			if (!indent || (open_count > 0 &&
-			    elements [open_count - 1].HasSimple))
-				return;
-			if (state != WriteState.Start)
-				writer.Write (newline);
-			for (int i = 0; i < open_count; i++)
-				writer.Write (indent_string);
+			WriteIndentCore (0);
+		}
+
+		void WriteIndentEndElement ()
+		{
+			WriteIndentCore (-1);
 		}
 
-		void DoWriteIndent ()
+		void WriteIndentCore (int nestFix)
 		{
 			if (!indent)
 				return;
-			writer.Write (newline);
-			for (int i = 0; i < open_count; i++)
+			for (int i = open_count - 1; i >= 0; i--)
+				if (elements [i].HasSimple)
+					return;
+
+			if (state != WriteState.Start)
+				writer.Write (newline);
+			for (int i = 0; i < open_count + nestFix; i++)
 				writer.Write (indent_string);
 		}
 
@@ -1274,8 +1280,10 @@ namespace Mono.Xml
 
 		void CheckMixedContentState ()
 		{
-			if (open_count > 0 &&
-			    state != WriteState.Attribute)
+//			if (open_count > 0 &&
+//			    state != WriteState.Attribute)
+//				elements [open_count - 1].HasSimple = true;
+			if (open_count > 0)
 				elements [open_count - 1].HasSimple = true;
 		}
 

+ 4 - 0
mcs/class/System.XML/Test/System.Xml/ChangeLog

@@ -1,3 +1,7 @@
+2006-08-10  Atsushi Enomoto <[email protected]>
+
+	* XmlTextWriterTests.cs : more indentation tests.
+
 2006-08-07  Atsushi Enomoto <[email protected]>
 
 	* XmlTextWriterTests.cs : test for #79019.

+ 31 - 0
mcs/class/System.XML/Test/System.Xml/XmlTextWriterTests.cs

@@ -1856,6 +1856,37 @@ namespace MonoTests.System.Xml
 				sw.ToString ());
 		}
 
+		[Test]
+		public void Indent3 ()
+		{
+			XmlDocument doc = new XmlDocument ();
+			doc.PreserveWhitespace = true;
+			string s;
+
+			doc.LoadXml ("<root><element></element><!-- comment indented --><element>sample <!-- comment non-indented --></element></root>");
+			s = GetIndentedOutput (doc.DocumentElement);
+			Assert.AreEqual (s, String.Format ("<root>{0}  <element>{0}  </element>{0}  <!-- comment indented -->{0}  <element>sample <!-- comment non-indented --></element>{0}</root>", "\n"), "#1");
+
+			doc.LoadXml ("<root> \n<mid> \n<mid>   \n<child attr='value'>sample <nested attr='value' /> string</child>     <child2 attr='value'>sample string</child2>  <empty attr='value'/>\n<a>test</a> \n</mid> <returnValue>  <returnType>System.String</returnType>  </returnValue>  </mid>   </root>");
+			s = GetIndentedOutput (doc.DocumentElement);
+			Assert.AreEqual (s, String.Format ("<root> {0}<mid> {0}<mid>   {0}<child attr='value'>sample <nested attr='value' /> string</child>     <child2 attr='value'>sample string</child2>  <empty attr='value' />{0}<a>test</a> {0}</mid> <returnValue>  <returnType>System.String</returnType>  </returnValue>  </mid>   </root>", "\n"), "#2");
+
+			doc.LoadXml ("<!-- after /MemberType and after /returnValue --><root><MemberType>blah</MemberType>\n  <returnValue><returnType>System.String</returnType></returnValue>\n  <Docs><summary>text</summary><value>text<see cref='ttt' /></value><remarks/></Docs></root>");
+			s = GetIndentedOutput (doc.DocumentElement);
+			Assert.AreEqual (s, String.Format ("<root>{0}  <MemberType>blah</MemberType>{0}  <returnValue><returnType>System.String</returnType></returnValue>{0}  <Docs><summary>text</summary><value>text<see cref='ttt' /></value><remarks /></Docs></root>", "\n"), "#3");
+		}
+
+		string GetIndentedOutput (XmlNode n)
+		{
+			StringWriter sw = new StringWriter ();
+			sw.NewLine = "\n";
+			XmlTextWriter xtw = new XmlTextWriter (sw);
+			xtw.QuoteChar = '\'';
+			xtw.Formatting = Formatting.Indented;
+			n.WriteTo (xtw);
+			return sw.ToString ();
+		}
+
 		[Test]
 		public void CloseTwice ()
 		{