Jackmcbarn has uploaded a new change for review.
https://gerrit.wikimedia.org/r/160572
Change subject: Use RevisionFromTitle instead of a template callback
......................................................................
Use RevisionFromTitle instead of a template callback
RevisionFromTitle will catch things like Scribunto's getContent() and the
REVISIONUSER/REVISIONTIMESTAMP parser functions. Use it in place of the
template callback, and also avoid duplicating a lot of logic from
statelessFetchTemplate.
Bug: 70495
Change-Id: Idefaa89e665a0caf7b47b6f67649b6a87b524ff4
---
M TemplateSandbox.hooks.php
1 file changed, 23 insertions(+), 83 deletions(-)
git pull
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/TemplateSandbox
refs/changes/72/160572/1
diff --git a/TemplateSandbox.hooks.php b/TemplateSandbox.hooks.php
index ad964b5..3ab7bf7 100644
--- a/TemplateSandbox.hooks.php
+++ b/TemplateSandbox.hooks.php
@@ -1,17 +1,5 @@
<?php
class TemplateSandboxHooks {
- private static $template = null;
-
- /**
- * @var Content
- */
- private static $content = null;
-
- /**
- * @var callback
- */
- private static $oldTemplateCallback = null;
-
/**
* Hook for EditPage::importFormData to parse our new form fields, and
if
* necessary put $editpage into "preview" mode.
@@ -54,9 +42,11 @@
/**
* @param Title $templatetitle
+ * @param Content $content
+ * @param User $user
* @return ScopedCallback to clean up
*/
- private static function fakePageExists( $templatetitle ) {
+ private static function setFakePageHooks( $templatetitle, $content,
$user ) {
global $wgHooks;
$wgHooks['TitleExists']['TemplateSandbox'] =
function( $title, &$exists ) use( $templatetitle ) {
@@ -64,10 +54,26 @@
$exists = true;
}
};
+ $wgHooks['RevisionFromTitle']['TemplateSandbox'] =
+ function( $title, &$id, &$revision ) use(
$templatetitle, $content, $user ) {
+ if ( $templatetitle->equals( $title ) ) {
+ $revision = new Revision( array(
+ 'page' =>
$templatetitle->getArticleID(),
+ 'user_text' => $user->getName(),
+ 'user' => $user->getId(),
+ 'parent_id' =>
$templatetitle->getLatestRevId(),
+ 'title' => $templatetitle,
+ 'content' => $content
+ ) );
+ return false;
+ }
+ return true;
+ };
LinkCache::singleton()->clearBadLink(
$templatetitle->getPrefixedDBkey() );
return new ScopedCallback( function() use( $templatetitle ) {
global $wgHooks;
unset( $wgHooks['TitleExists']['TemplateSandbox'] );
+ unset( $wgHooks['RevisionFromTitle']['TemplateSandbox']
);
LinkCache::singleton()->clearLink( $templatetitle );
} );
}
@@ -127,7 +133,6 @@
$parserOutput = null;
try {
- TemplateSandboxHooks::$template =
$templatetitle->getFullText();
if ( $editpage->sectiontitle !== '' ) {
$sectionTitle = $editpage->sectiontitle;
} else {
@@ -135,14 +140,14 @@
}
if ( $editpage->getArticle()->exists() ) {
- TemplateSandboxHooks::$content =
$editpage->getArticle()->replaceSectionContent(
+ $fakeContent =
$editpage->getArticle()->replaceSectionContent(
$editpage->section, $content,
$sectionTitle, $editpage->edittime
);
} else {
if ( $editpage->section === 'new' ) {
$content = $content->addSectionHeader(
$sectionTitle );
}
- TemplateSandboxHooks::$content = $content;
+ $fakeContent = $content;
}
// Apply PST to the to-be-saved text
@@ -152,9 +157,7 @@
$popts->setEditSection( false );
$popts->setIsPreview( true );
$popts->setIsSectionPreview( false );
- TemplateSandboxHooks::$content =
TemplateSandboxHooks::$content->preSaveTransform(
- $templatetitle, $wgUser, $popts
- );
+ $fakeContent = $fakeContent->preSaveTransform(
$templatetitle, $wgUser, $popts );
$note = wfMessage( 'templatesandbox-previewnote',
$title->getFullText() )->plain() .
' [[#' . EditPage::EDITFORM_ID . '|' .
$wgLang->getArrow() . ' ' .
@@ -165,10 +168,7 @@
$popts->setEditSection( false );
$popts->setIsPreview( true );
$popts->setIsSectionPreview( false );
- TemplateSandboxHooks::$oldTemplateCallback =
$popts->setTemplateCallback(
- 'TemplateSandboxHooks::templateCallback'
- );
- $fakePageExistsScopedCallback = self::fakePageExists(
$templatetitle );
+ $fakePageExistsScopedCallback = self::setFakePageHooks(
$templatetitle, $fakeContent, $wgUser );
$popts->enableLimitReport();
$rev = Revision::newFromTitle( $title );
@@ -211,66 +211,6 @@
wfProfileOut( __METHOD__ );
return false;
- }
-
- /**
- * @param $title Title
- * @param $parser Parser|bool
- * @return array|mixed
- */
- static function templateCallback( $title, $parser = false ) {
- global $wgUser;
-
- // Note that Parser::statelessFetchTemplate currently only
handles one
- // level of redirection, regardless of $wgMaxRedirects. We
reproduce
- // this behavior here.
- $match = ( $title->getFullText() ==
TemplateSandboxHooks::$template );
- $rtitle = null;
- if ( !$match && $title->isRedirect() ) {
- $rtitle = WikiPage::factory( $title
)->getRedirectTarget();
- $match = ( $rtitle->getFullText() ==
TemplateSandboxHooks::$template );
- }
- if ( $match ) {
- $deps[] = array(
- 'title' => $title,
- 'page_id' => $title->getArticleID(),
- 'rev_id' => 0,
- );
- $finalTitle = $title;
- if ( $rtitle ) {
- $deps[] = array(
- 'title' => $rtitle,
- 'page_id' => $rtitle->getArticleID(),
- 'rev_id' => 0,
- );
- $finalTitle = $rtitle;
- }
-
- $content = TemplateSandboxHooks::$content;
- if ( !$rtitle && $content->isRedirect() ) {
- $newTitle = $content->getRedirectTarget();
- $rev = Revision::newFromTitle( $newTitle );
- if ( $rev ) {
- $content = $rev->getContent(
Revision::FOR_THIS_USER, $wgUser );
- $finalTitle = $newTitle;
- }
- $deps[] = array(
- 'title' => $newTitle,
- 'page_id' => $newTitle->getArticleID(),
- 'rev_id' => 0,
- );
- }
- $text = $content->getWikitextForTransclusion();
- if ( $text === null ) {
- $text = false;
- }
- return array(
- 'text' => $text,
- 'finalTitle' => $finalTitle,
- 'deps' => $deps,
- );
- }
- return call_user_func(
TemplateSandboxHooks::$oldTemplateCallback, $title, $parser );
}
/**
--
To view, visit https://gerrit.wikimedia.org/r/160572
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Idefaa89e665a0caf7b47b6f67649b6a87b524ff4
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/TemplateSandbox
Gerrit-Branch: master
Gerrit-Owner: Jackmcbarn <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits