Index: /MediaWiki/trunk/plugins/mediawiki/fckplugin.js
===================================================================
--- /MediaWiki/trunk/plugins/mediawiki/fckplugin.js	(revision 1859)
+++ /MediaWiki/trunk/plugins/mediawiki/fckplugin.js	(revision 1860)
@@ -96,5 +96,5 @@
 
 		var stringBuilder = new Array() ;
-		this._AppendNode( rootNode, stringBuilder ) ;
+		this._AppendNode( rootNode, stringBuilder, '' ) ;
 		return stringBuilder.join( '' ).Trim() ;
 	},
@@ -132,5 +132,5 @@
 
 	// This function is based on FCKXHtml._AppendNode.
-	_AppendNode : function( htmlNode, stringBuilder )
+	_AppendNode : function( htmlNode, stringBuilder, prefix )
 	{
 		if ( !htmlNode )
@@ -223,5 +223,5 @@
 
 					if ( !basicElement[2] )
-						this._AppendChildNodes( htmlNode, stringBuilder ) ;
+						this._AppendChildNodes( htmlNode, stringBuilder, prefix ) ;
 
 					if ( basic1 )
@@ -236,8 +236,9 @@
 							var isFirstLevel = !htmlNode.parentNode.nodeName.IEquals( 'ul', 'ol', 'li' ) ;
 
-							this._AppendChildNodes( htmlNode, stringBuilder ) ;
-
-							if ( isFirstLevel )
+							this._AppendChildNodes( htmlNode, stringBuilder, prefix ) ;
+
+							if ( isFirstLevel ) {
 								stringBuilder.push( '\n' ) ;
+							}
 
 							break ;
@@ -245,5 +246,7 @@
 						case 'li' :
 
-							stringBuilder.push( '\n' ) ;
+							if ( stringBuilder.length > 1 && stringBuilder[ stringBuilder.length - 1 ] != "*" && stringBuilder[ stringBuilder.length - 1 ] != "#") {
+								stringBuilder.push( '\n' ) ;
+							}
 
 							var listPrefix = '' ;
@@ -256,4 +259,8 @@
 								else if ( parent.nodeName.toLowerCase() == 'ol' )
 									listPrefix = '#' + listPrefix ;
+								else if ( parent.nodeName.toLowerCase() == 'dt' )
+									listPrefix = ';' + listPrefix ;
+								else if ( parent.nodeName.toLowerCase() == 'dd' )
+									listPrefix = ':' + listPrefix ;
 								else if ( parent.nodeName.toLowerCase() != 'li' )
 									break ;
@@ -264,5 +271,5 @@
 							stringBuilder.push( listPrefix ) ;
 							stringBuilder.push( ' ' ) ;
-							this._AppendChildNodes( htmlNode, stringBuilder ) ;
+							this._AppendChildNodes( htmlNode, stringBuilder, listPrefix ) ;
 
 							break ;
@@ -292,5 +299,5 @@
 							{
 								stringBuilder.push( isWikiUrl? '|' : ' ' ) ;
-								this._AppendChildNodes( htmlNode, stringBuilder ) ;
+								this._AppendChildNodes( htmlNode, stringBuilder, prefix ) ;
 							}
 							stringBuilder.push( isWikiUrl ? ']]' : ']' ) ;
@@ -299,19 +306,26 @@
 							
 						case 'dl' :
-							stringBuilder.push( '\n' ) ;
-							this._AppendChildNodes( htmlNode, stringBuilder ) ;
-							if (stringBuilder.length > 0 && !stringBuilder[ stringBuilder.length - 1 ].EndsWith( '\n' ))
-								stringBuilder.push( '\n' ) ;
+							this._AppendChildNodes( htmlNode, stringBuilder, prefix ) ;
+							var isFirstLevel = !htmlNode.parentNode.nodeName.IEquals( 'ul', 'ol', 'li', 'dl', 'dd' ) ;
+							if (isFirstLevel)
+								stringBuilder.push( '\n') ;
 							break ;
 
 						case 'dt' :
+							if( stringBuilder.length > 1 && stringBuilder[ stringBuilder.length - 1 ] != ";" && stringBuilder[ stringBuilder.length - 1 ] != ":" )
+							{
+								stringBuilder.push( '\n' + prefix ) ;
+							}
 							stringBuilder.push( ';' ) ;
-							this._AppendChildNodes( htmlNode, stringBuilder ) ;
+							this._AppendChildNodes( htmlNode, stringBuilder, prefix ) ;
 							break ;
 
 						case 'dd' :
+							if ( stringBuilder.length > 1 && stringBuilder[ stringBuilder.length - 1 ] != ":" )
+							{
+								stringBuilder.push( '\n' + prefix ) ;
+							}
 							stringBuilder.push( ':' ) ;
-							this._AppendChildNodes( htmlNode, stringBuilder ) ;
-							stringBuilder.push( '\n' ) ;
+							this._AppendChildNodes( htmlNode, stringBuilder, prefix + ":" ) ;
 							break ;
 							
@@ -328,5 +342,5 @@
 							{
 								stringBuilder.push( '|+ ' ) ;
-								this._AppendChildNodes( htmlNode.caption, stringBuilder ) ;
+								this._AppendChildNodes( htmlNode.caption, stringBuilder, prefix ) ;
 								stringBuilder.push( '\n' ) ;
 							}
@@ -356,5 +370,5 @@
 
 									this._IsInsideCell = true ;
-									this._AppendChildNodes( htmlNode.rows[r].cells[c], stringBuilder ) ;
+									this._AppendChildNodes( htmlNode.rows[r].cells[c], stringBuilder, prefix ) ;
 									this._IsInsideCell = false ;
 
@@ -478,5 +492,5 @@
 								stringBuilder.push( "\n " ) ;
 								this._inLSpace = true ;
-								this._AppendChildNodes( htmlNode, stringBuilder ) ;
+								this._AppendChildNodes( htmlNode, stringBuilder, prefix ) ;
 								this._inLSpace = false ;
 								if ( stringBuilder[stringBuilder.length-2] == "\n" && stringBuilder[stringBuilder.length-1] == " " )
@@ -495,5 +509,5 @@
 								stringBuilder.push( '>' ) ;
 								this._inPre = true ;
-								this._AppendChildNodes( htmlNode, stringBuilder ) ;
+								this._AppendChildNodes( htmlNode, stringBuilder, prefix ) ;
 								this._inPre = false ;
 								stringBuilder.push( '<\/' ) ;
@@ -513,5 +527,5 @@
 
 							stringBuilder.push( '>' ) ;
-							this._AppendChildNodes( htmlNode, stringBuilder ) ;
+							this._AppendChildNodes( htmlNode, stringBuilder, prefix ) ;
 							stringBuilder.push( '<\/' ) ;
 							stringBuilder.push( sNodeName ) ;
@@ -578,5 +592,5 @@
 	},
 
-	_AppendChildNodes : function( htmlNode, stringBuilder, isBlockElement )
+	_AppendChildNodes : function( htmlNode, stringBuilder, listPrefix )
 	{
 		var child = htmlNode.firstChild ;
@@ -584,5 +598,5 @@
 		while ( child )
 		{
-			this._AppendNode( child, stringBuilder ) ;
+			this._AppendNode( child, stringBuilder, listPrefix ) ;
 			child = child.nextSibling ;
 		}
