* Do not call this function recursively.
*
* @param string $text Text we want to parse
+ * @param-taint $text escapes_htmlnoent
* @param Title $title
* @param ParserOptions $options
* @param bool $linestart
* @param bool $clearState
* @param int|null $revid Number to pass in {{REVISIONID}}
* @return ParserOutput A ParserOutput
+ * @return-taint escaped
*/
public function parse(
$text, Title $title, ParserOptions $options,
* $text are not expanded
*
* @param string $text Text extension wants to have parsed
+ * @param-taint $text escapes_htmlnoent
* @param bool|PPFrame $frame The frame to use for expanding any template variables
* @return string UNSAFE half-parsed HTML
+ * @return-taint escaped
*/
public function recursiveTagParse( $text, $frame = false ) {
// Avoid PHP 7.1 warning from passing $this by reference
* @since 1.25
*
* @param string $text Text extension wants to have parsed
+ * @param-taint $text escapes_htmlnoent
* @param bool|PPFrame $frame The frame to use for expanding any template variables
* @return string Fully parsed HTML
+ * @return-taint escaped
*/
public function recursiveTagParseFully( $text, $frame = false ) {
$text = $this->recursiveTagParse( $text, $frame );
// NOTE: try to get the RevisionObject even if mRevisionId is null.
// This is useful when parsing revision that has not yet been saved.
+ // However, if we get back a saved revision even though we are in
+ // preview mode, we'll have to ignore it, see below.
+ // NOTE: This callback may be used to inject an OLD revision that was
+ // already loaded, so "current" is a bit of a misnomer. We can't just
+ // skip it if mRevisionId is set.
$rev = call_user_func(
$this->mOptions->getCurrentRevisionCallback(), $this->getTitle(), $this
);
- # If the parse is for a new revision, then the callback should have
- # already been set to force the object and should match mRevisionId.
- # If not, try to fetch by mRevisionId for sanity.
+ if ( $this->mRevisionId === null && $rev && $rev->getId() ) {
+ // We are in preview mode (mRevisionId is null), and the current revision callback
+ // returned an existing revision. Ignore it and return null, it's probably the page's
+ // current revision, which is not what we want here. Note that we do want to call the
+ // callback to allow the unsaved revision to be injected here, e.g. for
+ // self-transclusion previews.
+ return null;
+ }
+
+ // If the parse is for a new revision, then the callback should have
+ // already been set to force the object and should match mRevisionId.
+ // If not, try to fetch by mRevisionId for sanity.
if ( $this->mRevisionId && $rev && $rev->getId() != $this->mRevisionId ) {
$rev = Revision::newFromId( $this->mRevisionId );
}