--- ParserOld.php	2005-08-23 12:39:43.000000000 +0000
+++ Parser.php	2005-08-23 12:57:30.000000000 +0000
@@ -103,6 +103,8 @@
 	var $mVariables, $mIncludeCount, $mArgStack, $mLastSection, $mInPre;
 	var $mInterwikiLinkHolders, $mLinkHolders;
 
+	var $mStripStateClear;
+
 	# Temporary:
 	var $mOptions, $mTitle, $mOutputType,
 	    $mTemplates,	// cache of already loaded templates, avoids
@@ -188,6 +190,7 @@
 
 		wfRunHooks( 'ParserBeforeStrip', array( &$this, &$text, &$x ) );
 		$text = $this->strip( $text, $x );
+		$text = $this->stripExtensions( $text, $x );
 		wfRunHooks( 'ParserAfterStrip', array( &$this, &$text, &$x ) );
 
 		$text = $this->internalParse( $text );
@@ -343,7 +346,6 @@
 		$math_content = array();
 		$pre_content = array();
 		$comment_content = array();
-		$ext_content = array();
 		$ext_tags = array();
 		$ext_params = array();
 		$gallery_content = array();
@@ -419,6 +421,47 @@
 			}
 		}
 
+		if ($state) {
+			$this->mStripStateClear = false;
+			$state['html'] = $state['html'] + $html_content;
+			$state['nowiki'] = $state['nowiki'] + $nowiki_content;
+			$state['math'] = $state['math'] + $math_content;
+			$state['pre'] = $state['pre'] + $pre_content;
+			$state['comment'] = $state['comment'] + $comment_content;
+			$state['gallery'] = $state['gallery'] + $gallery_content;
+		} else {
+			$this->mStripStateClear = true;
+			$state = array(
+			 'html' => $html_content,
+			 'nowiki' => $nowiki_content,
+			 'math' => $math_content,
+			 'pre' => $pre_content,
+			 'comment' => $comment_content,
+			 'gallery' => $gallery_content,
+			);
+		}
+		return $text;
+	}
+
+	/**
+	 * Strips and renders extensions
+	 * If $render is set, performs necessary rendering operations on plugins
+	 * Returns the text, and fills an array with data needed in unstrip()
+	 * If the $state is already a valid strip state, it adds to the state
+	 *
+	 * @param bool $stripcomments when set, HTML comments <!-- like this -->
+	 *  will be stripped in addition to other tags. This is important
+	 *  for section editing, where these comments cause confusion when
+	 *  counting the sections in the wikisource
+	 *
+	 * @access private
+	 */
+	function stripExtensions( $text, &$state, $stripcomments = false ) {
+		$render = ($this->mOutputType == OT_HTML);
+		$ext_content = array();
+		# Replace any instances of the placeholders
+		$uniq_prefix = UNIQ_PREFIX;
+		
 		# Extensions
 		foreach ( $this->mTagHooks as $tag => $callback ) {
 			$ext_content[$tag] = array();
@@ -436,28 +479,14 @@
 		}
 
 		# Merge state with the pre-existing state, if there is one
-		if ( $state ) {
-			$state['html'] = $state['html'] + $html_content;
-			$state['nowiki'] = $state['nowiki'] + $nowiki_content;
-			$state['math'] = $state['math'] + $math_content;
-			$state['pre'] = $state['pre'] + $pre_content;
-			$state['comment'] = $state['comment'] + $comment_content;
-			$state['gallery'] = $state['gallery'] + $gallery_content;
-
+		if ( !$this->mStripStateClear ) {
 			foreach( $ext_content as $tag => $array ) {
 				if ( array_key_exists( $tag, $state ) ) {
 					$state[$tag] = $state[$tag] + $array;
 				}
 			}
 		} else {
-			$state = array(
-			  'html' => $html_content,
-			  'nowiki' => $nowiki_content,
-			  'math' => $math_content,
-			  'pre' => $pre_content,
-			  'comment' => $comment_content,
-			  'gallery' => $gallery_content,
-			) + $ext_content;
+			$state = $state + $ext_content;
 		}
 		return $text;
 	}
@@ -2280,9 +2309,13 @@
 
 			if( $this->mOutputType == OT_HTML ) {
 				$text = $this->strip( $text, $this->mStripState );
-				$text = Sanitizer::removeHTMLtags( $text, array( &$this, 'replaceVariables' ), $assocArgs );
 			}
 			$text = $this->replaceVariables( $text, $assocArgs );
+			$text = $this->stripExtensions( $text, $this->mStripState );
+			
+			if ( $this->mOutputType == OT_HTML ) {
+				$text = Sanitizer::removeHTMLtags( $text, array( &$this, 'replaceVariables' ), $assocArgs );
+			}
 
 			# Resume the link cache and register the inclusion as a link
 			if ( $this->mOutputType == OT_HTML && !is_null( $title ) ) {
@@ -2827,6 +2860,7 @@
 		);
 		$text = str_replace( array_keys( $pairs ), array_values( $pairs ), $text );
 		$text = $this->strip( $text, $stripState, false );
+		$text = $this->stripExtensions( $text, $stripState, false );
 		$text = $this->pstPass2( $text, $user );
 		$text = $this->unstrip( $text, $stripState );
 		$text = $this->unstripNoWiki( $text, $stripState );

