Wikia code/includes/EditPage.php

From mediawiki.org
--- D:\Programming\SVN\mediawiki\branches\REL1_16\phase3\includes\EditPage.php	2011-07-18 22:31:28.113281300 +0100
+++ D:\Programming\SVN\wikia\trunk\includes\EditPage.php	2011-08-17 15:28:46.476562500 +0100
@@ -75,6 +75,11 @@
 	var $edittime = '', $section = '', $starttime = '';
 	var $oldid = 0, $editintro = '', $scrolltop = null, $bot = true;
 
+	// wikia changes begin
+	var $login = false, $autosave = false;
+	public $customOutputPage = null;
+	// wikia changes end
+
 	# Placeholders for text injection by hooks (must be HTML)
 	# extensions should take care to _append_ to the present value
 	public $editFormPageTop; // Before even the preview
@@ -179,6 +184,9 @@
 					!$oldrev->isDeleted( Revision::DELETED_TEXT ) ) {
 
 					$undotext = $this->mArticle->getUndoText( $undorev, $oldrev );
+
+					wfRunHooks( 'EditPage::getContent::end', array( &$this, $undotext, $undorev, $oldrev  ) );
+
 					if ( $undotext === false ) {
 						# Warn the user that something went wrong
 						$this->editFormPageTop .= $wgOut->parse( '<div class="error mw-undo-failure">' . wfMsgNoTrans( 'undo-failure' ) . '</div>' );
@@ -209,6 +217,9 @@
 				}
 			}
 		}
+		// wikia changes begin
+		wfRunHooks( 'EditPage::getContent::end', array( &$this, &$text ) );
+		// wikia changes end
 
 		wfProfileOut( __METHOD__ );
 		return $text;
@@ -239,6 +250,11 @@
 					// TODO FIXME: AAAAAAAAAAA, this shouldn't be implementing
 					// its own mini-parser! -ævar
 					$text = preg_replace( '~</?includeonly>~', '', $text );
+
+					// wikia changes begin: Remove <noinclude> - Datrio
+					$text = preg_replace( '/<noinclude>.*<\/noinclude>/', '', $text );
+					// wikia changes end
+
 					return $text;
 				} else
 					return '';
@@ -310,7 +326,12 @@
 			$this->preview = true;
 		}
 
+		/* Wikia change begin - @author: Marcin, #BugId: 7845 */
+		global $wgEnableEditPageReskinExt;
+		if ( empty($wgEnableEditPageReskinExt) || !Wikia::isOasis() ) {
 		$wgOut->addScriptFile( 'edit.js' );
+		}
+		/* Wikia change end */
 		
 		if ( $wgUser->getOption( 'uselivepreview', false ) ) {
 			$wgOut->includeJQuery();
@@ -328,6 +349,8 @@
 		} else {
 			if ( $this->save ) {
 				$this->formtype = 'save';
+			} else if ( $this->login ) {
+				// wikia change but what is purpose for it?
 			} else if ( $this->preview ) {
 				$this->formtype = 'preview';
 			} else if ( $this->diff ) {
@@ -338,6 +361,9 @@
 					$this->formtype = 'preview';
 				} else {
 					$this->formtype = 'initial';
+					// wikia changes begin
+					$this->autosave = $wgRequest->getBool( 'autosave' );
+					// wikia changes end
 				}
 			}
 		}
@@ -361,7 +387,10 @@
 			$this->showIntro();
 
 		if ( $this->mTitle->isTalkPage() ) {
-			$wgOut->addWikiMsg( 'talkpagetext' );
+			// Wikia change - start
+			// BugId:7092
+			$wgOut->wrapWikiMsg('<div id="talkpagetext">$1</div>',  'talkpagetext');
+			// Wikia change - end
 		}
 
 		# Optional notices on a per-namespace and per-page basis
@@ -440,7 +469,12 @@
 	 * Redirect to the article page if redlink=1
 	 */
 	function readOnlyPage( $source = null, $protected = false, $reasons = array(), $action = null ) {
-		global $wgRequest, $wgOut;
+		global $wgRequest;
+		// Wikia - start - @author: ADi - removed wgOut from global to allow injecting it
+		// define wgOut
+		$wgOut = !empty($this->customOutputPage) ? $this->customOutputPage : $GLOBALS['wgOut'];
+		// Wikia - end
+
 		if ( $wgRequest->getBool( 'redlink' ) ) {
 			// The edit page was reached via a red link.
 			// Redirect to the article page and let them click the edit tab if
@@ -596,6 +630,13 @@
 				$this->allowBlankSummary = $request->getBool( 'wpIgnoreBlankSummary' ) || !$wgUser->getOption( 'forceeditsummary');
 			}
 
+			// wikia changes begin
+			if ( $request->getBool( 'wpLogin' ) ) {
+				$this->login = true;
+				$this->preview = false;
+			}
+			// wikia changes end
+
 			$this->autoSumm = $request->getText( 'wpAutoSummary' );
 		} else {
 			# Not a posted form? Start with nothing.
@@ -635,6 +676,10 @@
 			// Custom edit intro for new sections
 			$this->section === 'new' ? 'MediaWiki:addsection-editintro' : '' );
 
+		// wikia changes begin
+		wfRunHooks( 'EditPage::importFormData::finished', array( &$this, $request ) );
+		// wikia changes end
+
 		wfProfileOut( __METHOD__ );
 
 		// Allow extensions to modify form data
@@ -979,6 +1024,7 @@
 
 		# Handle the user preference to force summaries here, but not for null edits
 		if ( $this->section != 'new' && !$this->allowBlankSummary && 0 != strcmp( $oldtext, $text )
+			&& $wgUser->getOption( 'forceeditsummary')
 			&& !Title::newFromRedirect( $text ) ) # check if it's not a redirect
 		{
 			if ( md5( $this->summary ) == $this->autoSumm ) {
@@ -1117,7 +1163,18 @@
 	 */
 	function initialiseForm() {
 		global $wgUser;
+
+
+		//Wikia Change
+		//https://wikia.fogbugz.com/default.asp?3319#21795
+		if ( ( !empty( $this->mArticle->mRevision ) && $this->mArticle->mRevision->isCurrent() ) || empty( $this->mArticle->mRevision ) ) {
 		$this->edittime = $this->mArticle->getTimestamp();
+		} else {
+			$rev = Revision::newFromTitle( $this->mTitle );
+			$this->edittime = $rev->getTimestamp();
+		}
+		//
+
 		$this->textbox1 = $this->getContent( false );
 		// activate checkboxes if user wants them to be always active
 		# Sort out the "watch" checkbox
@@ -1196,8 +1253,10 @@
 		# Enabled article-related sidebar, toplinks, etc.
 		$wgOut->setArticleRelated( true );
 
-		if ( $this->showHeader() === false )
+		if ( $this->showHeader() === false ) {
+			wfProfileOut( __METHOD__ );
 			return;
+		}
 
 		$action = htmlspecialchars($this->getActionURL($wgTitle));
 
@@ -1215,6 +1274,10 @@
 			$this->displayPreviewArea( $previewOutput, true );
 		}
 
+		// wikia change begin
+		wfRunHooks( 'EditPage::showEditForm:initial2', array( &$this ) ) ;
+		// wikia change end
+
 		$wgOut->addHTML( $this->editFormTextTop );
 
 		$templates = $this->getTemplates();
@@ -1233,15 +1296,33 @@
 			$toolbar = '';
 			// @todo move this to a cleaner conditional instead of blanking a variable
 		}
+		/* Wikia change begin - @author: macbre */
+		/* Allow EditPageLayout extension to wrap #EditPage section using <form> tag */
+		if (empty($this->dontWrapWithForm)) {
 		$wgOut->addHTML( <<<HTML
-{$toolbar}
 <form id="editform" name="editform" method="post" action="$action" enctype="multipart/form-data">
 HTML
 );
+			global $wgEnableEditPageReskinExt;
+			if ( empty($wgEnableEditPageReskinExt) ) {
+				$wgOut->addHTML( '<a name="EditPage"></a>' );
+			}
+		}
+		/* Wikia change end */
 
+		/* Wikia change begin - @author: Marooned */
+		/* used by captcha, CreatePage and maybe other extensions - moved above the toolbar  */
 		if ( is_callable( $formCallback ) ) {
 			call_user_func_array( $formCallback, array( &$wgOut ) );
 		}
+		/* Wikia change end */
+
+		/* Wikia change begin - @author: Marooned */
+		/* add possibility to add visible fields inside <form> but before toolbar - used in CreatePage  */
+		wfRunHooks( 'EditPage::showEditForm:beforeToolbar', array( &$this, &$wgOut ) );
+		/* Wikia change end */
+
+		$wgOut->addHTML( "$toolbar" );
 
 		wfRunHooks( 'EditPage::showEditForm:fields', array( &$this, &$wgOut ) );
 
@@ -1279,6 +1361,10 @@
 			$wgOut->addHTML( $this->getSummaryPreview( true, $this->summary ) );
 		}
 
+		// wikia change begin
+		wfRunHooks ('EditForm:BeforeDisplayingTextbox', array (&$this, &$hidden) ) ;
+		// wikia change end
+
 		$wgOut->addHTML( $this->editFormTextBeforeContent );
 		
 		if ( $this->isConflict ) {
@@ -1291,6 +1377,16 @@
 			$this->showContentForm();
 		}
 
+		// wikia change begin
+		wfRunHooks ('EditForm:AfterDisplayingTextbox', array (&$this, &$hidden) ) ;
+
+		$rows = $wgUser->getIntOption( 'rows' );
+		$cols = $wgUser->getIntOption( 'cols' );
+		$ew = $wgUser->getOption( 'editwidth' );
+
+		wfRunHooks( 'EditForm::MultiEdit:Form', array( $rows, $cols, $ew, htmlspecialchars( $this->safeUnicodeOutput( $this->textbox1 ) ) ) );
+		// wikia change end
+
 		$wgOut->addHTML( $this->editFormTextAfterContent );
 
 		$wgOut->addWikiText( $this->getCopywarn() );
@@ -1304,22 +1400,37 @@
 		$this->showTosSummary();
 		$this->showEditTools();
 
+		/* Wikia change begin - @author: Marooned */
+		/* Give a possibility to modify hiddencats container using MediaWiki hook  */
 		$wgOut->addHTML( <<<HTML
 {$this->editFormTextAfterTools}
 <div class='templatesUsed'>
 {$formattedtemplates}
 </div>
+HTML
+);
+		$categoriesText = <<<HTML
 <div class='hiddencats'>
 {$formattedhiddencats}
 </div>
 HTML
-);
+;
+		wfRunHooks( 'EditPage::CategoryBox', array( &$categoriesText ) );
+		$wgOut->addHTML( $categoriesText );
+		/* Wikia change end */
 
 		if ( $this->isConflict )
 			$this->showConflict();
 		
 		$wgOut->addHTML( $this->editFormTextBottom );
+
+		/* Wikia change begin - @author: macbre */
+		/* Allow EditPageLayout extension to wrap #EditPage section using <form> tag */
+		if (empty($this->dontWrapWithForm)) {
 		$wgOut->addHTML( "</form>\n" );
+		}
+		/* Wikia change end */
+
 		if ( !$wgUser->getOption( 'previewontop' ) ) {
 			$this->displayPreviewArea( $previewOutput, false );
 		}
@@ -1328,7 +1439,12 @@
 	}
 	
 	protected function showHeader() {
-		global $wgOut, $wgUser, $wgTitle, $wgMaxArticleSize, $wgLang;
+		// Wikia - start - @author: wladek - removed wgOut from global to allow injecting it
+		global $wgUser, $wgTitle, $wgMaxArticleSize, $wgLang;
+		// define wgOut
+		$wgOut = !empty($this->customOutputPage) ? $this->customOutputPage : $GLOBALS['wgOut'];
+		// Wikia - end
+
 		if ( $this->isConflict ) {
 			$wgOut->wrapWikiMsg( "<div class='mw-explainconflict'>\n$1</div>", 'explainconflict' );
 			$this->edittime = $this->mArticle->getTimestamp();
@@ -1384,9 +1500,14 @@
 				}
 
 				if ( !$this->mArticle->mRevision->isCurrent() ) {
+					/* Wikia change begin - @author: Marooned */
+					/* Add new hook and condition to allow alternate message to be displayed when editing old revision */
+					if ( wfRunHooks( 'EditPage::showEditForm:oldRevisionNotice', array( &$this ) ) ) {
 					$this->mArticle->setOldSubtitle( $this->mArticle->mRevision->getId() );
 					$wgOut->addWikiMsg( 'editingold' );
 				}
+					/* Wikia change end */
+				}
 			}
 		}
 
@@ -1398,7 +1519,17 @@
 			if ( $this->isCssJsSubpage ) {
 				# Check the skin exists
 				if ( !$this->isValidCssJsSubpage ) {
-					$wgOut->addWikiMsg( 'userinvalidcssjstitle', $wgTitle->getSkinFromCssJsSubpage() );
+					/* Wikia change begin - @author: Uberfuzzy */
+					$CssJsSubSkin = $wgTitle->getSkinFromCssJsSubpage();
+					if( $CssJsSubSkin == 'wikia' ) {
+						# rt75168, confusing "there is no wikia" message
+					} elseif( $CssJsSubSkin == 'global') {
+						# confusing "there is no global" message
+						#TODO: draft a message about what global css/js is, maybe link to help page if we still have one
+					} else {
+						$wgOut->addWikiMsg( 'userinvalidcssjstitle', $CssJsSubSkin );
+					}
+					/* Wikia change end */
 				}
 				if ( $this->formtype !== 'preview' ) {
 					if ( $this->isCssSubpage )
@@ -1543,8 +1674,12 @@
 
 	protected function showFormBeforeText() {
 		global $wgOut;
+
+		/* Wikia change begin - @author: Inez */
+		/* Make AjaxLogin work on EditPage without losing user changes */
 		$section = htmlspecialchars( $this->section );
 		$wgOut->addHTML( <<<INPUTS
+<input type='hidden' value="" name="wpLogin" id="wpLogin" />
 <input type='hidden' value="{$section}" name="wpSection" />
 <input type='hidden' value="{$this->starttime}" name="wpStarttime" />
 <input type='hidden' value="{$this->edittime}" name="wpEdittime" />
@@ -1549,8 +1684,8 @@
 <input type='hidden' value="{$this->starttime}" name="wpStarttime" />
 <input type='hidden' value="{$this->edittime}" name="wpEdittime" />
 <input type='hidden' value="{$this->scrolltop}" name="wpScrolltop" id="wpScrolltop" />
-
 INPUTS
+		/* Wikia change end */
 		);
 		if ( !$this->checkUnicodeCompliantBrowser() )
 			$wgOut->addHTML(Xml::hidden( 'safemode', '1' ));
@@ -1670,6 +1805,13 @@
 
 		$wgOut->addHTML( '</div>' );
 
+		/* Wikia change begin - @author: uknkown */
+		/* TODO: Find out what it is exactly for */
+		if ( $this->autosave ) {
+			$wgOut->addHTML( "<script type='text/javascript'>document.editform.wpPreview.click();</script>" );
+		}
+		/* Wikia change end */
+
 		if ( $this->formtype == 'diff') {
 			$this->showDiff();
 		}
@@ -1738,7 +1880,7 @@
 	
 	protected function showStandardInputs( &$tabindex = 2 ) {
 		global $wgOut, $wgUser;
-		$wgOut->addHTML( "<div class='editOptions'>\n" );
+		$wgOut->addHTML( "<div class='editOptions' id='editOptions'>\n" );
 
 		if ( $this->section != 'new' ) {
 			$this->showSummaryInput( false, $this->summary );
@@ -1747,6 +1889,11 @@
 
 		$checkboxes = $this->getCheckboxes( $tabindex, $wgUser->getSkin(),
 			array( 'minor' => $this->minoredit, 'watch' => $this->watchthis ) );
+
+		// wikia change begin, @author eloy
+		wfRunHooks ( 'EditPage::showEditForm:checkboxes', array ( &$this, &$checkboxes ) ) ;
+		// wikia change end
+
 		$wgOut->addHTML( "<div class='editCheckboxes'>" . implode( $checkboxes, "\n" ) . "</div>\n" );
 		$wgOut->addHTML( "<div class='editButtons'>\n" );
 		$wgOut->addHTML( implode( $this->getEditButtons( $tabindex ), "\n" ) . "\n" );
@@ -1754,7 +1901,7 @@
 		$cancel = $this->getCancelLink();
 		$separator = wfMsgExt( 'pipe-separator' , 'escapenoentities' );
 		$edithelpurl = Skin::makeInternalOrExternalUrl( wfMsgForContent( 'edithelppage' ) );
-		$edithelp = '<a target="helpwindow" href="'.$edithelpurl.'">'.
+		$edithelp = '<a target="helpwindow" href="'.$edithelpurl.'" id="wpEdithelp">'.
 			htmlspecialchars( wfMsg( 'edithelp' ) ).'</a> '.
 			htmlspecialchars( wfMsg( 'newwindow' ) );
 		$wgOut->addHTML( "	<span class='editHelp'>{$cancel}{$separator}{$edithelp}</span>\n" );
@@ -1822,6 +1969,16 @@
 
 		wfProfileIn( __METHOD__ );
 
+		// wikia change begin
+		// TODO: remove?
+		// @see https://trac.wikia-inc.com/changeset/6028
+		global $wgRequest;
+		if ($wgUser->getOption( 'showtoolbar' ) && !$wgUser->getOption( 'riched_disable' ) && !$this->previewOnOpen() ) {
+			$oldTextBox1 = $this->textbox1;
+			$this->importFormData( $wgRequest );
+		}
+		// wikia change end
+
 		if ( $this->mTriedSave && !$this->mTokenOk ) {
 			if ( $this->mTokenOkExceptSuffix ) {
 				$note = wfMsg( 'token_suffix_mismatch' );
@@ -1898,6 +2055,11 @@
 			$conflict = '<hr />';
 		}
 
+		// wikia change begin
+		// BugId:5451
+		wfRunHooks( 'EditPageGetPreviewNote', array( $this, &$note ) );
+		// wikia change end
+
 		$previewhead = "<div class='previewnote'>\n" .
 			'<h2 id="mw-previewheader">' . htmlspecialchars( wfMsg( 'preview' ) ) . "</h2>" .
 			$wgOut->parse( $note ) . $conflict . "</div>\n";
@@ -1925,7 +2087,10 @@
 	 * Call the stock "user is blocked" page
 	 */
 	function blockedPage() {
-		global $wgOut;
+		// Wikia - start - @author: ADi - removed wgOut from global to allow injecting it
+		// define wgOut
+		$wgOut = !empty($this->customOutputPage) ? $this->customOutputPage : $GLOBALS['wgOut'];
+		// Wikia - end
 		$wgOut->blockedPage( false ); # Standard block notice on the top, don't 'return'
 
 		# If the user made changes, preserve them when showing the markup
@@ -1956,7 +2121,7 @@
 		$loginLink = $skin->link(
 			$loginTitle,
 			wfMsgHtml( 'loginreqlink' ),
-			array(),
+			array( 'rel' => 'nofollow' ),
 			array( 'returnto' => $wgTitle->getPrefixedText() ),
 			array( 'known', 'noclasses' )
 		);
@@ -2208,7 +2373,11 @@
 				'key'    => 'R'
 			)
 		);
-		$toolbar = "<div id='toolbar'>\n";
+
+		// wikia change begin
+		wfRunHooks( 'ToolbarGenerate', array( &$toolarray ) );
+		$toolbar = "<div id='toolbar' style='clear:both'>\n";
+		// wikia change end
 
 		$script = '';
 		foreach ( $toolarray as $tool ) {
@@ -2229,6 +2398,11 @@
 				array_map( array( 'Xml', 'encodeJsVar' ), $params ) );
 			$script .= "addButton($paramList);\n";
 		}
+
+		// wikia change begin
+		$script .= "mwWikiaUploadNamespace = '".$wgContLang->getNsText(NS_IMAGE)."';\nmwWikiaUploadTooltip = '".wfMsg('insertimagetitle')."';\n";
+		// wikia change end
+
 		$toolbar .= Html::inlineScript( "\n$script\n" );
 
 		$toolbar .= "\n</div>";
@@ -2398,6 +2572,9 @@
 		$newtext = $this->mArticle->preSaveTransform( $newtext );
 		$oldtitle = wfMsgExt( 'currentrev', array( 'parseinline' ) );
 		$newtitle = wfMsgExt( 'yourtext', array( 'parseinline' ) );
+
+		wfRunHooks( 'EditPageBeforeDiffText', array( $this, &$newtext, &$oldtext, &$newtitle, &$oldtitle) );
+
 		if ( $oldtext !== false  || $newtext != '' ) {
 			$de = new DifferenceEngine( $this->mTitle );
 			$de->setText( $oldtext, $newtext );