X-Git-Url: http://git.cyclocoop.org/%24action?a=blobdiff_plain;f=includes%2FArticle.php;h=0950e6163ccd3cfc52ddcd3c8ffd860c4e9be4c8;hb=d815ca352f8fde14bc00f84b2eec11c1fef7f066;hp=e22da0be4c89712bdc43c8572a8b54a22228fbf4;hpb=1a9eff84982efb074f36f26d1c7c8d766bedf8be;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Article.php b/includes/Article.php index e22da0be4c..0950e6163c 100644 --- a/includes/Article.php +++ b/includes/Article.php @@ -28,13 +28,14 @@ class Article { */ var $mContent, $mContentLoaded; var $mUser, $mTimestamp, $mUserText; - var $mCounter, $mComment, $mCountAdjustment; + var $mCounter, $mComment, $mGoodAdjustment, $mTotalAdjustment; var $mMinorEdit, $mRedirectedFrom; var $mTouched, $mFileCache, $mTitle; var $mId, $mTable; var $mForUpdate; var $mOldId; var $mRevIdFetched; + var $mRevision; /**#@-*/ /** @@ -51,7 +52,7 @@ class Article { * @public */ function getTitle() { - return $this->mTitle; + return $this->mTitle; } /** @@ -61,11 +62,11 @@ class Article { function clear() { $this->mDataLoaded = false; $this->mContentLoaded = false; - + $this->mCurID = $this->mUser = $this->mCounter = -1; # Not loaded $this->mRedirectedFrom = $this->mUserText = $this->mTimestamp = $this->mComment = $this->mFileCache = ''; - $this->mCountAdjustment = 0; + $this->mGoodAdjustment = $this->mTotalAdjustment = 0; $this->mTouched = '19700101000000'; $this->mForUpdate = false; $this->mIsRedirect = false; @@ -80,11 +81,12 @@ class Article { * @return Return the text of this revision */ function getContent( $noredir ) { - global $wgRequest, $wgUser; + global $wgRequest, $wgUser, $wgOut; # Get variables from query string :P $action = $wgRequest->getText( 'action', 'view' ); $section = $wgRequest->getText( 'section' ); + $preload = $wgRequest->getText( 'preload' ); $fname = 'Article::getContent'; wfProfileIn( $fname ); @@ -92,10 +94,20 @@ class Article { if ( 0 == $this->getID() ) { if ( 'edit' == $action ) { wfProfileOut( $fname ); - return ''; # was "newarticletext", now moved above the box) + + # 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. + return $text; } wfProfileOut( $fname ); - return wfMsg( 'noarticletext' ); + $wgOut->setRobotpolicy( 'noindex,nofollow' ); + + $ret = wfMsg( $wgUser->isLoggedIn() ? 'noarticletext' : 'noarticletextanon' ); + return "
'.htmlspecialchars($this->mContent)."\n" ); } else if ( $rt = Title::newFromRedirect( $text ) ) { # Display redirect - $imageUrl = $wgStylePath.'/common/images/redirect.png'; + $imageDir = $wgContLang->isRTL() ? 'rtl' : 'ltr'; + $imageUrl = $wgStylePath.'/common/images/redirect' . $imageDir . '.png'; + if( !$wasRedirected ) { + $wgOut->setSubtitle( wfMsgHtml( 'redirectpagesub' ) ); + } $targetUrl = $rt->escapeLocalURL(); $titleText = htmlspecialchars( $rt->getPrefixedText() ); $link = $sk->makeLinkObj( $rt ); - $wgOut->addHTML( '' . + $wgOut->addHTML( '' . ''.$link.'' ); - + $parseout = $wgParser->parse($text, $this->mTitle, ParserOptions::newFromUser($wgUser)); $catlinks = $parseout->getCategoryLinks(); $wgOut->addCategoryLinks($catlinks); $skin = $wgUser->getSkin(); } else if ( $pcache ) { # Display content and save to parser cache + $wgOut->setRevisionId( $this->getRevIdFetched() ); $wgOut->addPrimaryWikiText( $text, $this ); } else { # Display content, don't attempt to save to parser cache + + # Don't show section-edit links on old revisions... this way lies madness. + if( !$this->isCurrent() ) { + $oldEditSectionSetting = $wgOut->mParserOptions->setEditSection( false ); + } + $wgOut->setRevisionId( $this->getRevIdFetched() ); $wgOut->addWikiText( $text ); + + if( !$this->isCurrent() ) { + $wgOut->mParserOptions->setEditSection( $oldEditSectionSetting ); + } } } /* title may have been set from the cache */ - $t = $wgOut->getPageTitle(); + $t = $wgOut->getPageTitle(); if( empty( $t ) ) { $wgOut->setPageTitle( $this->mTitle->getPrefixedText() ); } @@ -774,8 +855,9 @@ class Article { ); } - # Put link titles into the link cache - $wgOut->transformBuffer(); + # Trackbacks + if ($wgUseTrackbacks) + $this->addTrackbacks(); # Add link titles as META keywords $wgOut->addMetaTags() ; @@ -784,6 +866,100 @@ class Article { wfProfileOut( $fname ); } + function addTrackbacks() { + global $wgOut, $wgUser; + + $dbr =& wfGetDB(DB_SLAVE); + $tbs = $dbr->select( + /* FROM */ 'trackbacks', + /* SELECT */ array('tb_id', 'tb_title', 'tb_url', 'tb_ex', 'tb_name'), + /* WHERE */ array('tb_page' => $this->getID()) + ); + + if (!$dbr->numrows($tbs)) + return; + + $tbtext = ""; + while ($o = $dbr->fetchObject($tbs)) { + $rmvtxt = ""; + if ($wgUser->isSysop()) { + $delurl = $this->mTitle->getFullURL("action=deletetrackback&tbid=" + . $o->tb_id . "&token=" . $wgUser->editToken()); + $rmvtxt = wfMsg('trackbackremove', $delurl); + } + $tbtext .= wfMsg(strlen($o->tb_ex) ? 'trackbackexcerpt' : 'trackback', + $o->tb_title, + $o->tb_url, + $o->tb_ex, + $o->tb_name, + $rmvtxt); + } + $wgOut->addWikitext(wfMsg('trackbackbox', $tbtext)); + } + + function deletetrackback() { + global $wgUser, $wgRequest, $wgOut, $wgTitle; + + if (!$wgUser->matchEditToken($wgRequest->getVal('token'))) { + $wgOut->addWikitext(wfMsg('sessionfailure')); + return; + } + + if ((!$wgUser->isAllowed('delete'))) { + $wgOut->sysopRequired(); + return; + } + + if (wfReadOnly()) { + $wgOut->readOnlyPage(); + return; + } + + $db =& wfGetDB(DB_MASTER); + $db->delete('trackbacks', array('tb_id' => $wgRequest->getInt('tbid'))); + $wgTitle->invalidateCache(); + $wgOut->addWikiText(wfMsg('trackbackdeleteok')); + } + + function render() { + global $wgOut; + + $wgOut->setArticleBodyOnly(true); + $this->view(); + } + + function purge() { + global $wgUser, $wgRequest, $wgOut, $wgUseSquid; + + if ( $wgUser->isLoggedIn() || $wgRequest->wasPosted() ) { + // Invalidate the cache + $this->mTitle->invalidateCache(); + + if ( $wgUseSquid ) { + // Commit the transaction before the purge is sent + $dbw = wfGetDB( DB_MASTER ); + $dbw->immediateCommit(); + + // Send purge + $update = SquidUpdate::newSimplePurge( $this->mTitle ); + $update->doUpdate(); + } + $this->view(); + } else { + $msg = $wgOut->parse( wfMsg( 'confirm_purge' ) ); + $action = $this->mTitle->escapeLocalURL( 'action=purge' ); + $button = htmlspecialchars( wfMsg( 'confirm_purge_button' ) ); + $msg = str_replace( '$1', + "\n", $msg ); + + $wgOut->setPageTitle( $this->mTitle->getPrefixedText() ); + $wgOut->setRobotpolicy( 'noindex,nofollow' ); + $wgOut->addHTML( $msg ); + } + } + /** * Insert a new empty page record for this article. * This *must* be followed up by creating a revision @@ -799,7 +975,7 @@ class Article { function insertOn( &$dbw, $restrictions = '' ) { $fname = 'Article::insertOn'; wfProfileIn( $fname ); - + $page_id = $dbw->nextSequenceValue( 'page_page_id_seq' ); $dbw->insert( 'page', array( 'page_id' => $page_id, @@ -812,15 +988,16 @@ class Article { 'page_random' => wfRandom(), 'page_touched' => $dbw->timestamp(), 'page_latest' => 0, # Fill this in shortly... + 'page_len' => 0, # Fill this in shortly... ), $fname ); $newid = $dbw->insertId(); - + $this->mTitle->resetArticleId( $newid ); - + wfProfileOut( $fname ); return $newid; } - + /** * Update the page record to point to a newly saved revision. * @@ -837,28 +1014,29 @@ class Article { function updateRevisionOn( &$dbw, $revision, $lastRevision = null ) { $fname = 'Article::updateToRevision'; wfProfileIn( $fname ); - + $conditions = array( 'page_id' => $this->getId() ); if( !is_null( $lastRevision ) ) { # An extra check against threads stepping on each other $conditions['page_latest'] = $lastRevision; } + $text = $revision->getText(); $dbw->update( 'page', array( /* SET */ 'page_latest' => $revision->getId(), 'page_touched' => $dbw->timestamp(), - 'page_is_new' => ($lastRevision === 0) ? 0 : 1, - 'page_is_redirect' => Article::isRedirect( $text ), + 'page_is_new' => ($lastRevision === 0) ? 1 : 0, + 'page_is_redirect' => Article::isRedirect( $text ) ? 1 : 0, 'page_len' => strlen( $text ), ), $conditions, $fname ); - + wfProfileOut( $fname ); return ( $dbw->affectedRows() != 0 ); } - + /** * If the given revision is newer than the currently set page_latest, * update the page record. Otherwise, do nothing. @@ -869,7 +1047,7 @@ class Article { function updateIfNewerOn( &$dbw, $revision ) { $fname = 'Article::updateIfNewerOn'; wfProfileIn( $fname ); - + $row = $dbw->selectRow( array( 'revision', 'page' ), array( 'rev_id', 'rev_timestamp' ), @@ -878,7 +1056,7 @@ class Article { 'page_latest=rev_id' ), $fname ); if( $row ) { - if( $row->rev_timestamp >= $revision->getTimestamp() ) { + if( wfTimestamp(TS_MW, $row->rev_timestamp) >= $revision->getTimestamp() ) { wfProfileOut( $fname ); return false; } @@ -887,12 +1065,12 @@ class Article { # No or missing previous revision; mark the page as new $prev = 0; } - + $ret = $this->updateRevisionOn( $dbw, $revision, $prev ); wfProfileOut( $fname ); return $ret; } - + /** * Theoretically we could defer these whole insert and update * functions for after display, but that's taking a big leap @@ -900,16 +1078,29 @@ class Article { * errors at some point. * @private */ - function insertNewArticle( $text, $summary, $isminor, $watchthis, $suppressRC=false ) { - global $wgOut, $wgUser; - global $wgUseSquid, $wgDeferredUpdateList, $wgInternalServer; + function insertNewArticle( $text, $summary, $isminor, $watchthis, $suppressRC=false, $comment=false ) { + global $wgOut, $wgUser, $wgUseSquid; $fname = 'Article::insertNewArticle'; + wfProfileIn( $fname ); - $this->mCountAdjustment = $this->isCountable( $text ); + if( !wfRunHooks( 'ArticleSave', array( &$this, &$wgUser, &$text, + &$summary, &$isminor, &$watchthis, NULL ) ) ) { + wfDebug( "$fname: ArticleSave hook aborted save!\n" ); + wfProfileOut( $fname ); + return false; + } + + $this->mGoodAdjustment = $this->isCountable( $text ); + $this->mTotalAdjustment = 1; $ns = $this->mTitle->getNamespace(); $ttl = $this->mTitle->getDBkey(); + + # If this is a comment, add the summary as headline + if($comment && $summary!="") { + $text="== {$summary} ==\n\n".$text; + } $text = $this->preSaveTransform( $text ); $isminor = ( $isminor && $wgUser->isLoggedIn() ) ? 1 : 0; $now = wfTimestampNow(); @@ -918,7 +1109,7 @@ class Article { # Add the page record; stake our claim on this title! $newid = $this->insertOn( $dbw ); - + # Save the revision text... $revision = new Revision( array( 'page' => $newid, @@ -929,13 +1120,14 @@ class Article { $revisionId = $revision->insertOn( $dbw ); $this->mTitle->resetArticleID( $newid ); - + # Update the page record with revision data $this->updateRevisionOn( $dbw, $revision, 0 ); Article::onArticleCreate( $this->mTitle ); if(!$suppressRC) { - RecentChange::notifyNew( $now, $this->mTitle, $isminor, $wgUser, $summary ); + RecentChange::notifyNew( $now, $this->mTitle, $isminor, $wgUser, $summary, 'default', + '', strlen( $text ), $revisionId ); } if ($watchthis) { @@ -958,43 +1150,25 @@ class Article { $this->editUpdates( $text, $summary, $isminor, $now ); $oldid = 0; # new article - $this->showArticle( $text, wfMsg( 'newarticle' ), false, $isminor, $now, $summary, $oldid ); + $this->showArticle( $text, wfMsg( 'newarticle' ), false, $isminor, $now, $summary, $oldid, $revisionId ); + + wfRunHooks( 'ArticleSaveComplete', array( &$this, &$wgUser, $text, + $summary, $isminor, + $watchthis, NULL ) ); + wfProfileOut( $fname ); + } + + function getTextOfLastEditWithSectionReplacedOrAdded($section, $text, $summary = '', $edittime = NULL) { + $this->replaceSection( $section, $text, $summary, $edittime ); } /** - * Fetch and uncompress the text for a given revision. - * Can ask by rev_id number or timestamp (set $field) - * FIXME: This function is broken. Eliminate all uses and remove. - * Use Revision class in place. + * @return string Complete article text, or null if error */ - function fetchRevisionText( $revId = null, $field = 'rev_id' ) { - $fname = 'Article::fetchRevisionText'; - $dbw =& wfGetDB( DB_MASTER ); - if( $revId ) { - $rev = $dbw->addQuotes( $revId ); - } else { - $rev = 'page_latest'; - } - $result = $dbw->query( - sprintf( "SELECT old_text, old_flags - FROM %s,%s,%s - WHERE old_id=rev_id AND rev_page=page_id AND page_id=%d - AND %s=%s", - $dbw->tableName( 'page' ), - $dbw->tableName( 'revision' ), - $dbw->tableName( 'text' ), - IntVal( $this->mTitle->getArticleId() ), - $field, - $rev ), - $fname ); - $obj = $dbw->fetchObject( $result ); - $dbw->freeResult( $result ); - $oldtext = Revision::getRevisionText( $obj ); - return $oldtext; - } - - function getTextOfLastEditWithSectionReplacedOrAdded($section, $text, $summary = '', $edittime = NULL) { - $fname = 'Article::getTextOfLastEditWithSectionReplacedOrAdded'; + function replaceSection($section, $text, $summary = '', $edittime = NULL) { + $fname = 'Article::replaceSection'; + wfProfileIn( $fname ); + if ($section != '') { if( is_null( $edittime ) ) { $rev = Revision::newFromTitle( $this->mTitle ); @@ -1002,8 +1176,13 @@ class Article { $dbw =& wfGetDB( DB_MASTER ); $rev = Revision::loadFromTimestamp( $dbw, $this->mTitle, $edittime ); } + if( is_null( $rev ) ) { + wfDebug( "Article::replaceSection asked for bogus section (page: " . + $this->getId() . "; section: $section; edittime: $edittime)\n" ); + return null; + } $oldtext = $rev->getText(); - + if($section=='new') { if($summary) $subject="== {$summary} ==\n\n"; $text=$oldtext."\n\n".$subject.$text; @@ -1014,6 +1193,7 @@ class Article { $striparray=array(); $parser=new Parser(); $parser->mOutputType=OT_WIKI; + $parser->mOptions = new ParserOptions(); $oldtext=$parser->strip($oldtext, $striparray, true); # now that we can be sure that no pseudo-sections are in the source, @@ -1072,28 +1252,37 @@ class Article { } } + wfProfileOut( $fname ); return $text; } /** - * Change an existing article. Puts the previous version back into the old table, updates RC + * Change an existing article. Puts the previous version back into the old table, updates RC * and all necessary caches, mostly via the deferred update array. * - * It is possible to call this function from a command-line script, but note that you should + * It is possible to call this function from a command-line script, but note that you should * first set $wgUser, and clean up $wgDeferredUpdates after each edit. */ function updateArticle( $text, $summary, $minor, $watchthis, $forceBot = false, $sectionanchor = '' ) { - global $wgOut, $wgUser; - global $wgDBtransactions, $wgMwRedir; - global $wgUseSquid, $wgInternalServer, $wgPostCommitUpdateList; + global $wgOut, $wgUser, $wgDBtransactions, $wgMwRedir, $wgUseSquid; + global $wgPostCommitUpdateList, $wgUseFileCache; $fname = 'Article::updateArticle'; + wfProfileIn( $fname ); $good = true; + if( !wfRunHooks( 'ArticleSave', array( &$this, &$wgUser, &$text, + &$summary, &$minor, + &$watchthis, &$sectionanchor ) ) ) { + wfDebug( "$fname: ArticleSave hook aborted save!\n" ); + wfProfileOut( $fname ); + return false; + } + $isminor = ( $minor && $wgUser->isLoggedIn() ); if ( $this->isRedirect( $text ) ) { # Remove all content but redirect - # This could be done by reconstructing the redirect from a title given by + # This could be done by reconstructing the redirect from a title given by # Title::newFromRedirect(), but then we wouldn't know which synonym the user # wants to see if ( preg_match( "/^((" . $wgMwRedir->getBaseRegex() . ')[^\\n]+)/i', $text, $m ) ) { @@ -1117,36 +1306,45 @@ class Article { } $oldtext = $this->getContent( true ); + $oldsize = strlen( $oldtext ); + $newsize = strlen( $text ); $lastRevision = 0; if ( 0 != strcmp( $text, $oldtext ) ) { - $this->mCountAdjustment = $this->isCountable( $text ) + $this->mGoodAdjustment = $this->isCountable( $text ) - $this->isCountable( $oldtext ); + $this->mTotalAdjustment = 0; $now = wfTimestampNow(); $lastRevision = $dbw->selectField( 'page', 'page_latest', array( 'page_id' => $this->getId() ) ); - + $revision = new Revision( array( 'page' => $this->getId(), 'comment' => $summary, 'minor_edit' => $isminor, 'text' => $text ) ); - $revisionId = $revision->insertOn( $dbw ); + $dbw->immediateCommit(); + $dbw->begin(); + $revisionId = $revision->insertOn( $dbw ); + # Update page $ok = $this->updateRevisionOn( $dbw, $revision, $lastRevision ); if( !$ok ) { /* Belated edit conflict! Run away!! */ $good = false; + $dbw->rollback(); } else { # Update recentchanges and purge cache and whatnot $bot = (int)($wgUser->isBot() || $forceBot); RecentChange::notifyEdit( $now, $this->mTitle, $isminor, $wgUser, $summary, - $lastRevision, $this->getTimestamp(), $bot ); + $lastRevision, $this->getTimestamp(), $bot, '', $oldsize, $newsize, + $revisionId ); Article::onArticleEdit( $this->mTitle ); + $dbw->commit(); } } @@ -1156,16 +1354,24 @@ class Article { if ( $good ) { if ($watchthis) { - if (!$this->mTitle->userIsWatching()) $this->watch(); + if (!$this->mTitle->userIsWatching()) { + $dbw->immediateCommit(); + $dbw->begin(); + $this->watch(); + $dbw->commit(); + } } else { if ( $this->mTitle->userIsWatching() ) { + $dbw->immediateCommit(); + $dbw->begin(); $this->unwatch(); + $dbw->commit(); } } # standard deferred updates $this->editUpdates( $text, $summary, $minor, $now ); - - + + $urls = array(); # Template namespace # Purge all articles linking here @@ -1178,16 +1384,27 @@ class Article { } } } - + # Squid updates if ( $wgUseSquid ) { $urls = array_merge( $urls, $this->mTitle->getSquidURLs() ); $u = new SquidUpdate( $urls ); array_push( $wgPostCommitUpdateList, $u ); } - - $this->showArticle( $text, wfMsg( 'updated' ), $sectionanchor, $isminor, $now, $summary, $lastRevision ); + + # File cache + if ( $wgUseFileCache ) { + $cm = new CacheManager($this->mTitle); + @unlink($cm->fileCacheName()); + } + + $this->showArticle( $text, wfMsg( 'updated' ), $sectionanchor, $isminor, $now, $summary, $lastRevision, $revisionId ); } + wfRunHooks( 'ArticleSaveComplete', + array( &$this, &$wgUser, $text, + $summary, $minor, + $watchthis, $sectionanchor ) ); + wfProfileOut( $fname ); return $good; } @@ -1195,11 +1412,15 @@ class Article { * After we've either updated or inserted the article, update * the link tables and redirect to the new page. */ - function showArticle( $text, $subtitle , $sectionanchor = '', $me2, $now, $summary, $oldid ) { - global $wgUseDumbLinkUpdate, $wgAntiLockFlags, $wgOut, $wgUser, $wgLinkCache, $wgEnotif; + function showArticle( $text, $subtitle , $sectionanchor = '', $me2, $now, $summary, $oldid, $newid ) { + global $wgUseDumbLinkUpdate, $wgAntiLockFlags, $wgOut, $wgUser, $wgLinkCache; + global $wgUseEnotif; + + $fname = 'Article::showArticle'; + wfProfileIn( $fname ); $wgLinkCache = new LinkCache(); - + if ( !$wgUseDumbLinkUpdate ) { # Preload links to reduce lock time if ( $wgAntiLockFlags & ALF_PRELOAD_LINKS ) { @@ -1207,28 +1428,12 @@ class Article { $wgLinkCache->clear(); } } - # Parse the text and replace links with placeholders - # Do this outside the locks on the links table - # The existence test queries need to be FOR UPDATE - #$oldUpdate = $wgParser->forUpdate( true ); - $wgOut = new OutputPage(); - $wgOut->addWikiTextWithTitle( $text, $this->mTitle ); - - # Select for update - $wgLinkCache->forUpdate( true ); - - # Get old version of link table to allow incremental link updates - $wgLinkCache->preFill( $this->mTitle ); - $wgLinkCache->clear(); - # Parse the text and replace links with placeholders + # Parse the text and save it to the parser cache $wgOut = new OutputPage(); - - # Pass the current title along in case we're creating a wiki page - # which is different than the currently displayed one (e.g. image - # pages created on file uploads); otherwise, link updates will - # go wrong. - $wgOut->addWikiTextWithTitle( $text, $this->mTitle ); + $wgOut->setParserOptions( ParserOptions::newFromUser( $wgUser ) ); + $wgOut->setRevisionId( $newid ); + $wgOut->addPrimaryWikiText( $text, $this ); if ( !$wgUseDumbLinkUpdate ) { # Move the current links back to the second register @@ -1242,19 +1447,20 @@ class Article { # Swap this old version back into its rightful place $wgLinkCache->swapRegisters(); } - + if( $this->isRedirect( $text ) ) $r = 'redirect=no'; else $r = ''; $wgOut->redirect( $this->mTitle->getFullURL( $r ).$sectionanchor ); - # this call would better fit into RecentChange::notifyEdit and RecentChange::notifyNew . - # this will be improved later (to-do) - - include_once( "UserMailer.php" ); - $wgEnotif = new EmailNotification (); - $wgEnotif->notifyOnPageChange( $this->mTitle, $now, $summary, $me2, $oldid ); + if ( $wgUseEnotif ) { + # this would be better as an extension hook + include_once( "UserMailer.php" ); + $enotif = new EmailNotification (); + $enotif->notifyOnPageChange( $this->mTitle, $now, $summary, $me2, $oldid ); + } + wfProfileOut( $fname ); } /** @@ -1300,18 +1506,18 @@ class Article { */ function validate() { global $wgOut, $wgUser, $wgRequest, $wgUseValidation; - + if ( !$wgUseValidation ) # Are we using article validation at all? { $wgOut->errorpage( "nosuchspecialpage", "nospecialpagetext" ); return ; } - + $wgOut->setRobotpolicy( 'noindex,follow' ); $revision = $wgRequest->getVal( 'revision' ); - + include_once ( "SpecialValidate.php" ) ; # The "Validation" class - + $v = new Validation ; if ( $wgRequest->getVal ( "mode" , "" ) == "list" ) $t = $v->showList ( $this ) ; @@ -1319,16 +1525,16 @@ class Article { $t = $v->showDetails ( $this , $wgRequest->getVal( 'revision' ) ) ; else $t = $v->validatePageForm ( $this , $revision ) ; - + $wgOut->addHTML ( $t ) ; } /** * Add this page to $wgUser's watchlist */ - + function watch() { - + global $wgUser, $wgOut; if ( $wgUser->isAnon() ) { @@ -1341,7 +1547,7 @@ class Article { } if (wfRunHooks('WatchArticle', array(&$wgUser, &$this))) { - + $wgUser->addWatch( $this->mTitle ); $wgUser->saveSettings(); @@ -1349,19 +1555,19 @@ class Article { $wgOut->setPagetitle( wfMsg( 'addedwatch' ) ); $wgOut->setRobotpolicy( 'noindex,follow' ); - + $link = $this->mTitle->getPrefixedText(); $text = wfMsg( 'addedwatchtext', $link ); $wgOut->addWikiText( $text ); } - + $wgOut->returnToMain( true, $this->mTitle->getPrefixedText() ); } /** * Stop watching a page */ - + function unwatch() { global $wgUser, $wgOut; @@ -1376,20 +1582,20 @@ class Article { } if (wfRunHooks('UnwatchArticle', array(&$wgUser, &$this))) { - + $wgUser->removeWatch( $this->mTitle ); $wgUser->saveSettings(); - + wfRunHooks('UnwatchArticleComplete', array(&$wgUser, &$this)); - + $wgOut->setPagetitle( wfMsg( 'removedwatch' ) ); $wgOut->setRobotpolicy( 'noindex,follow' ); - + $link = $this->mTitle->getPrefixedText(); $text = wfMsg( 'removedwatchtext', $link ); $wgOut->addWikiText( $text ); } - + $wgOut->returnToMain( true, $this->mTitle->getPrefixedText() ); } @@ -1434,7 +1640,7 @@ class Article { $restrictions .= ":edit=" . $limit; } if (wfRunHooks('ArticleProtect', array(&$this, &$wgUser, $limit == 'sysop', $reason, $moveonly))) { - + $dbw =& wfGetDB( DB_MASTER ); $dbw->update( 'page', array( /* SET */ @@ -1444,9 +1650,9 @@ class Article { 'page_id' => $id ), 'Article::protect' ); - + wfRunHooks('ArticleProtectComplete', array(&$this, &$wgUser, $limit == 'sysop', $reason, $moveonly)); - + $log = new LogPage( 'protect' ); if ( $limit === '' ) { $log->addEntry( 'unprotect', $this->mTitle, $reason ); @@ -1457,8 +1663,7 @@ class Article { } return; } else { - $reason = htmlspecialchars( wfMsg( 'protectreason' ) ); - return $this->confirmProtect( '', $reason, $limit ); + return $this->confirmProtect( '', '', $limit ); } } @@ -1492,7 +1697,7 @@ class Article { $formaction = $this->mTitle->escapeLocalURL( 'action=protect' . $par ); } - $confirm = htmlspecialchars( wfMsg( 'confirm' ) ); + $confirm = htmlspecialchars( wfMsg( 'protectpage' ) ); $token = htmlspecialchars( $wgUser->editToken() ); $wgOut->addHTML( " @@ -1542,7 +1747,7 @@ class Article { * UI entry point for page deletion */ function delete() { - global $wgUser, $wgOut, $wgMessageCache, $wgRequest; + global $wgUser, $wgOut, $wgRequest; $fname = 'Article::delete'; $confirm = $wgRequest->wasPosted() && $wgUser->matchEditToken( $wgRequest->getVal( 'wpEditToken' ) ); @@ -1551,24 +1756,23 @@ class Article { # This code desperately needs to be totally rewritten # Check permissions - if ( ( ! $wgUser->isAllowed('delete') ) ) { + if( ( !$wgUser->isAllowed( 'delete' ) ) ) { $wgOut->sysopRequired(); return; } - if ( wfReadOnly() ) { + if( wfReadOnly() ) { $wgOut->readOnlyPage(); return; } # Better double-check that it hasn't been deleted yet! $wgOut->setPagetitle( wfMsg( 'confirmdelete' ) ); - if ( ( '' == trim( $this->mTitle->getText() ) ) - or ( $this->mTitle->getArticleId() == 0 ) ) { + if( !$this->mTitle->exists() ) { $wgOut->fatalError( wfMsg( 'cannotdelete' ) ); return; } - if ( $confirm ) { + if( $confirm ) { $this->doDelete( $reason ); return; } @@ -1595,63 +1799,58 @@ class Article { } # Fetch cur_text - $rev =& Revision::newFromTitle( $this->mTitle ); - + $rev = Revision::newFromTitle( $this->mTitle ); + # Fetch name(s) of contributors $rev_name = ''; $all_same_user = true; - while ( $row = $dbr->fetchObject( $revisions ) ) { - if ( $rev_name != '' && $rev_name != $row->rev_user_text ) { + while( $row = $dbr->fetchObject( $revisions ) ) { + if( $rev_name != '' && $rev_name != $row->rev_user_text ) { $all_same_user = false; } else { $rev_name = $row->rev_user_text; } } - + if( !is_null( $rev ) ) { # if this is a mini-text, we can paste part of it into the deletion reason $text = $rev->getText(); #if this is empty, an earlier revision may contain "useful" text $blanked = false; - if($text == '') { - $prevId = $this->mTitle->getPreviousRevisionID( $rev->getId() ); - $rev = Revision::newFromId( $prevId ); - if ( $rev ) { - $text = $rev->getText(); + if( $text == '' ) { + $prev = $rev->getPrevious(); + if( $prev ) { + $text = $prev->getText(); $blanked = true; } } - $length=strlen($text); + $length = strlen( $text ); # this should not happen, since it is not possible to store an empty, new # page. Let's insert a standard text in case it does, though - if($length == 0 && $reason === '') { - $reason = wfMsg('exblank'); + if( $length == 0 && $reason === '' ) { + $reason = wfMsgForContent( 'exblank' ); } - if($length < 500 && $reason === '') { - + if( $length < 500 && $reason === '' ) { # comment field=255, let's grep the first 150 to have some user # space left - $text=substr($text,0,150); - # let's strip out newlines and HTML tags - $text=preg_replace('/\"/',"'",$text); - $text=preg_replace('/\','<',$text); - $text=preg_replace('/\>/','>',$text); - $text=preg_replace("/[\n\r]/",'',$text); - - if( $length > 150 ) { $text .= '...'; } # we've only pasted part of the text - - if(!$blanked) { - if(!$all_same_user) { - $reason = wfMsg ( 'excontent', $text ); + global $wgContLang; + $text = $wgContLang->truncate( $text, 150, '...' ); + + # let's strip out newlines + $text = preg_replace( "/[\n\r]/", '', $text ); + + if( !$blanked ) { + if( !$all_same_user ) { + $reason = wfMsgForContent( 'excontent', $text ); } else { - $reason = wfMsg ( 'excontentauthor', $text, $rev_name ); + $reason = wfMsgForContent( 'excontentauthor', $text, $rev_name ); } } else { - $reason = wfMsg ( 'exbeforeblank', $text ); + $reason = wfMsgForContent( 'exbeforeblank', $text ); } } } @@ -1674,7 +1873,7 @@ class Article { $formaction = $this->mTitle->escapeLocalURL( 'action=delete' . $par ); - $confirm = htmlspecialchars( wfMsg( 'confirm' ) ); + $confirm = htmlspecialchars( wfMsg( 'deletepage' ) ); $delcom = htmlspecialchars( wfMsg( 'deletecomment' ) ); $token = htmlspecialchars( $wgUser->editToken() ); @@ -1714,18 +1913,14 @@ class Article { if (wfRunHooks('ArticleDelete', array(&$this, &$wgUser, &$reason))) { if ( $this->doDeleteArticle( $reason ) ) { $deleted = $this->mTitle->getPrefixedText(); - + $wgOut->setPagetitle( wfMsg( 'actioncomplete' ) ); $wgOut->setRobotpolicy( 'noindex,nofollow' ); - - $sk = $wgUser->getSkin(); - $loglink = $sk->makeKnownLink( $wgContLang->getNsText( NS_SPECIAL ) . - ':Log/delete', - wfMsg( 'deletionlog' ) ); - + + $loglink = '[[Special:Log/delete|' . wfMsg( 'deletionlog' ) . ']]'; $text = wfMsg( 'deletedtext', $deleted, $loglink ); - - $wgOut->addHTML( '
' . $text . "
\n" ); + + $wgOut->addWikiText( $text ); $wgOut->returnToMain( false ); wfRunHooks('ArticleDeleteComplete', array(&$this, &$wgUser, $reason)); } else { @@ -1740,8 +1935,8 @@ class Article { * Returns success */ function doDeleteArticle( $reason ) { - global $wgUser; - global $wgUseSquid, $wgDeferredUpdateList, $wgInternalServer, $wgPostCommitUpdateList; + global $wgUser, $wgUseSquid, $wgDeferredUpdateList; + global $wgPostCommitUpdateList, $wgUseTrackbacks; $fname = 'Article::doDeleteArticle'; wfDebug( $fname."\n" ); @@ -1755,7 +1950,7 @@ class Article { return false; } - $u = new SiteStatsUpdate( 0, 1, -$this->isCountable( $this->getContent( true ) ) ); + $u = new SiteStatsUpdate( 0, 1, -$this->isCountable( $this->getContent( true ) ), -1 ); array_push( $wgDeferredUpdateList, $u ); $linksTo = $this->mTitle->getLinksTo(); @@ -1802,11 +1997,14 @@ class Article { 'page_id = rev_page' ), $fname ); - + # Now that it's safely backed up, delete it $dbw->delete( 'revision', array( 'rev_page' => $id ), $fname ); $dbw->delete( 'page', array( 'page_id' => $id ), $fname); - + + if ($wgUseTrackbacks) + $dbw->delete( 'trackbacks', array( 'tb_page' => $id ), $fname ); + # Clean up recentchanges entries... $dbw->delete( 'recentchanges', array( 'rc_namespace' => $ns, 'rc_title' => $t ), $fname ); @@ -1873,7 +2071,7 @@ class Article { $from = str_replace( '_', ' ', $wgRequest->getVal( 'from' ) ); if( $from != $current->getUserText() ) { - $wgOut->setPageTitle(wfmsg('rollbackfailed')); + $wgOut->setPageTitle( wfMsg('rollbackfailed') ); $wgOut->addWikiText( wfMsg( 'alreadyrolled', htmlspecialchars( $this->mTitle->getPrefixedText()), htmlspecialchars( $from ), @@ -1887,7 +2085,7 @@ class Article { } # Get the last edit not by this guy - $user = IntVal( $current->getUser() ); + $user = intval( $current->getUser() ); $user_text = $dbw->addQuotes( $current->getUserText() ); $s = $dbw->selectRow( 'revision', array( 'rev_id', 'rev_timestamp' ), @@ -1906,7 +2104,7 @@ class Article { $wgOut->addHTML( wfMsg( 'cantrollback' ) ); return; } - + if ( $bot ) { # Mark all reverted edits as bot $dbw->update( 'recentchanges', @@ -1920,17 +2118,19 @@ class Article { ); } - # Save it! + # Get the edit summary $target = Revision::newFromId( $s->rev_id ); - $newcomment = wfMsg( 'revertpage', $target->getUserText(), $from ); - + $newComment = wfMsgForContent( 'revertpage', $target->getUserText(), $from ); + $newComment = $wgRequest->getText( 'summary', $newComment ); + + # Save it! $wgOut->setPagetitle( wfMsg( 'actioncomplete' ) ); $wgOut->setRobotpolicy( 'noindex,nofollow' ); - $wgOut->addHTML( '