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 ); }