X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FEditPage.php;h=84ee98b57d6bf0f8d56440ca113714e19fca957b;hb=adbbd43292587ded7c637b3f6232f4eee966c364;hp=9a1922517c20dbac332895f8053a9297978ba3c4;hpb=263dc95a701ef787b4756e3628628605d47eb7c0;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/EditPage.php b/includes/EditPage.php index 9a1922517c..84ee98b57d 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -1,7 +1,6 @@ mArticle =& $article; global $wgTitle; $this->mTitle =& $wgTitle; + + # Placeholders for text injection by hooks (empty per default) + $this->editFormPageTop = + $this->editFormTextTop = + $this->editFormTextAfterWarn = + $this->editFormTextAfterTools = + $this->editFormTextBottom = ""; + } + + /** + * Fetch initial editing page content. + */ + private function getContent() { + global $wgOut, $wgRequest, $wgParser; + + # Get variables from query string :P + $section = $wgRequest->getVal( 'section' ); + $preload = $wgRequest->getVal( 'preload' ); + $undo = $wgRequest->getVal( 'undo' ); + + wfProfileIn( __METHOD__ ); + + $text = ''; + if( !$this->mTitle->exists() ) { + if ( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) { + # If this is a system message, get the default text. + $text = wfMsgWeirdKey ( $this->mTitle->getText() ) ; + } else { + # If requested, preload some text. + $text = $this->getPreloadedText( $preload ); + } + # We used to put MediaWiki:Newarticletext here if + # $text was empty at this point. + # This is now shown above the edit box instead. + } else { + // FIXME: may be better to use Revision class directly + // But don't mess with it just yet. Article knows how to + // fetch the page record from the high-priority server, + // which is needed to guarantee we don't pick up lagged + // information. + + $text = $this->mArticle->getContent(); + + if ( $undo > 0 ) { + #Undoing a specific edit overrides section editing; section-editing + # doesn't work with undoing. + $undorev = Revision::newFromId($undo); + + #Sanity check, make sure it's the right page. + # Otherwise, $text will be left as-is. + if (!is_null($undorev) && $undorev->getPage() == $this->mArticle->getID()) { + $oldrev = $undorev->getPrevious(); + $undorev_text = $undorev->getText(); + $oldrev_text = $oldrev->getText(); + $currev_text = $text; + + #No use doing a merge if it's just a straight revert. + if ($currev_text != $undorev_text) { + $result = wfMerge($undorev_text, $oldrev_text, $currev_text, $text); + } else { + $text = $oldrev_text; + $result = true; + } + + if( $result ) { + # Inform the user of our success and set an automatic edit summary + $this->editFormPageTop .= $wgOut->parse( wfMsgNoTrans( 'undo-success' ) ); + $this->summary = wfMsgForContent( 'undo-summary', $undo, $undorev->getUserText() ); + $this->formtype = 'diff'; + } else { + # Warn the user that something went wrong + $this->editFormPageTop .= $wgOut->parse( wfMsgNoTrans( 'undo-failure' ) ); + } + + } + } + else if( $section != '' ) { + if( $section == 'new' ) { + $text = $this->getPreloadedText( $preload ); + } else { + $text = $wgParser->getSection( $text, $section ); + } + } + } + + wfProfileOut( __METHOD__ ); + return $text; + } + + /** + * Get the contents of a page from its title and remove includeonly tags + * + * @param $preload String: the title of the page. + * @return string The contents of the page. + */ + private function getPreloadedText($preload) { + if ( $preload === '' ) + return ''; + else { + $preloadTitle = Title::newFromText( $preload ); + if ( isset( $preloadTitle ) && $preloadTitle->userCanRead() ) { + $rev=Revision::newFromTitle($preloadTitle); + if ( is_object( $rev ) ) { + $text = $rev->getText(); + // TODO FIXME: AAAAAAAAAAA, this shouldn't be implementing + // its own mini-parser! -ævar + $text = preg_replace( '~~', '', $text ); + return $text; + } else + return ''; + } + } } /** @@ -61,7 +180,7 @@ class EditPage { if ( !$wgUseMetadataEdit ) return ; if ( $wgMetadataWhitelist == '' ) return ; $s = '' ; - $t = $this->mArticle->getContent(); + $t = $this->getContent(); # MISSING : filtering @@ -183,9 +302,9 @@ class EditPage { return; } - if ( ! $this->mTitle->userCanEdit() ) { + if ( ! $this->mTitle->userCan( 'edit' ) ) { wfDebug( "$fname: user can't edit\n" ); - $wgOut->readOnlyPage( $this->mArticle->getContent(), true ); + $wgOut->readOnlyPage( $this->getContent(), true ); wfProfileOut( $fname ); return; } @@ -194,7 +313,7 @@ class EditPage { # When previewing, don't check blocked state - will get caught at save time. # Also, check when starting edition is done against slave to improve performance. wfDebug( "$fname: user is blocked\n" ); - $wgOut->blockedPage(); + $this->blockedPage(); wfProfileOut( $fname ); return; } @@ -206,7 +325,7 @@ class EditPage { return; } else { wfDebug( "$fname: read-only page\n" ); - $wgOut->readOnlyPage( $this->mArticle->getContent(), true ); + $wgOut->readOnlyPage( $this->getContent(), true ); wfProfileOut( $fname ); return; } @@ -230,7 +349,7 @@ class EditPage { } else if ( $this->diff ) { $this->formtype = 'diff'; } else { - $wgOut->readOnlyPage( $this->mArticle->getContent() ); + $wgOut->readOnlyPage( $this->getContent() ); wfProfileOut( $fname ); return; } @@ -304,6 +423,8 @@ class EditPage { # checking, etc. if ( 'initial' == $this->formtype || $this->firsttime ) { $this->initialiseForm(); + if( !$this->mTitle->getArticleId() ) + wfRunHooks( 'EditFormPreloadText', array( &$this->textbox1, &$this->mTitle ) ); } $this->showEditForm(); @@ -362,13 +483,16 @@ class EditPage { // Remember whether a save was requested, so we can indicate // if we forced preview due to session failure. $this->mTriedSave = !$this->preview; - + if ( $this->tokenOk( $request ) ) { # Some browsers will not report any submit button # if the user hits enter in the comment box. # The unmarked state will be assumed to be a save, # if the form seems otherwise complete. wfDebug( "$fname: Passed token check.\n" ); + } else if ( $this->diff ) { + # Failed token check, but only requested "Show Changes". + wfDebug( "$fname: Failed token check; Show Changes requested.\n" ); } else { # Page might be a hack attempt posted from # an external site. Preview instead of saving. @@ -396,8 +520,8 @@ class EditPage { } else { $this->allowBlankSummary = $request->getBool( 'wpIgnoreBlankSummary' ); } - - $this->autoSumm = $request->getText( 'wpAutoSummary' ); + + $this->autoSumm = $request->getText( 'wpAutoSummary' ); } else { # Not a posted form? Start with nothing. wfDebug( "$fname: Not a posted form.\n" ); @@ -437,8 +561,8 @@ class EditPage { global $wgUser; if( $wgUser->isAnon() ) { # Anonymous users may not have a session - # open. Don't tokenize. - $this->mTokenOk = true; + # open. Check for suffix anyway. + $this->mTokenOk = ( EDIT_TOKEN_SUFFIX == $request->getVal( 'wpEditToken' ) ); } else { $this->mTokenOk = $wgUser->matchEditToken( $request->getVal( 'wpEditToken' ) ); } @@ -479,11 +603,18 @@ class EditPage { wfProfileIn( $fname ); wfProfileIn( "$fname-checks" ); + if( !wfRunHooks( 'EditPage::attemptSave', array( &$this ) ) ) + { + wfDebug( "Hook 'EditPage::attemptSave' aborted article saving" ); + return false; + } + # Reintegrate metadata if ( $this->mMetaData != '' ) $this->textbox1 .= "\n" . $this->mMetaData ; $this->mMetaData = '' ; # Check for spam + $matches = array(); if ( $wgSpamRegex && preg_match( $wgSpamRegex, $this->textbox1, $matches ) ) { $this->spamPage ( $matches[0] ); wfProfileOut( "$fname-checks" ); @@ -509,7 +640,7 @@ class EditPage { } if ( $wgUser->isBlockedFrom( $this->mTitle, false ) ) { # Check block state against master, thus 'false'. - $this->blockedIPpage(); + $this->blockedPage(); wfProfileOut( "$fname-checks" ); wfProfileOut( $fname ); return false; @@ -522,7 +653,7 @@ class EditPage { wfProfileOut( $fname ); return true; } - + if ( !$wgUser->isAllowed('edit') ) { if ( $wgUser->isAnon() ) { $this->userNotLoggedInPage(); @@ -564,6 +695,7 @@ class EditPage { # If article is new, insert it. $aid = $this->mTitle->getArticleID( GAID_FOR_UPDATE ); if ( 0 == $aid ) { + // Late check for create permission, just in case *PARANOIA* if ( !$this->mTitle->userCan( 'create' ) ) { wfDebug( "$fname: no create permission\n" ); @@ -579,14 +711,6 @@ class EditPage { return false; } - # If no edit comment was given when creating a new page, and what's being - # created is a redirect, be smart and fill in a neat auto-comment - if( $this->summary == '' ) { - $rt = Title::newFromRedirect( $this->textbox1 ); - if( is_object( $rt ) ) - $this->summary = wfMsgForContent( 'autoredircomment', $rt->getPrefixedText() ); - } - $isComment=($this->section=='new'); $this->mArticle->insertNewArticle( $this->textbox1, $this->summary, $this->minoredit, $this->watchthis, false, $isComment); @@ -658,8 +782,11 @@ class EditPage { return true; } - # Handle the user preference to force summaries here - if( $this->section != 'new' && !$this->allowBlankSummary && $wgUser->getOption( 'forceeditsummary' ) ) { + $oldtext = $this->mArticle->getContent(); + + # Handle the user preference to force summaries here, but not for null edits + if( $this->section != 'new' && !$this->allowBlankSummary && $wgUser->getOption( 'forceeditsummary') + && 0 != strcmp($oldtext, $text) && !Article::getRedirectAutosummary( $text )) { if( md5( $this->summary ) == $this->autoSumm ) { $this->missingSummary = true; wfProfileOut( $fname ); @@ -667,6 +794,15 @@ class EditPage { } } + #And a similar thing for new sections + if( $this->section == 'new' && !$this->allowBlankSummary && $wgUser->getOption( 'forceeditsummary' ) ) { + if (trim($this->summary) == '') { + $this->missingSummary = true; + wfProfileOut( $fname ); + return( true ); + } + } + # All's well wfProfileIn( "$fname-sectionanchor" ); $sectionanchor = ''; @@ -724,10 +860,10 @@ class EditPage { */ function initialiseForm() { $this->edittime = $this->mArticle->getTimestamp(); - $this->textbox1 = $this->mArticle->getContent(); $this->summary = ''; + $this->textbox1 = $this->getContent(); if ( !$this->mArticle->exists() && $this->mArticle->mTitle->getNamespace() == NS_MEDIAWIKI ) - $this->textbox1 = wfMsgWeirdKey ( $this->mArticle->mTitle->getText() ) ; + $this->textbox1 = wfMsgWeirdKey( $this->mArticle->mTitle->getText() ); wfProxyCheck(); } @@ -743,7 +879,7 @@ class EditPage { $fname = 'EditPage::showEditForm'; wfProfileIn( $fname ); - $sk =& $wgUser->getSkin(); + $sk = $wgUser->getSkin(); wfRunHooks( 'EditPage::showEditForm:initial', array( &$this ) ) ; @@ -758,7 +894,7 @@ class EditPage { $wgOut->addWikiText( wfMsg( 'explainconflict' ) ); $this->textbox2 = $this->textbox1; - $this->textbox1 = $this->mArticle->getContent(); + $this->textbox1 = $this->getContent(); $this->edittime = $this->mArticle->getTimestamp(); } else { @@ -767,7 +903,8 @@ class EditPage { $s = wfMsg('editingcomment', $this->mTitle->getPrefixedText() ); } else { $s = wfMsg('editingsection', $this->mTitle->getPrefixedText() ); - if( !$this->preview && !$this->diff ) { + $matches = array(); + if( !$this->summary && !$this->preview && !$this->diff ) { preg_match( "/^(=+)(.+)\\1/mi", $this->textbox1, $matches ); @@ -784,11 +921,15 @@ class EditPage { if ( $this->missingComment ) { $wgOut->addWikiText( wfMsg( 'missingcommenttext' ) ); } - - if( $this->missingSummary ) { + + if( $this->missingSummary && $this->section != 'new' ) { $wgOut->addWikiText( wfMsg( 'missingsummary' ) ); } - + + if( $this->missingSummary && $this->section == 'new' ) { + $wgOut->addWikiText( wfMsg( 'missingcommentheader' ) ); + } + if( !$this->hookError == '' ) { $wgOut->addWikiText( $this->hookError ); } @@ -818,21 +959,28 @@ class EditPage { } } } - - if( $this->mTitle->isProtected( 'edit' ) ) { - # Is the protection due to the namespace, e.g. interface text? - if( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) { - # Yes; remind the user - $notice = wfMsg( 'editinginterface' ); - } elseif( $this->mTitle->isSemiProtected() ) { - # No; semi protected + + if( $this->mTitle->getNamespace() == NS_MEDIAWIKI ) { + # Show a warning if editing an interface message + $wgOut->addWikiText( wfMsg( 'editinginterface' ) ); + } elseif( $this->mTitle->isProtected( 'edit' ) ) { + # Is the title semi-protected? + if( $this->mTitle->isSemiProtected() ) { $notice = wfMsg( 'semiprotectedpagewarning' ); - if( wfEmptyMsg( 'semiprotectedpagewarning', $notice ) || $notice == '-' ) { + if( wfEmptyMsg( 'semiprotectedpagewarning', $notice ) || $notice == '-' ) $notice = ''; - } } else { - # No; regular protection - $notice = wfMsg( 'protectedpagewarning' ); + # It's either cascading protection or regular protection; work out which + $cascadeSources = $this->mTitle->getCascadeProtectionSources(); + if( $cascadeSources && count( $cascadeSources ) > 0 ) { + # Cascading protection; explain, and list the titles responsible + $notice = wfMsg( 'cascadeprotectedwarning' ) . "\n"; + foreach( $cascadeSources as $source ) + $notice .= '* [[:' . $source->getPrefixedText() . "]]\n"; + } else { + # Regular protection + $notice = wfMsg( 'protectedpagewarning' ); + } } $wgOut->addWikiText( $notice ); } @@ -846,6 +994,12 @@ class EditPage { $wgOut->addWikiText( wfMsg( 'longpagewarning', $wgLang->formatNum( $this->kblength ) ) ); } + #need to parse the preview early so that we know which templates are used, + #otherwise users with "show preview after edit box" will get a blank list + if ( $this->formtype == 'preview' ) { + $previewOutput = $this->getPreviewText(); + } + $rows = $wgUser->getIntOption( 'rows' ); $cols = $wgUser->getIntOption( 'cols' ); @@ -864,7 +1018,7 @@ class EditPage { $cancel = $sk->makeKnownLink( $this->mTitle->getPrefixedText(), wfMsgExt('cancel', array('parseinline')) ); - $edithelpurl = $sk->makeInternalOrExternalUrl( wfMsgForContent( 'edithelppage' )); + $edithelpurl = Skin::makeInternalOrExternalUrl( wfMsgForContent( 'edithelppage' )); $edithelp = ''. htmlspecialchars( wfMsg( 'edithelp' ) ).' '. htmlspecialchars( wfMsg( 'newwindow' ) ); @@ -895,7 +1049,7 @@ class EditPage { # Already watched $this->watchthis = true; } - + if( $wgUser->getOption( 'minordefault' ) ) $this->minoredit = true; } @@ -905,7 +1059,7 @@ class EditPage { $minoredithtml = "minoredit?" checked='checked'":""). " accesskey='".wfMsg('accesskey-minoredit')."' id='wpMinoredit' />\n". - "\n"; + "\n"; } $watchhtml = ''; @@ -914,16 +1068,17 @@ class EditPage { $watchhtml = "watchthis?" checked='checked'":""). " accesskey=\"".htmlspecialchars(wfMsg('accesskey-watch'))."\" id='wpWatchthis' />\n". - "\n"; + "\n"; } $checkboxhtml = $minoredithtml . $watchhtml; + $wgOut->addHTML( $this->editFormPageTop ); + if ( $wgUser->getOption( 'previewontop' ) ) { if ( 'preview' == $this->formtype ) { - $this->showPreview(); + $this->showPreview( $previewOutput ); } else { $wgOut->addHTML( '
' ); } @@ -934,22 +1089,29 @@ class EditPage { } + $wgOut->addHTML( $this->editFormTextTop ); + # if this is a comment, show a subject line at the top, which is also the edit summary. # Otherwise, show a summary field at the bottom $summarytext = htmlspecialchars( $wgContLang->recodeForEdit( $this->summary ) ); # FIXME if( $this->section == 'new' ) { $commentsubject="\n
\n
"; $editsummary = ''; + $subjectpreview = $summarytext && $this->preview ? "
".wfMsg('subject-preview').':'.$sk->commentBlock( $this->summary, $this->mTitle )."
\n" : ''; + $summarypreview = ''; } else { $commentsubject = ''; $editsummary="\n
\n
"; + $summarypreview = $summarytext && $this->preview ? "
".wfMsg('summary-preview').':'.$sk->commentBlock( $this->summary, $this->mTitle )."
\n" : ''; + $subjectpreview = ''; } # Set focus to the edit box on load, except on preview or diff, where it would interfere with the display if( !$this->preview && !$this->diff ) { $wgOut->setOnloadHandler( 'document.editform.wpTextbox1.focus()' ); } - $templates = $this->formatTemplates(); + $templates = ($this->preview || $this->section) ? $this->mPreviewTemplates : $this->mArticle->getUsedTemplates(); + $formattedtemplates = $sk->formatTemplates( $templates, $this->preview, $this->section != ''); global $wgUseMetadataEdit ; if ( $wgUseMetadataEdit ) { @@ -984,7 +1146,7 @@ class EditPage { 'tabindex' => '5', 'value' => wfMsg('savearticle'), 'accesskey' => wfMsg('accesskey-save'), - 'title' => wfMsg('tooltip-save'), + 'title' => wfMsg( 'tooltip-save' ).' ['.wfMsg( 'accesskey-save' ).']', ); $buttons['save'] = wfElement('input', $temp, ''); $temp = array( @@ -994,7 +1156,7 @@ class EditPage { 'tabindex' => '7', 'value' => wfMsg('showdiff'), 'accesskey' => wfMsg('accesskey-diff'), - 'title' => wfMsg('tooltip-diff'), + 'title' => wfMsg( 'tooltip-diff' ).' ['.wfMsg( 'accesskey-diff' ).']', ); $buttons['diff'] = wfElement('input', $temp, ''); @@ -1007,7 +1169,7 @@ class EditPage { 'tabindex' => '6', 'value' => wfMsg('showpreview'), 'accesskey' => '', - 'title' => wfMsg('tooltip-preview'), + 'title' => wfMsg( 'tooltip-preview' ).' ['.wfMsg( 'accesskey-preview' ).']', 'style' => 'display: none;', ); $buttons['preview'] = wfElement('input', $temp, ''); @@ -1030,7 +1192,7 @@ class EditPage { 'tabindex' => '6', 'value' => wfMsg('showpreview'), 'accesskey' => wfMsg('accesskey-preview'), - 'title' => wfMsg('tooltip-preview'), + 'title' => wfMsg( 'tooltip-preview' ).' ['.wfMsg( 'accesskey-preview' ).']', ); $buttons['preview'] = wfElement('input', $temp, ''); $buttons['live'] = ''; @@ -1060,6 +1222,7 @@ END $wgOut->addHTML( << END @@ -1069,9 +1232,11 @@ END " ); $wgOut->addWikiText( $copywarn ); + $wgOut->addHTML( $this->editFormTextAfterWarn ); $wgOut->addHTML( " {$metadata} {$editsummary} +{$summarypreview} {$checkboxhtml} {$safemodehtml} "); @@ -1086,26 +1251,36 @@ END
"); + $wgOut->addHtml( '
' ); $wgOut->addWikiText( wfMsgForContent( 'edittools' ) ); + $wgOut->addHtml( '
' ); + + $wgOut->addHTML( $this->editFormTextAfterTools ); $wgOut->addHTML( "
-{$templates} +{$formattedtemplates}
" ); - if ( $wgUser->isLoggedIn() ) { - /** - * To make it harder for someone to slip a user a page - * which submits an edit form to the wiki without their - * knowledge, a random token is associated with the login - * session. If it's not passed back with the submission, - * we won't save the page, or render user JavaScript and - * CSS previews. - */ + /** + * To make it harder for someone to slip a user a page + * which submits an edit form to the wiki without their + * knowledge, a random token is associated with the login + * session. If it's not passed back with the submission, + * we won't save the page, or render user JavaScript and + * CSS previews. + * + * For anon editors, who may not have a session, we just + * include the constant suffix to prevent editing from + * broken text-mangling proxies. + */ + if ( $wgUser->isLoggedIn() ) $token = htmlspecialchars( $wgUser->editToken() ); - $wgOut->addHTML( "\n\n" ); - } + else + $token = EDIT_TOKEN_SUFFIX; + $wgOut->addHTML( "\n\n" ); + # If a blank edit summary was previously provided, and the appropriate # user preference is active, pass a hidden tag here. This will stop the @@ -1114,14 +1289,13 @@ END if( $this->missingSummary ) { $wgOut->addHTML( "\n" ); } - + # For a bit more sophisticated detection of blank summaries, hash the # automatic one and pass that in a hidden field. $autosumm = $this->autoSumm ? $this->autoSumm : md5( $this->summary ); $wgOut->addHtml( wfHidden( 'wpAutoSummary', $autosumm ) ); if ( $this->isConflict ) { - require_once( "DifferenceEngine.php" ); $wgOut->addWikiText( '==' . wfMsg( "yourdiff" ) . '==' ); $de = new DifferenceEngine( $this->mTitle ); @@ -1132,15 +1306,16 @@ END $wgOut->addHTML( "" ); } + $wgOut->addHTML( $this->editFormTextBottom ); $wgOut->addHTML( "\n" ); if ( !$wgUser->getOption( 'previewontop' ) ) { if ( $this->formtype == 'preview') { - $this->showPreview(); + $this->showPreview( $previewOutput ); } else { $wgOut->addHTML( '
' ); } - + if ( $this->formtype == 'diff') { $wgOut->addHTML( $this->getDiff() ); } @@ -1153,55 +1328,23 @@ END /** * Append preview output to $wgOut. * Includes category rendering if this is a category page. - * @private + * + * @param string $text The HTML to be output for the preview. */ - function showPreview() { + private function showPreview( $text ) { global $wgOut; + $wgOut->addHTML( '
' ); if($this->mTitle->getNamespace() == NS_CATEGORY) { $this->mArticle->openShowCategory(); } - $previewOutput = $this->getPreviewText(); - $wgOut->addHTML( $previewOutput ); + $wgOut->addHTML( $text ); if($this->mTitle->getNamespace() == NS_CATEGORY) { $this->mArticle->closeShowCategory(); } - $wgOut->addHTML( "
\n" ); $wgOut->addHTML( '
' ); } - /** - * Prepare a list of templates used by this page. Returns HTML. - */ - function formatTemplates() { - global $wgUser; - - $fname = 'EditPage::formatTemplates'; - wfProfileIn( $fname ); - - $sk =& $wgUser->getSkin(); - - $outText = ''; - $templates = $this->mArticle->getUsedTemplates(); - if ( count( $templates ) > 0 ) { - # Do a batch existence check - $batch = new LinkBatch; - foreach( $templates as $title ) { - $batch->addObj( $title ); - } - $batch->execute(); - - # Construct the HTML - $outText = '
'. wfMsgExt( 'templatesused', array( 'parseinline' ) ) . ''; - } - wfProfileOut( $fname ); - return $outText; - } - /** * Live Preview lets us fetch rendered preview page content and * add it to the page without refreshing the whole page. @@ -1213,9 +1356,9 @@ END * of the preview button */ function doLivePreviewScript() { - global $wgStylePath, $wgJsMimeType, $wgOut, $wgTitle; + global $wgStylePath, $wgJsMimeType, $wgStyleVersion, $wgOut, $wgTitle; $wgOut->addHTML( '' . "\n" ); $liveAction = $wgTitle->getLocalUrl( 'action=submit&wpPreview=true&live=true' ); return "return !livePreview(" . @@ -1225,7 +1368,7 @@ END } function getLastDelete() { - $dbr =& wfGetDB( DB_SLAVE ); + $dbr = wfGetDB( DB_SLAVE ); $fname = 'EditPage::getLastDelete'; $res = $dbr->select( array( 'logging', 'user' ), @@ -1289,7 +1432,7 @@ END # don't parse user css/js, show message about preview # XXX: stupid php bug won't let us use $wgTitle->isCssJsSubpage() here - + if ( $this->isCssJsSubpage ) { if(preg_match("/\\.css$/", $wgTitle->getText() ) ) { $previewtext = wfMsg('usercsspreview'); @@ -1302,11 +1445,6 @@ END wfProfileOut( $fname ); return $previewhead; } else { - # if user want to see preview when he edit an article - if( $wgUser->getOption('previewonfirst') and ($this->textbox1 == '')) { - $this->textbox1 = $this->mArticle->getContent(); - } - $toparse = $this->textbox1; # If we're adding a comment, we need to show the @@ -1323,6 +1461,10 @@ END $previewHTML = $parserOutput->getText(); $wgOut->addParserOutputNoText( $parserOutput ); + foreach ( $parserOutput->getTemplates() as $ns => $template) + foreach ( array_keys( $template ) as $dbk) + $this->mPreviewTemplates[] = Title::makeTitle($ns, $dbk); + wfProfileOut( $fname ); return $previewhead . $previewHTML; } @@ -1331,9 +1473,28 @@ END /** * Call the stock "user is blocked" page */ - function blockedIPpage() { - global $wgOut; - $wgOut->blockedPage(); + function blockedPage() { + global $wgOut, $wgUser; + $wgOut->blockedPage( false ); # Standard block notice on the top, don't 'return' + + # If the user made changes, preserve them when showing the markup + # (This happens when a user is blocked during edit, for instance) + $first = $this->firsttime || ( !$this->save && $this->textbox1 == '' ); + if( $first ) { + $source = $this->mTitle->exists() ? $this->getContent() : false; + } else { + $source = $this->textbox1; + } + + # Spit out the source or the user's modified version + if( $source !== false ) { + $rows = $wgUser->getOption( 'rows' ); + $cols = $wgUser->getOption( 'cols' ); + $attribs = array( 'id' => 'wpTextbox1', 'name' => 'wpTextbox1', 'cols' => $cols, 'rows' => $rows, 'readonly' => 'readonly' ); + $wgOut->addHtml( '
' ); + $wgOut->addWikiText( wfMsg( $first ? 'blockedoriginalsource' : 'blockededitsource', $this->mTitle->getPrefixedText() ) ); + $wgOut->addHtml( wfOpenElement( 'textarea', $attribs ) . htmlspecialchars( $source ) . wfCloseElement( 'textarea' ) ); + } } /** @@ -1342,14 +1503,14 @@ END function userNotLoggedInPage() { global $wgUser, $wgOut; $skin = $wgUser->getSkin(); - - $loginTitle = Title::makeTitle( NS_SPECIAL, 'Userlogin' ); + + $loginTitle = SpecialPage::getTitleFor( 'Userlogin' ); $loginLink = $skin->makeKnownLinkObj( $loginTitle, wfMsgHtml( 'loginreqlink' ), 'returnto=' . $this->mTitle->getPrefixedUrl() ); - + $wgOut->setPageTitle( wfMsg( 'whitelistedittitle' ) ); $wgOut->setRobotPolicy( 'noindex,nofollow' ); $wgOut->setArticleRelated( false ); - + $wgOut->addHtml( wfMsgWikiHtml( 'whitelistedittext', $loginLink ) ); $wgOut->returnToMain( false, $this->mTitle->getPrefixedUrl() ); } @@ -1365,7 +1526,7 @@ END $wgOut->setPageTitle( wfMsg( 'confirmedittitle' ) ); $wgOut->setRobotPolicy( 'noindex,nofollow' ); $wgOut->setArticleRelated( false ); - + $wgOut->addWikiText( wfMsg( 'confirmedittext' ) ); $wgOut->returnToMain( false ); } @@ -1385,7 +1546,7 @@ END $wgOut->addWikiText( wfMsg( 'spamprotectiontext' ) ); if ( $match ) $wgOut->addWikiText( wfMsg( 'spamprotectionmatch', "{$match}" ) ); - + $wgOut->returnToMain( false ); } @@ -1397,7 +1558,7 @@ END $fname = 'EditPage::mergeChangesInto'; wfProfileIn( $fname ); - $db =& wfGetDB( DB_MASTER ); + $db = wfGetDB( DB_MASTER ); // This is the revision the editor started from $baseRevision = Revision::loadFromTimestamp( @@ -1417,6 +1578,7 @@ END } $currentText = $currentRevision->getText(); + $result = ''; if( wfMerge( $baseText, $editText, $currentText, $result ) ){ $editText = $result; wfProfileOut( $fname ); @@ -1492,15 +1654,15 @@ END */ $toolarray=array( array( 'image'=>'button_bold.png', - 'open' => "\'\'\'", - 'close' => "\'\'\'", + 'open' => '\\\'\\\'\\\'', + 'close' => '\\\'\\\'\\\'', 'sample'=> wfMsg('bold_sample'), 'tip' => wfMsg('bold_tip'), 'key' => 'B' ), array( 'image'=>'button_italic.png', - 'open' => "\'\'", - 'close' => "\'\'", + 'open' => '\\\'\\\'', + 'close' => '\\\'\\\'', 'sample'=> wfMsg('italic_sample'), 'tip' => wfMsg('italic_tip'), 'key' => 'I' @@ -1629,7 +1791,6 @@ END * @return string HTML */ function getDiff() { - require_once( 'DifferenceEngine.php' ); $oldtext = $this->mArticle->fetchContent(); $newtext = $this->mArticle->replaceSection( $this->section, $this->textbox1, $this->summary, $this->edittime );