User:Duesentrieb/PPCustomFrame

Index: includes/parser/Preprocessor_Hash.php
===================================================================
--- includes/parser/Preprocessor_Hash.php	(Revision 36636)
+++ includes/parser/Preprocessor_Hash.php	(Arbeitskopie)
@@ -17,6 +17,10 @@
 		return new PPFrame_Hash( $this );
 	}
 
+	function newCustomFrame( $args ) {
+		return new PPCustomFrame_Hash( $this, $args );
+	}
+
 	/**
 	 * Preprocess some wikitext and return the document tree.
 	 * This is the ghost of Parser::replace_variables().
@@ -1209,8 +1213,46 @@
 }
 
 /**
+ * Expansion frame with custom arguments
  * @ingroup Parser
  */
+class PPCustomFrame_Hash extends PPFrame_Hash {
+	var $args;
+
+	function __construct( $preprocessor, $args ) {
+		$this->preprocessor = $preprocessor;
+		$this->parser = $preprocessor->parser;
+		$this->args = $args;
+	}
+
+	function __toString() {
+		$s = 'cstmframe{';
+		$first = true;
+		foreach ( $this->args as $name => $value ) {
+			if ( $first ) {
+				$first = false;
+			} else {
+				$s .= ', ';
+			}
+			$s .= "\"$name\":\"" .
+				str_replace( '"', '\\"', $value->__toString() ) . '"';
+		}
+		$s .= '}';
+		return $s;
+	}
+
+	function isEmpty() {
+		return !count( $this->args );
+	}
+
+	function getArgument( $index ) {
+		return $this->args[$index];
+	}
+}
+
+/**
+ * @ingroup Parser
+ */
 class PPNode_Hash_Tree implements PPNode {
 	var $name, $firstChild, $lastChild, $nextSibling;
 
Index: includes/parser/Parser.php
===================================================================
--- includes/parser/Parser.php	(Revision 36636)
+++ includes/parser/Parser.php	(Arbeitskopie)
@@ -2645,7 +2645,9 @@
 	 *  self::OT_HTML: all templates and extension tags
 	 *
 	 * @param string $tex The text to transform
-	 * @param PPFrame $frame Object describing the arguments passed to the template
+	 * @param PPFrame $frame Object describing the arguments passed to the template. 
+	 *        Arguments may also be provided as an associative array, as was the usual case before MW1.12.
+	 *        Providing arguments this way may be useful for extensions wishing to perform variable replacement explicitly.
 	 * @param bool $argsOnly Only do argument (triple-brace) expansion, not double-brace expansion
 	 * @private
 	 */
@@ -2661,7 +2663,8 @@
 		if ( $frame === false ) {
 			$frame = $this->getPreprocessor()->newFrame();
 		} elseif ( !( $frame instanceof PPFrame ) ) {
-			throw new MWException( __METHOD__ . ' called using the old argument format' );
+			wfDebug( __METHOD__." called using plain parameters instead of a PPFrame instance. Creating custom frame.\n" );
+			$frame = $this->getPreprocessor()->newCustomFrame($frame);
 		}
 
 		$dom = $this->preprocessToDom( $text );
Index: includes/parser/Preprocessor_DOM.php
===================================================================
--- includes/parser/Preprocessor_DOM.php	(Revision 36636)
+++ includes/parser/Preprocessor_DOM.php	(Arbeitskopie)
@@ -23,6 +23,10 @@
 		return new PPFrame_DOM( $this );
 	}
 
+	function newCustomFrame( $args ) {
+		return new PPCustomFrame_DOM( $this, $args );
+	}
+
 	function memCheck() {
 		if ( $this->memoryLimit === false ) {
 			return;
@@ -1254,8 +1258,46 @@
 }
 
 /**
+ * Expansion frame with custom arguments
  * @ingroup Parser
  */
+class PPCustomFrame_DOM extends PPFrame_DOM {
+	var $args;
+
+	function __construct( $preprocessor, $args ) {
+		$this->preprocessor = $preprocessor;
+		$this->parser = $preprocessor->parser;
+		$this->args = $args;
+	}
+
+	function __toString() {
+		$s = 'cstmframe{';
+		$first = true;
+		foreach ( $this->args as $name => $value ) {
+			if ( $first ) {
+				$first = false;
+			} else {
+				$s .= ', ';
+			}
+			$s .= "\"$name\":\"" .
+				str_replace( '"', '\\"', $value->__toString() ) . '"';
+		}
+		$s .= '}';
+		return $s;
+	}
+
+	function isEmpty() {
+		return !count( $this->args );
+	}
+
+	function getArgument( $index ) {
+		return $this->args[$index];
+	}
+}
+
+/**
+ * @ingroup Parser
+ */
 class PPNode_DOM implements PPNode {
 	var $node;
 
Index: includes/parser/Preprocessor.php
===================================================================
--- includes/parser/Preprocessor.php	(Revision 36636)
+++ includes/parser/Preprocessor.php	(Arbeitskopie)
@@ -10,6 +10,9 @@
 	/** Create a new top-level frame for expansion of a page */
 	function newFrame();
 
+	/** Create a new custom frame for programmatic use of parameter replacement as used in some extensions */
+	function newCustomFrame( $args );
+
 	/** Preprocess text to a PPNode */
 	function preprocessToObj( $text, $flags = 0 );
 }