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