On 09/09/10 08:42, Chad wrote:
On Wed, Sep 8, 2010 at 3:07 PM, Daniel Barrett
<danb(a)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