On 09/09/10 08:42, Chad wrote:
On Wed, Sep 8, 2010 at 3:07 PM, Daniel Barrett danb@vistaprint.com wrote:
What is the simplest, correct way to create a new Parser object with the same initialization as the current Parser object (e.g., $wgParser)? An actual code fragment would be great.
$myParser = clone $wgParser;
Or am I missing something here?
I'm afraid so. That's basically the same as making a new parser object, and then assigning each of the member variables in turn. So the object members (preprocessor, link holders, strip state, etc.), end up being handles to the same objects, which means that when you call the two parsers, they interfere with each other.
Parser::clearState() should be enough to fix this (or calling some parser method that calls clearState()), and that's what MessageCache::transform() relies on when it clones the parser. Parser::clearState() has some special hacks in it to clean up after a clone.
Previously I attempted to support extensions which want to clone the parser and then call it without calling clearState(), but I eventually gave up on that idea on the basis that it's unmaintainable. So now the options are clearState() or find some other way to do what it is you're doing.
On 09/09/10 05:07, Daniel Barrett wrote:
What is the simplest, correct way to create a new Parser object with the same initialization as the current Parser object (e.g., $wgParser)? An actual code fragment would be great.
$myParser = clone $wgParser; $myParser->preprocess(...); $myParser->parse(...);
Only call the entry points listed in the Parser class doc comment.
NOT:
$myParser->replaceVariables(...);
or something like that. If you're really desperate you can call Parser::startExternalParse() followed by some non-entry-point function.
-- Tim Starling