2003-04-14 23:10:40 +00:00
< ?
# Class representing a Wikipedia article and history.
# See design.doc for an overview.
2003-08-02 20:43:11 +00:00
# Note: edit user interface and cache support functions have been
# moved to separate EditPage and CacheManager classes.
2003-11-09 11:45:12 +00:00
/* CHECK MERGE @@@
TEST THIS @@@
* s / \ $wgTitle / \ $this -> mTitle / performed , many replacements
* mTitle variable added to class
*/
2003-08-08 03:08:06 +00:00
include_once ( " CacheManager.php " );
2003-04-14 23:10:40 +00:00
class Article {
/* private */ var $mContent , $mContentLoaded ;
/* private */ var $mUser , $mTimestamp , $mUserText ;
/* private */ var $mCounter , $mComment , $mCountAdjustment ;
/* private */ var $mMinorEdit , $mRedirectedFrom ;
2003-11-09 11:45:12 +00:00
/* private */ var $mTouched , $mFileCache , $mTitle ;
2003-04-14 23:10:40 +00:00
2003-09-01 08:30:14 +00:00
function Article ( & $title ) {
$this -> mTitle =& $title ;
$this -> clear ();
}
2003-04-14 23:10:40 +00:00
/* private */ function clear ()
{
$this -> mContentLoaded = false ;
$this -> mUser = $this -> mCounter = - 1 ; # Not loaded
$this -> mRedirectedFrom = $this -> mUserText =
2003-05-16 13:56:34 +00:00
$this -> mTimestamp = $this -> mComment = $this -> mFileCache = " " ;
2003-04-14 23:10:40 +00:00
$this -> mCountAdjustment = 0 ;
$this -> mTouched = " 19700101000000 " ;
}
# Note that getContent/loadContent may follow redirects if
2003-11-09 11:45:12 +00:00
# not told otherwise, and so may cause a change to mTitle.
2003-04-14 23:10:40 +00:00
function getContent ( $noredir = false )
{
2003-09-01 08:30:14 +00:00
global $action , $section , $count ; # From query string
2003-10-16 13:30:45 +00:00
$fname = " Article::getContent " ;
wfProfileIn ( $fname );
2003-04-14 23:10:40 +00:00
if ( 0 == $this -> getID () ) {
if ( " edit " == $action ) {
2003-10-16 13:30:45 +00:00
wfProfileOut ( $fname );
2003-04-14 23:10:40 +00:00
return " " ; # was "newarticletext", now moved above the box)
}
2003-10-16 13:30:45 +00:00
wfProfileOut ( $fname );
2003-04-14 23:10:40 +00:00
return wfMsg ( " noarticletext " );
} else {
$this -> loadContent ( $noredir );
if (
# check if we're displaying a [[User talk:x.x.x.x]] anonymous talk page
2003-09-01 08:30:14 +00:00
( $this -> mTitle -> getNamespace () == Namespace :: getTalk ( Namespace :: getUser ()) ) &&
preg_match ( " /^ \ d { 1,3} \ . \ d { 1,3}. \ d { 1,3} \ . \ d { 1,3} $ / " , $this -> mTitle -> getText ()) &&
2003-04-14 23:10:40 +00:00
$action == " view "
)
{
2003-10-16 13:30:45 +00:00
wfProfileOut ( $fname );
2003-04-14 23:10:40 +00:00
return $this -> mContent . " \n " . wfMsg ( " anontalkpagetext " ); }
2003-06-30 00:19:35 +00:00
else {
if ( $action == " edit " ) {
if ( $section != " " ) {
2003-10-16 13:30:45 +00:00
if ( $section == " new " ) {
wfProfileOut ( $fname );
return " " ;
}
2003-06-30 00:19:35 +00:00
2003-07-20 13:13:06 +00:00
$secs = preg_split ( " /(^=+.*?=+|^<h[1-6].*?>.*?< \ /h[1-6].*?>)/mi " ,
2003-06-30 00:19:35 +00:00
$this -> mContent , - 1 ,
PREG_SPLIT_DELIM_CAPTURE );
if ( $section == 0 ) {
2003-10-16 13:30:45 +00:00
wfProfileOut ( $fname );
2003-06-30 00:19:35 +00:00
return trim ( $secs [ 0 ]);
} else {
2003-10-16 13:30:45 +00:00
wfProfileOut ( $fname );
2003-06-30 00:19:35 +00:00
return trim ( $secs [ $section * 2 - 1 ] . $secs [ $section * 2 ]);
}
}
}
2003-10-16 13:30:45 +00:00
wfProfileOut ( $fname );
2003-04-14 23:10:40 +00:00
return $this -> mContent ;
}
}
}
function loadContent ( $noredir = false )
{
2003-09-01 08:30:14 +00:00
global $wgOut , $wgMwRedir ;
2003-04-14 23:10:40 +00:00
global $oldid , $redirect ; # From query
if ( $this -> mContentLoaded ) return ;
$fname = " Article::loadContent " ;
# Pre-fill content with error message so that if something
# fails we'll have something telling us what we intended.
2003-09-01 08:30:14 +00:00
$t = $this -> mTitle -> getPrefixedText ();
2003-11-09 11:45:12 +00:00
if ( isset ( $oldid ) ) {
$oldid = IntVal ( $oldid );
$t .= " ,oldid= { $oldid } " ;
}
if ( isset ( $redirect ) ) {
$redirect = ( $redirect == " no " ) ? " no " : " yes " ;
$t .= " ,redirect= { $redirect } " ;
}
$this -> mContent = wfMsg ( " missingarticle " , $t );
2003-04-14 23:10:40 +00:00
if ( ! $oldid ) { # Retrieve current version
$id = $this -> getID ();
if ( 0 == $id ) return ;
$sql = " SELECT " .
" cur_text,cur_timestamp,cur_user,cur_counter,cur_restrictions,cur_touched " .
" FROM cur WHERE cur_id= { $id } " ;
2003-11-02 13:57:24 +00:00
wfDebug ( " $sql\n " );
2003-09-20 02:30:00 +00:00
$res = wfQuery ( $sql , DB_READ , $fname );
2003-11-02 13:57:24 +00:00
if ( 0 == wfNumRows ( $res ) ) {
return ;
}
2003-04-14 23:10:40 +00:00
$s = wfFetchObject ( $res );
# If we got a redirect, follow it (unless we've been told
# not to by either the function parameter or the query
if ( ( " no " != $redirect ) && ( false == $noredir ) &&
2003-08-31 09:46:37 +00:00
( $wgMwRedir -> matchStart ( $s -> cur_text ) ) ) {
2003-04-14 23:10:40 +00:00
if ( preg_match ( " / \\ [ \\ [([^ \\ ] \\ |]+)[ \\ ] \\ |]/ " ,
$s -> cur_text , $m ) ) {
$rt = Title :: newFromText ( $m [ 1 ] );
# Gotta hand redirects to special pages differently:
# Fill the HTTP response "Location" header and ignore
# the rest of the page we're on.
if ( $rt -> getInterwiki () != " " ) {
$wgOut -> redirect ( $rt -> getFullURL () ) ;
return ;
}
if ( $rt -> getNamespace () == Namespace :: getSpecial () ) {
$wgOut -> redirect ( wfLocalUrl (
$rt -> getPrefixedURL () ) );
return ;
}
$rid = $rt -> getArticleID ();
if ( 0 != $rid ) {
$sql = " SELECT cur_text,cur_timestamp,cur_user, " .
" cur_counter,cur_touched FROM cur WHERE cur_id= { $rid } " ;
2003-09-20 02:30:00 +00:00
$res = wfQuery ( $sql , DB_READ , $fname );
2003-04-14 23:10:40 +00:00
if ( 0 != wfNumRows ( $res ) ) {
2003-09-01 08:30:14 +00:00
$this -> mRedirectedFrom = $this -> mTitle -> getPrefixedText ();
$this -> mTitle = $rt ;
2003-04-14 23:10:40 +00:00
$s = wfFetchObject ( $res );
}
}
}
}
2003-11-02 13:57:24 +00:00
2003-04-14 23:10:40 +00:00
$this -> mContent = $s -> cur_text ;
$this -> mUser = $s -> cur_user ;
$this -> mCounter = $s -> cur_counter ;
$this -> mTimestamp = $s -> cur_timestamp ;
$this -> mTouched = $s -> cur_touched ;
2003-09-01 08:30:14 +00:00
$this -> mTitle -> mRestrictions = explode ( " , " , trim ( $s -> cur_restrictions ) );
$this -> mTitle -> mRestrictionsLoaded = true ;
2003-04-14 23:10:40 +00:00
wfFreeResult ( $res );
} else { # oldid set, retrieve historical version
$sql = " SELECT old_text,old_timestamp,old_user FROM old " .
" WHERE old_id= { $oldid } " ;
2003-09-20 02:30:00 +00:00
$res = wfQuery ( $sql , DB_READ , $fname );
2003-04-14 23:10:40 +00:00
if ( 0 == wfNumRows ( $res ) ) { return ; }
$s = wfFetchObject ( $res );
$this -> mContent = $s -> old_text ;
$this -> mUser = $s -> old_user ;
$this -> mCounter = 0 ;
$this -> mTimestamp = $s -> old_timestamp ;
wfFreeResult ( $res );
}
$this -> mContentLoaded = true ;
}
2003-09-01 08:30:14 +00:00
function getID () { return $this -> mTitle -> getArticleID (); }
2003-04-14 23:10:40 +00:00
function getCount ()
{
if ( - 1 == $this -> mCounter ) {
$id = $this -> getID ();
$this -> mCounter = wfGetSQL ( " cur " , " cur_counter " , " cur_id= { $id } " );
}
return $this -> mCounter ;
}
# Would the given text make this article a "good" article (i.e.,
# suitable for including in the article count)?
function isCountable ( $text )
{
2003-09-01 08:30:14 +00:00
global $wgUseCommaCount , $wgMwRedir ;
2003-08-31 09:46:37 +00:00
2003-09-01 08:30:14 +00:00
if ( 0 != $this -> mTitle -> getNamespace () ) { return 0 ; }
2003-08-31 09:46:37 +00:00
if ( $wgMwRedir -> matchStart ( $text ) ) { return 0 ; }
2003-04-14 23:10:40 +00:00
$token = ( $wgUseCommaCount ? " , " : " [[ " );
if ( false === strstr ( $text , $token ) ) { return 0 ; }
return 1 ;
}
# Load the field related to the last edit time of the article.
# This isn't necessary for all uses, so it's only done if needed.
/* private */ function loadLastEdit ()
{
global $wgOut ;
if ( - 1 != $this -> mUser ) return ;
$sql = " SELECT cur_user,cur_user_text,cur_timestamp, " .
" cur_comment,cur_minor_edit FROM cur WHERE " .
" cur_id= " . $this -> getID ();
2003-09-20 02:30:00 +00:00
$res = wfQuery ( $sql , DB_READ , " Article::loadLastEdit " );
2003-04-14 23:10:40 +00:00
if ( wfNumRows ( $res ) > 0 ) {
$s = wfFetchObject ( $res );
$this -> mUser = $s -> cur_user ;
$this -> mUserText = $s -> cur_user_text ;
$this -> mTimestamp = $s -> cur_timestamp ;
$this -> mComment = $s -> cur_comment ;
$this -> mMinorEdit = $s -> cur_minor_edit ;
}
}
function getTimestamp ()
{
$this -> loadLastEdit ();
return $this -> mTimestamp ;
}
function getUser ()
{
$this -> loadLastEdit ();
return $this -> mUser ;
}
function getUserText ()
{
$this -> loadLastEdit ();
return $this -> mUserText ;
}
function getComment ()
{
$this -> loadLastEdit ();
return $this -> mComment ;
}
function getMinorEdit ()
{
$this -> loadLastEdit ();
return $this -> mMinorEdit ;
}
# This is the default action of the script: just view the page of
# the given title.
function view ()
{
2003-09-01 08:30:14 +00:00
global $wgUser , $wgOut , $wgLang ;
2003-04-14 23:10:40 +00:00
global $oldid , $diff ; # From query
2003-10-25 08:01:33 +00:00
global $wgLinkCache , $IP ;
2003-10-16 13:30:45 +00:00
$fname = " Article::view " ;
wfProfileIn ( $fname );
2003-04-14 23:10:40 +00:00
$wgOut -> setArticleFlag ( true );
$wgOut -> setRobotpolicy ( " index,follow " );
# If we got diff and oldid in the query, we want to see a
# diff page instead of the article.
if ( isset ( $diff ) ) {
2003-09-01 08:30:14 +00:00
$wgOut -> setPageTitle ( $this -> mTitle -> getPrefixedText () );
2003-04-14 23:10:40 +00:00
$de = new DifferenceEngine ( $oldid , $diff );
$de -> showDiffPage ();
2003-10-16 13:30:45 +00:00
wfProfileOut ( $fname );
2003-04-14 23:10:40 +00:00
return ;
}
2003-11-09 11:45:12 +00:00
if ( ! isset ( $oldid ) ) {
if ( $this -> checkTouched () ) {
$wgOut -> checkLastModified ( $this -> mTouched );
$this -> tryFileCache ();
}
}
$text = $this -> getContent (); # May change mTitle
2003-09-01 08:30:14 +00:00
$wgOut -> setPageTitle ( $this -> mTitle -> getPrefixedText () );
$wgOut -> setHTMLTitle ( $this -> mTitle -> getPrefixedText () .
2003-04-14 23:10:40 +00:00
" - " . wfMsg ( " wikititlesuffix " ) );
# We're looking at an old revision
if ( $oldid ) {
$this -> setOldSubtitle ();
$wgOut -> setRobotpolicy ( " noindex,follow " );
}
if ( " " != $this -> mRedirectedFrom ) {
$sk = $wgUser -> getSkin ();
$redir = $sk -> makeKnownLink ( $this -> mRedirectedFrom , " " ,
" redirect=no " );
$s = str_replace ( " $ 1 " , $redir , wfMsg ( " redirectedfrom " ) );
$wgOut -> setSubtitle ( $s );
}
$wgOut -> checkLastModified ( $this -> mTouched );
2003-05-16 13:39:22 +00:00
$this -> tryFileCache ();
2003-09-01 08:30:14 +00:00
$wgLinkCache -> preFill ( $this -> mTitle );
2003-04-14 23:10:40 +00:00
$wgOut -> addWikiText ( $text );
$this -> viewUpdates ();
2003-10-16 13:30:45 +00:00
wfProfileOut ( $fname );
2003-04-14 23:10:40 +00:00
}
2003-11-09 11:45:12 +00:00
# This is the function that gets called for "action=edit".
function edit ()
{
global $wgOut , $wgUser ;
global $wpTextbox1 , $wpSummary , $wpSave , $wpPreview ;
global $wpMinoredit , $wpEdittime , $wpTextbox2 ;
$fields = array ( " wpTextbox1 " , " wpSummary " , " wpTextbox2 " );
wfCleanFormFields ( $fields );
if ( ! $this -> mTitle -> userCanEdit () ) {
$wgOut -> readOnlyPage ( $this -> getContent (), true );
return ;
}
if ( $wgUser -> isBlocked () ) {
$this -> blockedIPpage ();
return ;
}
if ( wfReadOnly () ) {
if ( isset ( $wpSave ) or isset ( $wpPreview ) ) {
$this -> editForm ( " preview " );
} else {
$wgOut -> readOnlyPage ( $this -> getContent () );
}
return ;
}
if ( $_SERVER [ 'REQUEST_METHOD' ] != " POST " ) unset ( $wpSave );
if ( isset ( $wpSave ) ) {
$this -> editForm ( " save " );
} else if ( isset ( $wpPreview ) ) {
$this -> editForm ( " preview " );
} else { # First time through
$this -> editForm ( " initial " );
}
}
# Since there is only one text field on the edit form,
# pressing <enter> will cause the form to be submitted, but
# the submit button value won't appear in the query, so we
# Fake it here before going back to edit(). This is kind of
# ugly, but it helps some old URLs to still work.
function submit ()
{
global $wpSave , $wpPreview ;
if ( ! isset ( $wpPreview ) ) { $wpSave = 1 ; }
$this -> edit ();
}
# The edit form is self-submitting, so that when things like
# preview and edit conflicts occur, we get the same form back
# with the extra stuff added. Only when the final submission
# is made and all is well do we actually save and redirect to
# the newly-edited page.
function editForm ( $formtype )
{
global $wgOut , $wgUser ;
global $wpTextbox1 , $wpSummary , $wpWatchthis ;
global $wpSave , $wpPreview ;
global $wpMinoredit , $wpEdittime , $wpTextbox2 , $wpSection ;
global $oldid , $redirect , $section ;
global $wgLang ;
if ( isset ( $wpSection )) { $section = $wpSection ; } else { $wpSection = $section ; }
$sk = $wgUser -> getSkin ();
$isConflict = false ;
$wpTextbox1 = rtrim ( $wpTextbox1 ) ; # To avoid text getting longer on each preview
if ( ! $this -> mTitle -> getArticleID ()) { # new article
$wgOut -> addWikiText ( wfmsg ( " newarticletext " ));
}
# Attempt submission here. This will check for edit conflicts,
# and redundantly check for locked database, blocked IPs, etc.
# that edit() already checked just in case someone tries to sneak
# in the back door with a hand-edited submission URL.
if ( " save " == $formtype ) {
if ( $wgUser -> isBlocked () ) {
$this -> blockedIPpage ();
return ;
}
if ( wfReadOnly () ) {
$wgOut -> readOnlyPage ();
return ;
}
# If article is new, insert it.
$aid = $this -> mTitle -> getArticleID ();
if ( 0 == $aid ) {
# we need to strip Windoze linebreaks because some browsers
# append them and the string comparison fails
if ( ( " " == $wpTextbox1 ) ||
( wfMsg ( " newarticletext " ) == rtrim ( preg_replace ( " / \r / " , " " , $wpTextbox1 ) ) ) ) {
$wgOut -> redirect ( wfLocalUrl (
$this -> mTitle -> getPrefixedURL () ) );
return ;
}
$this -> mCountAdjustment = $this -> isCountable ( $wpTextbox1 );
$this -> insertNewArticle ( $wpTextbox1 , $wpSummary , $wpMinoredit , $wpWatchthis );
return ;
}
# Article exists. Check for edit conflict.
# Don't check for conflict when appending a comment - this should always work
$this -> clear (); # Force reload of dates, etc.
if ( $section != " new " && ( $this -> getTimestamp () != $wpEdittime ) ) {
$isConflict = true ;
}
$u = $wgUser -> getID ();
# Supress edit conflict with self
if ( ( 0 != $u ) && ( $this -> getUser () == $u ) ) {
$isConflict = false ;
} else {
# switch from section editing to normal editing in edit conflict
if ( $isConflict ) {
$section = " " ; $wpSection = " " ;
}
}
if ( ! $isConflict ) {
# All's well: update the article here
if ( $this -> updateArticle ( $wpTextbox1 , $wpSummary , $wpMinoredit , $wpWatchthis , $wpSection ))
return ;
else
$isConflict = true ;
}
}
# First time through: get contents, set time for conflict
# checking, etc.
if ( " initial " == $formtype ) {
$wpEdittime = $this -> getTimestamp ();
$wpTextbox1 = $this -> getContent ( true );
$wpSummary = " " ;
}
$wgOut -> setRobotpolicy ( " noindex,nofollow " );
$wgOut -> setArticleFlag ( false );
if ( $isConflict ) {
$s = str_replace ( " $ 1 " , $this -> mTitle -> getPrefixedText (),
wfMsg ( " editconflict " ) );
$wgOut -> setPageTitle ( $s );
$wgOut -> addHTML ( wfMsg ( " explainconflict " ) );
$wpTextbox2 = $wpTextbox1 ;
$wpTextbox1 = $this -> getContent ( true );
$wpEdittime = $this -> getTimestamp ();
} else {
$s = str_replace ( " $ 1 " , $this -> mTitle -> getPrefixedText (),
wfMsg ( " editing " ) );
if ( $section != " " ) {
if ( $section == " new " ) {
$s .= wfMsg ( " commentedit " );
} else {
$s .= wfMsg ( " sectionedit " );
}
}
$wgOut -> setPageTitle ( $s );
if ( $oldid ) {
$this -> setOldSubtitle ();
$wgOut -> addHTML ( wfMsg ( " editingold " ) );
}
}
if ( wfReadOnly () ) {
$wgOut -> addHTML ( " <strong> " .
wfMsg ( " readonlywarning " ) .
" </strong> " );
}
if ( $this -> mTitle -> isProtected () ) {
$wgOut -> addHTML ( " <strong> " . wfMsg ( " protectedpagewarning " ) .
" </strong><br /> \n " );
}
$kblength = ( int )( strlen ( $wpTextbox1 ) / 1024 );
if ( $kblength > 29 ) {
$wgOut -> addHTML ( " <strong> " .
str_replace ( '$1' , $kblength , wfMsg ( " longpagewarning " ) )
. " </strong> " );
}
$rows = $wgUser -> getOption ( " rows " );
$cols = $wgUser -> getOption ( " cols " );
$ew = $wgUser -> getOption ( " editwidth " );
if ( $ew ) $ew = " style= \" width:100% \" " ;
else $ew = " " ;
$q = " action=submit " ;
if ( " no " == $redirect ) { $q .= " &redirect=no " ; }
$action = wfEscapeHTML ( wfLocalUrl ( $this -> mTitle -> getPrefixedURL (), $q ) );
$summary = wfMsg ( " summary " );
$subject = wfMsg ( " subject " );
$minor = wfMsg ( " minoredit " );
$watchthis = wfMsg ( " watchthis " );
$save = wfMsg ( " savearticle " );
$prev = wfMsg ( " showpreview " );
$cancel = $sk -> makeKnownLink ( $this -> mTitle -> getPrefixedURL (),
wfMsg ( " cancel " ) );
$edithelp = $sk -> makeKnownLink ( wfMsg ( " edithelppage " ),
wfMsg ( " edithelp " ) );
$copywarn = str_replace ( " $ 1 " , $sk -> makeKnownLink (
wfMsg ( " copyrightpage " ) ), wfMsg ( " copyrightwarning " ) );
$wpTextbox1 = wfEscapeHTML ( $wpTextbox1 );
$wpTextbox2 = wfEscapeHTML ( $wpTextbox2 );
$wpSummary = wfEscapeHTML ( $wpSummary );
// activate checkboxes if user wants them to be always active
if ( ! $wpPreview && $wgUser -> getOption ( " watchdefault " )) $wpWatchthis = 1 ;
if ( ! $wpPreview && $wgUser -> getOption ( " minordefault " )) $wpMinoredit = 1 ;
// activate checkbox also if user is already watching the page,
// require wpWatchthis to be unset so that second condition is not
// checked unnecessarily
if ( ! $wpWatchthis && ! $wpPreview && $this -> mTitle -> userIsWatching ()) $wpWatchthis = 1 ;
if ( 0 != $wgUser -> getID () ) {
$checkboxhtml =
" <input tabindex=3 type=checkbox value=1 name='wpMinoredit' " . ( $wpMinoredit ? " checked " : " " ) . " > { $minor } " .
" <input tabindex=4 type=checkbox name='wpWatchthis' " . ( $wpWatchthis ? " checked " : " " ) . " > { $watchthis } <br> " ;
} else {
$checkboxhtml = " " ;
}
if ( " preview " == $formtype ) {
$previewhead = " <h2> " . wfMsg ( " preview " ) . " </h2> \n <p><large><center><font color= \" #cc0000 \" > " .
wfMsg ( " note " ) . wfMsg ( " previewnote " ) . " </font></center></large><P> \n " ;
if ( $isConflict ) {
$previewhead .= " <h2> " . wfMsg ( " previewconflict " ) .
" </h2> \n " ;
}
$previewtext = wfUnescapeHTML ( $wpTextbox1 );
if ( $wgUser -> getOption ( " previewontop " )) {
$wgOut -> addHTML ( $previewhead );
$wgOut -> addWikiText ( $this -> preSaveTransform ( $previewtext ) . " \n \n " );
}
$wgOut -> addHTML ( " <br clear= \" all \" /> \n " );
}
# 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
if ( $section == " new " ) {
$commentsubject = " { $subject } : <input tabindex=1 type=text value= \" { $wpSummary } \" name= \" wpSummary \" maxlength=200 size=60><br> " ;
} else {
$editsummary = " { $summary } : <input tabindex=3 type=text value= \" { $wpSummary } \" name= \" wpSummary \" maxlength=200 size=60><br> " ;
}
$wgOut -> addHTML ( "
< form id = \ " editform \" name= \" editform \" method= \" post \" action= \" $action\ "
enctype = \ " application/x-www-form-urlencoded \" >
{ $commentsubject }
< textarea tabindex = 2 name = \ " wpTextbox1 \" rows= { $rows }
cols = { $cols }{ $ew } wrap = \ " virtual \" > " .
$wgLang -> recodeForEdit ( $wpTextbox1 ) .
"
</ textarea >
< br > { $editsummary }
{ $checkboxhtml }
< input tabindex = 5 type = submit value = \ " { $save } \" name= \" wpSave \" >
< input tabindex = 6 type = submit value = \ " { $prev } \" name= \" wpPreview \" >
< em > { $cancel } </ em > | < em > { $edithelp } </ em >
< br >< br > { $copywarn }
< input type = hidden value = \ " { $section } \" name= \" wpSection \" >
< input type = hidden value = \ " { $wpEdittime } \" name= \" wpEdittime \" > \n " );
if ( $isConflict ) {
$wgOut -> addHTML ( " <h2> " . wfMsg ( " yourdiff " ) . " </h2> \n " );
DifferenceEngine :: showDiff ( $wpTextbox2 , $wpTextbox1 ,
wfMsg ( " yourtext " ), wfMsg ( " storedversion " ) );
$wgOut -> addHTML ( " <h2> " . wfMsg ( " yourtext " ) . " </h2>
< textarea tabindex = 6 name = \ " wpTextbox2 \" rows= { $rows } cols= { $cols } wrap=virtual> "
. $wgLang -> recodeForEdit ( $wpTextbox2 ) .
"
</ textarea > " );
}
$wgOut -> addHTML ( " </form> \n " );
if ( $formtype == " preview " && ! $wgUser -> getOption ( " previewontop " )) {
$wgOut -> addHTML ( $previewhead );
$wgOut -> addWikiText ( $this -> preSaveTransform ( $previewtext ) );
}
}
2003-04-14 23:10:40 +00:00
# Theoretically we could defer these whole insert and update
# functions for after display, but that's taking a big leap
# of faith, and we want to be able to report database
# errors at some point.
/* private */ function insertNewArticle ( $text , $summary , $isminor , $watchthis )
{
2003-09-01 08:30:14 +00:00
global $wgOut , $wgUser , $wgLinkCache , $wgMwRedir ;
2003-11-09 11:45:12 +00:00
global $wgEnablePersistentLC ;
2003-04-14 23:10:40 +00:00
$fname = " Article::insertNewArticle " ;
2003-09-01 08:30:14 +00:00
$ns = $this -> mTitle -> getNamespace ();
$ttl = $this -> mTitle -> getDBkey ();
2003-04-14 23:10:40 +00:00
$text = $this -> preSaveTransform ( $text );
2003-08-31 09:46:37 +00:00
if ( $wgMwRedir -> matchStart ( $text ) ) { $redir = 1 ; }
2003-04-14 23:10:40 +00:00
else { $redir = 0 ; }
$now = wfTimestampNow ();
$won = wfInvertTimestamp ( $now );
2003-06-03 21:27:06 +00:00
wfSeedRandom ();
2003-07-08 11:15:26 +00:00
$rand = number_format ( mt_rand () / mt_getrandmax (), 12 , " . " , " " );
2003-04-14 23:10:40 +00:00
$sql = " INSERT INTO cur (cur_namespace,cur_title,cur_text, " .
" cur_comment,cur_user,cur_timestamp,cur_minor_edit,cur_counter, " .
" cur_restrictions,cur_user_text,cur_is_redirect, " .
" cur_is_new,cur_random,cur_touched,inverse_timestamp) VALUES ( { $ns } ,' " . wfStrencode ( $ttl ) . " ', ' " .
wfStrencode ( $text ) . " ', ' " .
wfStrencode ( $summary ) . " ', ' " .
$wgUser -> getID () . " ', ' { $now } ', " .
( $isminor ? 1 : 0 ) . " , 0, '', ' " .
2003-06-03 21:27:06 +00:00
wfStrencode ( $wgUser -> getName () ) . " ', $redir , 1, $rand , ' { $now } ', ' { $won } ') " ;
2003-09-20 02:30:00 +00:00
$res = wfQuery ( $sql , DB_WRITE , $fname );
2003-04-14 23:10:40 +00:00
$newid = wfInsertId ();
2003-09-01 08:30:14 +00:00
$this -> mTitle -> resetArticleID ( $newid );
2003-04-14 23:10:40 +00:00
2003-11-09 11:45:12 +00:00
if ( $wgEnablePersistentLC ) {
// Purge related entries in links cache on new page, to heal broken links
$ptitle = wfStrencode ( $ttl );
wfQuery ( " DELETE linkscc FROM linkscc,brokenlinks " .
" WHERE lcc_pageid=bl_from AND bl_to=' { $ptitle } ' " , DB_WRITE );
}
2003-11-08 15:12:34 +00:00
2003-04-14 23:10:40 +00:00
$sql = " INSERT INTO recentchanges (rc_timestamp,rc_cur_time, " .
" rc_namespace,rc_title,rc_new,rc_minor,rc_cur_id,rc_user, " .
" rc_user_text,rc_comment,rc_this_oldid,rc_last_oldid,rc_bot) VALUES ( " .
" ' { $now } ',' { $now } ', { $ns } ,' " . wfStrencode ( $ttl ) . " ',1, " .
( $isminor ? 1 : 0 ) . " , { $newid } , " . $wgUser -> getID () . " ,' " .
wfStrencode ( $wgUser -> getName () ) . " ',' " .
wfStrencode ( $summary ) . " ',0,0, " .
( $wgUser -> isBot () ? 1 : 0 ) . " ) " ;
2003-09-20 02:30:00 +00:00
wfQuery ( $sql , DB_WRITE , $fname );
2003-04-14 23:10:40 +00:00
if ( $watchthis ) {
2003-09-01 08:30:14 +00:00
if ( ! $this -> mTitle -> userIsWatching ()) $this -> watch ();
2003-04-14 23:10:40 +00:00
} else {
2003-09-01 08:30:14 +00:00
if ( $this -> mTitle -> userIsWatching () ) {
2003-04-14 23:10:40 +00:00
$this -> unwatch ();
}
}
2003-11-12 13:07:08 +00:00
# The talk page isn't in the regular link tables, so we need to update manually:
$talkns = $ns ^ 1 ; # talk -> normal; normal -> talk
$sql = " UPDATE cur set cur_touched=' $now ' WHERE cur_namespace= $talkns AND cur_title=' " . wfStrencode ( $ttl ) . " ' " ;
2003-11-15 07:14:05 +00:00
wfQuery ( $sql , DB_WRITE );
2003-11-12 13:07:08 +00:00
2003-04-14 23:10:40 +00:00
$this -> showArticle ( $text , wfMsg ( " newarticle " ) );
}
2003-11-09 11:45:12 +00:00
function updateArticle ( $text , $summary , $minor , $watchthis , $section = " " )
2003-04-14 23:10:40 +00:00
{
2003-09-01 08:30:14 +00:00
global $wgOut , $wgUser , $wgLinkCache ;
2003-08-31 09:46:37 +00:00
global $wgDBtransactions , $wgMwRedir ;
2003-04-14 23:10:40 +00:00
$fname = " Article::updateArticle " ;
2003-08-24 12:09:20 +00:00
$this -> loadLastEdit ();
2003-06-30 00:19:35 +00:00
// insert updated section into old text if we have only edited part
2003-07-29 15:26:53 +00:00
// of the article
2003-07-21 07:36:52 +00:00
if ( $section != " " ) {
2003-06-30 00:19:35 +00:00
$oldtext = $this -> getContent ();
2003-07-21 07:36:52 +00:00
if ( $section == " new " ) {
2003-07-29 15:26:53 +00:00
if ( $summary ) $subject = " == { $summary } == \n \n " ;
$text = $oldtext . " \n \n " . $subject . $text ;
2003-07-21 07:36:52 +00:00
} else {
$secs = preg_split ( " /(^=+.*?=+|^<h[1-6].*?>.*?< \ /h[1-6].*?>)/mi " ,
$oldtext , - 1 , PREG_SPLIT_DELIM_CAPTURE );
$secs [ $section * 2 ] = $text . " \n \n " ; // replace with edited
if ( $section ) { $secs [ $section * 2 - 1 ] = " " ; } // erase old headline
$text = join ( " " , $secs );
}
2003-06-30 00:19:35 +00:00
}
2003-04-14 23:10:40 +00:00
if ( $this -> mMinorEdit ) { $me1 = 1 ; } else { $me1 = 0 ; }
if ( $minor ) { $me2 = 1 ; } else { $me2 = 0 ; }
2003-08-31 09:46:37 +00:00
if ( preg_match ( " /^(( " . $wgMwRedir -> getBaseRegex () . " )[^ \\ n]+)/i " , $text , $m ) ) {
2003-04-14 23:10:40 +00:00
$redir = 1 ;
$text = $m [ 1 ] . " \n " ; # Remove all content but redirect
}
else { $redir = 0 ; }
$text = $this -> preSaveTransform ( $text );
# Update article, but only if changed.
if ( $wgDBtransactions ) {
$sql = " BEGIN " ;
2003-09-20 02:30:00 +00:00
wfQuery ( $sql , DB_WRITE );
2003-04-14 23:10:40 +00:00
}
$oldtext = $this -> getContent ( true );
if ( 0 != strcmp ( $text , $oldtext ) ) {
$this -> mCountAdjustment = $this -> isCountable ( $text )
- $this -> isCountable ( $oldtext );
2003-08-17 11:58:33 +00:00
$now = wfTimestampNow ();
$won = wfInvertTimestamp ( $now );
$sql = " UPDATE cur SET cur_text=' " . wfStrencode ( $text ) .
" ',cur_comment=' " . wfStrencode ( $summary ) .
" ',cur_minor_edit= { $me2 } , cur_user= " . $wgUser -> getID () .
" ,cur_timestamp=' { $now } ',cur_user_text=' " .
wfStrencode ( $wgUser -> getName () ) .
" ',cur_is_redirect= { $redir } , cur_is_new=0, cur_touched=' { $now } ', inverse_timestamp=' { $won } ' " .
" WHERE cur_id= " . $this -> getID () .
" AND cur_timestamp=' " . $this -> getTimestamp () . " ' " ;
2003-09-20 02:30:00 +00:00
$res = wfQuery ( $sql , DB_WRITE , $fname );
2003-08-17 11:58:33 +00:00
if ( wfAffectedRows () == 0 ) {
/* Belated edit conflict! Run away!! */
return false ;
}
2003-04-14 23:10:40 +00:00
$sql = " INSERT INTO old (old_namespace,old_title,old_text, " .
" old_comment,old_user,old_user_text,old_timestamp, " .
" old_minor_edit,inverse_timestamp) VALUES ( " .
2003-09-01 08:30:14 +00:00
$this -> mTitle -> getNamespace () . " , ' " .
wfStrencode ( $this -> mTitle -> getDBkey () ) . " ', ' " .
2003-04-14 23:10:40 +00:00
wfStrencode ( $oldtext ) . " ', ' " .
wfStrencode ( $this -> getComment () ) . " ', " .
$this -> getUser () . " , ' " .
wfStrencode ( $this -> getUserText () ) . " ', ' " .
$this -> getTimestamp () . " ', " . $me1 . " , ' " .
wfInvertTimestamp ( $this -> getTimestamp () ) . " ') " ;
2003-09-20 02:30:00 +00:00
$res = wfQuery ( $sql , DB_WRITE , $fname );
2003-04-14 23:10:40 +00:00
$oldid = wfInsertID ( $res );
$sql = " INSERT INTO recentchanges (rc_timestamp,rc_cur_time, " .
" rc_namespace,rc_title,rc_new,rc_minor,rc_bot,rc_cur_id,rc_user, " .
" rc_user_text,rc_comment,rc_this_oldid,rc_last_oldid) VALUES ( " .
2003-09-01 08:30:14 +00:00
" ' { $now } ',' { $now } ', " . $this -> mTitle -> getNamespace () . " ,' " .
wfStrencode ( $this -> mTitle -> getDBkey () ) . " ',0, { $me2 } , " .
2003-04-14 23:10:40 +00:00
( $wgUser -> isBot () ? 1 : 0 ) . " , " .
$this -> getID () . " , " . $wgUser -> getID () . " ,' " .
wfStrencode ( $wgUser -> getName () ) . " ',' " .
wfStrencode ( $summary ) . " ',0, { $oldid } ) " ;
2003-09-20 02:30:00 +00:00
wfQuery ( $sql , DB_WRITE , $fname );
2003-04-14 23:10:40 +00:00
$sql = " UPDATE recentchanges SET rc_this_oldid= { $oldid } " .
2003-09-01 08:30:14 +00:00
" WHERE rc_namespace= " . $this -> mTitle -> getNamespace () . " AND " .
" rc_title=' " . wfStrencode ( $this -> mTitle -> getDBkey () ) . " ' AND " .
2003-04-14 23:10:40 +00:00
" rc_timestamp=' " . $this -> getTimestamp () . " ' " ;
2003-09-20 02:30:00 +00:00
wfQuery ( $sql , DB_WRITE , $fname );
2003-04-14 23:10:40 +00:00
$sql = " UPDATE recentchanges SET rc_cur_time=' { $now } ' " .
" WHERE rc_cur_id= " . $this -> getID ();
2003-09-20 02:30:00 +00:00
wfQuery ( $sql , DB_WRITE , $fname );
2003-11-08 15:12:34 +00:00
2003-11-09 23:28:06 +00:00
if ( $wgEnablePersistentLC ) {
// Purge link cache for this page
$pageid = $this -> getID ();
wfQuery ( " DELETE FROM linkscc WHERE lcc_pageid=' { $pageid } ' " , DB_WRITE );
// This next query just makes sure stub colored links to this page
// are updated correctly (I think). If performance is more important
// than real-time updating of stub links, we really should skip
// this query.
wfQuery ( " DELETE linkscc FROM linkscc,links " .
" WHERE lcc_title=links.l_from AND l_to= { $pageid } " , DB_WRITE );
}
2003-11-08 15:12:34 +00:00
2003-04-14 23:10:40 +00:00
}
if ( $wgDBtransactions ) {
$sql = " COMMIT " ;
2003-09-20 02:30:00 +00:00
wfQuery ( $sql , DB_WRITE );
2003-04-14 23:10:40 +00:00
}
if ( $watchthis ) {
2003-09-01 08:30:14 +00:00
if ( ! $this -> mTitle -> userIsWatching ()) $this -> watch ();
2003-04-14 23:10:40 +00:00
} else {
2003-09-01 08:30:14 +00:00
if ( $this -> mTitle -> userIsWatching () ) {
2003-04-14 23:10:40 +00:00
$this -> unwatch ();
}
}
2003-08-17 11:58:33 +00:00
$this -> showArticle ( $text , wfMsg ( " updated " ) );
return true ;
2003-04-14 23:10:40 +00:00
}
# After we've either updated or inserted the article, update
# the link tables and redirect to the new page.
function showArticle ( $text , $subtitle )
{
2003-09-01 08:30:14 +00:00
global $wgOut , $wgUser , $wgLinkCache , $wgUseBetterLinksUpdate ;
2003-08-31 09:46:37 +00:00
global $wgMwRedir ;
2003-04-14 23:10:40 +00:00
$wgLinkCache = new LinkCache ();
2003-07-06 11:42:42 +00:00
# Get old version of link table to allow incremental link updates
2003-07-06 12:04:36 +00:00
if ( $wgUseBetterLinksUpdate ) {
2003-09-01 08:30:14 +00:00
$wgLinkCache -> preFill ( $this -> mTitle );
2003-07-06 12:04:36 +00:00
$wgLinkCache -> clear ();
}
2003-07-06 11:42:42 +00:00
2003-08-31 14:30:24 +00:00
# Now update the link cache by parsing the text
$wgOut = new OutputPage ();
2003-07-06 11:42:42 +00:00
$wgOut -> addWikiText ( $text );
2003-04-14 23:10:40 +00:00
$this -> editUpdates ( $text );
2003-08-31 09:46:37 +00:00
if ( $wgMwRedir -> matchStart ( $text ) )
2003-04-14 23:10:40 +00:00
$r = " redirect=no " ;
else
$r = " " ;
2003-09-01 08:30:14 +00:00
$wgOut -> redirect ( wfLocalUrl ( $this -> mTitle -> getPrefixedURL (), $r ) );
2003-04-14 23:10:40 +00:00
}
# Add this page to my watchlist
2003-09-01 09:59:53 +00:00
function watch ( $add = true )
2003-04-14 23:10:40 +00:00
{
2003-09-01 08:30:14 +00:00
global $wgUser , $wgOut , $wgLang ;
2003-04-14 23:10:40 +00:00
global $wgDeferredUpdateList ;
if ( 0 == $wgUser -> getID () ) {
$wgOut -> errorpage ( " watchnologin " , " watchnologintext " );
return ;
}
if ( wfReadOnly () ) {
$wgOut -> readOnlyPage ();
return ;
}
2003-09-01 09:59:53 +00:00
if ( $add )
$wgUser -> addWatch ( $this -> mTitle );
else
$wgUser -> removeWatch ( $this -> mTitle );
2003-04-14 23:10:40 +00:00
2003-09-01 09:59:53 +00:00
$wgOut -> setPagetitle ( wfMsg ( $add ? " addedwatch " : " removedwatch " ) );
2003-04-14 23:10:40 +00:00
$wgOut -> setRobotpolicy ( " noindex,follow " );
$sk = $wgUser -> getSkin () ;
2003-09-01 08:30:14 +00:00
$link = $sk -> makeKnownLink ( $this -> mTitle -> getPrefixedText () ) ;
2003-04-14 23:10:40 +00:00
2003-09-01 09:59:53 +00:00
if ( $add )
$text = wfMsg ( " addedwatchtext " , $link );
else
$text = wfMsg ( " removedwatchtext " , $link );
2003-04-14 23:10:40 +00:00
$wgOut -> addHTML ( $text );
$up = new UserUpdate ();
array_push ( $wgDeferredUpdateList , $up );
$wgOut -> returnToMain ( false );
}
function unwatch ()
{
2003-09-01 09:59:53 +00:00
$this -> watch ( false );
2003-04-14 23:10:40 +00:00
}
# This shares a lot of issues (and code) with Recent Changes
function history ()
{
2003-09-01 08:30:14 +00:00
global $wgUser , $wgOut , $wgLang , $offset , $limit ;
2003-04-14 23:10:40 +00:00
# If page hasn't changed, client can cache this
$wgOut -> checkLastModified ( $this -> getTimestamp () );
2003-10-16 13:30:45 +00:00
$fname = " Article::history " ;
wfProfileIn ( $fname );
2003-04-14 23:10:40 +00:00
2003-09-01 08:30:14 +00:00
$wgOut -> setPageTitle ( $this -> mTitle -> getPRefixedText () );
2003-04-14 23:10:40 +00:00
$wgOut -> setSubtitle ( wfMsg ( " revhistory " ) );
$wgOut -> setArticleFlag ( false );
$wgOut -> setRobotpolicy ( " noindex,nofollow " );
2003-09-01 08:30:14 +00:00
if ( $this -> mTitle -> getArticleID () == 0 ) {
2003-04-14 23:10:40 +00:00
$wgOut -> addHTML ( wfMsg ( " nohistory " ) );
2003-10-16 13:30:45 +00:00
wfProfileOut ( $fname );
2003-04-14 23:10:40 +00:00
return ;
}
$offset = ( int ) $offset ;
$limit = ( int ) $limit ;
if ( $limit == 0 ) $limit = 50 ;
2003-09-01 08:30:14 +00:00
$namespace = $this -> mTitle -> getNamespace ();
$title = $this -> mTitle -> getText ();
2003-04-14 23:10:40 +00:00
$sql = " SELECT old_id,old_user, " .
" old_comment,old_user_text,old_timestamp,old_minor_edit " .
" FROM old USE INDEX (name_title_timestamp) " .
" WHERE old_namespace= { $namespace } AND " .
2003-09-01 08:30:14 +00:00
" old_title=' " . wfStrencode ( $this -> mTitle -> getDBkey () ) . " ' " .
2003-04-14 23:10:40 +00:00
" ORDER BY inverse_timestamp LIMIT $offset , $limit " ;
2003-09-20 02:30:00 +00:00
$res = wfQuery ( $sql , DB_READ , " Article::history " );
2003-04-14 23:10:40 +00:00
$revs = wfNumRows ( $res );
2003-09-01 08:30:14 +00:00
if ( $this -> mTitle -> getArticleID () == 0 ) {
2003-04-14 23:10:40 +00:00
$wgOut -> addHTML ( wfMsg ( " nohistory " ) );
2003-10-16 13:30:45 +00:00
wfProfileOut ( $fname );
2003-04-14 23:10:40 +00:00
return ;
}
$sk = $wgUser -> getSkin ();
$numbar = wfViewPrevNext (
$offset , $limit ,
2003-09-01 08:30:14 +00:00
$this -> mTitle -> getPrefixedText (),
2003-04-14 23:10:40 +00:00
" action=history " );
$s = $numbar ;
$s .= $sk -> beginHistoryList ();
if ( $offset == 0 )
$s .= $sk -> historyLine ( $this -> getTimestamp (), $this -> getUser (),
$this -> getUserText (), $namespace ,
$title , 0 , $this -> getComment (),
( $this -> getMinorEdit () > 0 ) );
$revs = wfNumRows ( $res );
while ( $line = wfFetchObject ( $res ) ) {
$s .= $sk -> historyLine ( $line -> old_timestamp , $line -> old_user ,
$line -> old_user_text , $namespace ,
$title , $line -> old_id ,
$line -> old_comment , ( $line -> old_minor_edit > 0 ) );
}
$s .= $sk -> endHistoryList ();
$s .= $numbar ;
$wgOut -> addHTML ( $s );
2003-10-16 13:30:45 +00:00
wfProfileOut ( $fname );
2003-04-14 23:10:40 +00:00
}
2003-09-01 09:59:53 +00:00
function protect ( $limit = " sysop " )
2003-04-14 23:10:40 +00:00
{
2003-09-01 08:30:14 +00:00
global $wgUser , $wgOut ;
2003-04-14 23:10:40 +00:00
if ( ! $wgUser -> isSysop () ) {
$wgOut -> sysopRequired ();
return ;
}
if ( wfReadOnly () ) {
$wgOut -> readOnlyPage ();
return ;
}
2003-09-01 08:30:14 +00:00
$id = $this -> mTitle -> getArticleID ();
2003-04-14 23:10:40 +00:00
if ( 0 == $id ) {
$wgOut -> fatalEror ( wfMsg ( " badarticleerror " ) );
return ;
}
$sql = " UPDATE cur SET cur_touched=' " . wfTimestampNow () . " ', " .
2003-09-01 09:59:53 +00:00
" cur_restrictions=' { $limit } ' WHERE cur_id= { $id } " ;
2003-09-20 02:30:00 +00:00
wfQuery ( $sql , DB_WRITE , " Article::protect " );
2003-04-14 23:10:40 +00:00
2003-11-12 13:07:08 +00:00
$log = new LogPage ( wfMsg ( " protectlogpage " ), wfMsg ( " protectlogtext " ) );
if ( $limit === " " ) {
$log -> addEntry ( wfMsg ( " unprotectedarticle " , $wgTitle -> getPrefixedText () ), " " );
} else {
2003-11-14 13:54:15 +00:00
$log -> addEntry ( wfMsg ( " protectedarticle " , $wgTitle -> getPrefixedText () ), " " );
2003-11-12 13:07:08 +00:00
}
2003-09-01 08:30:14 +00:00
$wgOut -> redirect ( wfLocalUrl ( $this -> mTitle -> getPrefixedURL () ) );
2003-04-14 23:10:40 +00:00
}
function unprotect ()
{
2003-09-01 09:59:53 +00:00
return $this -> protect ( " " );
2003-04-14 23:10:40 +00:00
}
function delete ()
{
2003-09-01 08:30:14 +00:00
global $wgUser , $wgOut ;
2003-04-14 23:10:40 +00:00
global $wpConfirm , $wpReason , $image , $oldimage ;
2003-11-09 11:45:12 +00:00
# This code desperately needs to be totally rewritten
if ( ( ! $wgUser -> isSysop () ) ) {
2003-04-14 23:10:40 +00:00
$wgOut -> sysopRequired ();
return ;
}
if ( wfReadOnly () ) {
$wgOut -> readOnlyPage ();
return ;
}
# Better double-check that it hasn't been deleted yet!
$wgOut -> setPagetitle ( wfMsg ( " confirmdelete " ) );
2003-09-01 09:59:53 +00:00
if ( ( " " == trim ( $this -> mTitle -> getText () ) )
or ( $this -> mTitle -> getArticleId () == 0 ) ) {
$wgOut -> fatalError ( wfMsg ( " cannotdelete " ) );
return ;
}
2003-05-23 04:26:51 +00:00
2003-09-01 09:59:53 +00:00
# determine whether this page has earlier revisions
# and insert a warning if it does
# we select the text because it might be useful below
$sql = " SELECT old_text FROM old WHERE old_namespace=0 and old_title=' " . wfStrencode ( $this -> mTitle -> getPrefixedDBkey ()) . " ' ORDER BY inverse_timestamp LIMIT 1 " ;
2003-09-20 02:30:00 +00:00
$res = wfQuery ( $sql , DB_READ , $fname );
2003-09-01 09:59:53 +00:00
if ( ( $old = wfFetchObject ( $res )) && ! $wpConfirm ) {
$skin = $wgUser -> getSkin ();
$wgOut -> addHTML ( " <B> " . wfMsg ( " historywarning " ));
$wgOut -> addHTML ( $skin -> historyLink () . " </B><P> " );
}
2003-05-23 04:26:51 +00:00
2003-09-01 09:59:53 +00:00
$sql = " SELECT cur_text FROM cur WHERE cur_namespace=0 and cur_title=' " . wfStrencode ( $this -> mTitle -> getPrefixedDBkey ()) . " ' " ;
2003-09-20 02:30:00 +00:00
$res = wfQuery ( $sql , DB_READ , $fname );
2003-09-01 09:59:53 +00:00
if ( ( $s = wfFetchObject ( $res ))) {
2003-05-23 04:26:51 +00:00
2003-09-01 09:59:53 +00:00
# if this is a mini-text, we can paste part of it into the deletion reason
2003-05-23 04:26:51 +00:00
2003-09-01 09:59:53 +00:00
#if this is empty, an earlier revision may contain "useful" text
if ( $s -> cur_text != " " ) {
$text = $s -> cur_text ;
} else {
if ( $old ) {
$text = $old -> old_text ;
$blanked = 1 ;
2003-05-23 04:26:51 +00:00
}
2003-09-01 09:59:53 +00:00
}
$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 && ! $wpReason ) { $wpReason = wfmsg ( " exblank " );}
if ( $length < 500 && ! $wpReason ) {
# 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 ( ! $blanked ) {
$wpReason = wfMsg ( " excontent " ) . " ' " . $text ;
} else {
$wpReason = wfMsg ( " exbeforeblank " ) . " ' " . $text ;
2003-05-23 04:26:51 +00:00
}
2003-09-01 09:59:53 +00:00
if ( $length > 150 ) { $wpReason .= " ... " ; } # we've only pasted part of the text
$wpReason .= " ' " ;
2003-05-23 04:26:51 +00:00
}
2003-04-14 23:10:40 +00:00
}
2003-09-01 09:59:53 +00:00
return $this -> confirmDelete ();
}
function confirmDelete ( $par = " " )
{
global $wgOut ;
$sub = htmlspecialchars ( $this -> mTitle -> getPrefixedText () );
$wgOut -> setSubtitle ( wfMsg ( " deletesub " , $sub ) );
2003-04-14 23:10:40 +00:00
$wgOut -> setRobotpolicy ( " noindex,nofollow " );
$wgOut -> addWikiText ( wfMsg ( " confirmdeletetext " ) );
2003-09-01 08:30:14 +00:00
$t = $this -> mTitle -> getPrefixedURL ();
2003-04-14 23:10:40 +00:00
2003-09-01 09:59:53 +00:00
$formaction = wfEscapeHTML ( wfLocalUrl ( $t , " action=delete " . $par ) );
2003-04-14 23:10:40 +00:00
$confirm = wfMsg ( " confirm " );
$check = wfMsg ( " confirmcheck " );
$delcom = wfMsg ( " deletecomment " );
$wgOut -> addHTML ( "
< form id = \ " deleteconfirm \" method= \" post \" action= \" { $formaction } \" >
< table border = 0 >< tr >< td align = right >
{ $delcom } :</ td >< td align = left >
2003-05-23 04:26:51 +00:00
< input type = text size = 60 name = \ " wpReason \" value= \" { $wpReason } \" >
2003-04-14 23:10:40 +00:00
</ td ></ tr >< tr >< td >& nbsp ; </ td ></ tr >
< tr >< td align = right >
2003-08-21 10:11:53 +00:00
< input type = checkbox name = \ " wpConfirm \" value='1' id= \" wpConfirm \" >
</ td >< td >< label for = \ " wpConfirm \" > { $check } </label></td>
2003-04-14 23:10:40 +00:00
</ tr >< tr >< td >& nbsp ; </ td >< td >
< input type = submit name = \ " wpConfirmB \" value= \" { $confirm } \" >
</ td ></ tr ></ table ></ form > \n " );
$wgOut -> returnToMain ( false );
}
function doDelete ()
{
2003-09-01 08:30:14 +00:00
global $wgOut , $wgUser , $wgLang ;
2003-09-01 09:59:53 +00:00
global $wpReason ;
2003-04-14 23:10:40 +00:00
$fname = " Article::doDelete " ;
2003-09-01 09:59:53 +00:00
$this -> doDeleteArticle ( $this -> mTitle );
$deleted = $this -> mTitle -> getPrefixedText ();
2003-04-14 23:10:40 +00:00
$wgOut -> setPagetitle ( wfMsg ( " actioncomplete " ) );
$wgOut -> setRobotpolicy ( " noindex,nofollow " );
$sk = $wgUser -> getSkin ();
$loglink = $sk -> makeKnownLink ( $wgLang -> getNsText (
Namespace :: getWikipedia () ) .
" : " . wfMsg ( " dellogpage " ), wfMsg ( " deletionlog " ) );
$text = str_replace ( " $ 1 " , $deleted , wfMsg ( " deletedtext " ) );
$text = str_replace ( " $ 2 " , $loglink , $text );
$wgOut -> addHTML ( " <p> " . $text );
$wgOut -> returnToMain ( false );
}
function doDeleteArticle ( $title )
{
2003-09-01 08:30:14 +00:00
global $wgUser , $wgOut , $wgLang , $wpReason , $wgDeferredUpdateList ;
2003-04-14 23:10:40 +00:00
$fname = " Article::doDeleteArticle " ;
$ns = $title -> getNamespace ();
$t = wfStrencode ( $title -> getDBkey () );
$id = $title -> getArticleID ();
if ( " " == $t ) {
$wgOut -> fatalError ( wfMsg ( " cannotdelete " ) );
return ;
}
$u = new SiteStatsUpdate ( 0 , 1 , - $this -> isCountable ( $this -> getContent ( true ) ) );
array_push ( $wgDeferredUpdateList , $u );
# Move article and history to the "archive" table
$sql = " INSERT INTO archive (ar_namespace,ar_title,ar_text, " .
" ar_comment,ar_user,ar_user_text,ar_timestamp,ar_minor_edit, " .
" ar_flags) SELECT cur_namespace,cur_title,cur_text,cur_comment, " .
" cur_user,cur_user_text,cur_timestamp,cur_minor_edit,0 FROM cur " .
" WHERE cur_namespace= { $ns } AND cur_title=' { $t } ' " ;
2003-09-20 02:30:00 +00:00
wfQuery ( $sql , DB_WRITE , $fname );
2003-04-14 23:10:40 +00:00
$sql = " INSERT INTO archive (ar_namespace,ar_title,ar_text, " .
" ar_comment,ar_user,ar_user_text,ar_timestamp,ar_minor_edit, " .
" ar_flags) SELECT old_namespace,old_title,old_text,old_comment, " .
" old_user,old_user_text,old_timestamp,old_minor_edit,old_flags " .
" FROM old WHERE old_namespace= { $ns } AND old_title=' { $t } ' " ;
2003-09-20 02:30:00 +00:00
wfQuery ( $sql , DB_WRITE , $fname );
2003-04-14 23:10:40 +00:00
# Now that it's safely backed up, delete it
$sql = " DELETE FROM cur WHERE cur_namespace= { $ns } AND " .
" cur_title=' { $t } ' " ;
2003-09-20 02:30:00 +00:00
wfQuery ( $sql , DB_WRITE , $fname );
2003-04-14 23:10:40 +00:00
$sql = " DELETE FROM old WHERE old_namespace= { $ns } AND " .
" old_title=' { $t } ' " ;
2003-09-20 02:30:00 +00:00
wfQuery ( $sql , DB_WRITE , $fname );
2003-04-14 23:10:40 +00:00
$sql = " DELETE FROM recentchanges WHERE rc_namespace= { $ns } AND " .
" rc_title=' { $t } ' " ;
2003-11-09 23:28:06 +00:00
wfQuery ( $sql , DB_WRITE , $fname );
2003-04-14 23:10:40 +00:00
# Finally, clean up the link tables
if ( 0 != $id ) {
2003-11-08 15:12:34 +00:00
2003-04-14 23:10:40 +00:00
$t = wfStrencode ( $title -> getPrefixedDBkey () );
2003-11-09 23:28:06 +00:00
if ( $wgEnablePersistentLC ) {
// Purge related entries in links cache on delete,
wfQuery ( " DELETE linkscc FROM linkscc,links " .
" WHERE lcc_title=links.l_from AND l_to= { $id } " , DB_WRITE );
wfQuery ( " DELETE FROM linkscc WHERE lcc_title=' { $t } ' " , DB_WRITE );
}
2003-04-14 23:10:40 +00:00
$sql = " SELECT l_from FROM links WHERE l_to= { $id } " ;
2003-09-20 13:24:31 +00:00
$res = wfQuery ( $sql , DB_READ , $fname );
2003-04-14 23:10:40 +00:00
$sql = " INSERT INTO brokenlinks (bl_from,bl_to) VALUES " ;
2003-11-09 23:28:06 +00:00
$now = wfTimestampNow ();
2003-04-14 23:10:40 +00:00
$sql2 = " UPDATE cur SET cur_touched=' { $now } ' WHERE cur_id IN ( " ;
$first = true ;
while ( $s = wfFetchObject ( $res ) ) {
$nt = Title :: newFromDBkey ( $s -> l_from );
$lid = $nt -> getArticleID ();
if ( ! $first ) { $sql .= " , " ; $sql2 .= " , " ; }
$first = false ;
$sql .= " ( { $lid } ,' { $t } ') " ;
$sql2 .= " { $lid } " ;
}
$sql2 .= " ) " ;
if ( ! $first ) {
2003-09-20 02:30:00 +00:00
wfQuery ( $sql , DB_WRITE , $fname );
wfQuery ( $sql2 , DB_WRITE , $fname );
2003-04-14 23:10:40 +00:00
}
wfFreeResult ( $res );
$sql = " DELETE FROM links WHERE l_to= { $id } " ;
2003-09-20 02:30:00 +00:00
wfQuery ( $sql , DB_WRITE , $fname );
2003-04-14 23:10:40 +00:00
$sql = " DELETE FROM links WHERE l_from=' { $t } ' " ;
2003-09-20 02:30:00 +00:00
wfQuery ( $sql , DB_WRITE , $fname );
2003-04-14 23:10:40 +00:00
$sql = " DELETE FROM imagelinks WHERE il_from=' { $t } ' " ;
2003-09-20 02:30:00 +00:00
wfQuery ( $sql , DB_WRITE , $fname );
2003-04-14 23:10:40 +00:00
$sql = " DELETE FROM brokenlinks WHERE bl_from= { $id } " ;
2003-09-20 02:30:00 +00:00
wfQuery ( $sql , DB_WRITE , $fname );
2003-04-14 23:10:40 +00:00
}
$log = new LogPage ( wfMsg ( " dellogpage " ), wfMsg ( " dellogpagetext " ) );
$art = $title -> getPrefixedText ();
$wpReason = wfCleanQueryVar ( $wpReason );
$log -> addEntry ( str_replace ( " $ 1 " , $art , wfMsg ( " deletedarticle " ) ), $wpReason );
# Clear the cached article id so the interface doesn't act like we exist
2003-09-01 08:30:14 +00:00
$this -> mTitle -> resetArticleID ( 0 );
$this -> mTitle -> mArticleID = 0 ;
2003-04-14 23:10:40 +00:00
}
function rollback ()
{
2003-09-01 08:30:14 +00:00
global $wgUser , $wgLang , $wgOut , $from ;
2003-04-14 23:10:40 +00:00
if ( ! $wgUser -> isSysop () ) {
$wgOut -> sysopRequired ();
return ;
}
2003-05-25 07:09:23 +00:00
2003-04-14 23:10:40 +00:00
# Replace all this user's current edits with the next one down
2003-09-01 08:30:14 +00:00
$tt = wfStrencode ( $this -> mTitle -> getDBKey () );
$n = $this -> mTitle -> getNamespace ();
2003-04-14 23:10:40 +00:00
# Get the last editor
2003-05-25 07:09:23 +00:00
$sql = " SELECT cur_id,cur_user,cur_user_text,cur_comment FROM cur WHERE cur_title=' { $tt } ' AND cur_namespace= { $n } " ;
2003-09-20 02:30:00 +00:00
$res = wfQuery ( $sql , DB_READ );
2003-04-14 23:10:40 +00:00
if ( ( $x = wfNumRows ( $res )) != 1 ) {
# Something wrong
$wgOut -> addHTML ( wfMsg ( " notanarticle " ) );
return ;
}
$s = wfFetchObject ( $res );
$ut = wfStrencode ( $s -> cur_user_text );
$uid = $s -> cur_user ;
$pid = $s -> cur_id ;
2003-05-25 07:09:23 +00:00
$from = str_replace ( '_' , ' ' , wfCleanQueryVar ( $from ) );
if ( $from != $s -> cur_user_text ) {
2003-05-25 07:56:08 +00:00
$wgOut -> setPageTitle ( wfmsg ( " rollbackfailed " ));
$wgOut -> addWikiText ( wfMsg ( " alreadyrolled " ,
2003-09-01 08:30:14 +00:00
htmlspecialchars ( $this -> mTitle -> getPrefixedText ()),
2003-05-25 07:09:23 +00:00
htmlspecialchars ( $from ),
2003-05-25 07:56:08 +00:00
htmlspecialchars ( $s -> cur_user_text ) ) );
if ( $s -> cur_comment != " " ) {
$wgOut -> addHTML (
wfMsg ( " editcomment " ,
htmlspecialchars ( $s -> cur_comment ) ) );
}
2003-05-25 07:09:23 +00:00
return ;
}
2003-04-14 23:10:40 +00:00
# Get the last edit not by this guy
$sql = " SELECT old_text,old_user,old_user_text
FROM old USE INDEX ( name_title_timestamp )
WHERE old_namespace = { $n } AND old_title = '{$tt}'
AND ( old_user <> { $uid } OR old_user_text <> '{$ut}' )
ORDER BY inverse_timestamp LIMIT 1 " ;
2003-09-20 02:30:00 +00:00
$res = wfQuery ( $sql , DB_READ );
2003-04-14 23:10:40 +00:00
if ( wfNumRows ( $res ) != 1 ) {
# Something wrong
2003-05-25 07:56:08 +00:00
$wgOut -> setPageTitle ( wfMsg ( " rollbackfailed " ));
2003-04-14 23:10:40 +00:00
$wgOut -> addHTML ( wfMsg ( " cantrollback " ) );
return ;
}
$s = wfFetchObject ( $res );
# Save it!
$newcomment = str_replace ( " $ 1 " , $s -> old_user_text , wfMsg ( " revertpage " ) );
$wgOut -> setPagetitle ( wfMsg ( " actioncomplete " ) );
$wgOut -> setRobotpolicy ( " noindex,nofollow " );
$wgOut -> addHTML ( " <h2> " . $newcomment . " </h2> \n <hr> \n " );
2003-09-01 08:30:14 +00:00
$this -> updateArticle ( $s -> old_text , $newcomment , 1 , $this -> mTitle -> userIsWatching () );
2003-04-14 23:10:40 +00:00
$wgOut -> returnToMain ( false );
}
# Do standard deferred updates after page view
/* private */ function viewUpdates ()
{
2003-09-01 08:30:14 +00:00
global $wgDeferredUpdateList ;
2003-11-09 11:45:12 +00:00
2003-04-14 23:10:40 +00:00
if ( 0 != $this -> getID () ) {
2003-11-09 11:45:12 +00:00
global $wgDisableCounters ;
if ( ! $wgDisableCounters ) {
$u = new ViewCountUpdate ( $this -> getID () );
array_push ( $wgDeferredUpdateList , $u );
$u = new SiteStatsUpdate ( 1 , 0 , 0 );
array_push ( $wgDeferredUpdateList , $u );
}
2003-09-01 08:30:14 +00:00
$u = new UserTalkUpdate ( 0 , $this -> mTitle -> getNamespace (),
$this -> mTitle -> getDBkey () );
2003-04-14 23:10:40 +00:00
array_push ( $wgDeferredUpdateList , $u );
}
}
# Do standard deferred updates after page edit.
# Every 1000th edit, prune the recent changes table.
/* private */ function editUpdates ( $text )
{
2003-09-21 13:10:10 +00:00
global $wgDeferredUpdateList , $wgDBname , $wgMemc ;
2003-04-14 23:10:40 +00:00
wfSeedRandom ();
if ( 0 == mt_rand ( 0 , 999 ) ) {
$cutoff = wfUnix2Timestamp ( time () - ( 7 * 86400 ) );
$sql = " DELETE FROM recentchanges WHERE rc_timestamp < ' { $cutoff } ' " ;
2003-09-20 02:30:00 +00:00
wfQuery ( $sql , DB_WRITE );
2003-04-14 23:10:40 +00:00
}
$id = $this -> getID ();
2003-09-01 08:30:14 +00:00
$title = $this -> mTitle -> getPrefixedDBkey ();
2003-04-14 23:10:40 +00:00
$adj = $this -> mCountAdjustment ;
if ( 0 != $id ) {
$u = new LinksUpdate ( $id , $title );
array_push ( $wgDeferredUpdateList , $u );
$u = new SiteStatsUpdate ( 0 , 1 , $adj );
array_push ( $wgDeferredUpdateList , $u );
$u = new SearchUpdate ( $id , $title , $text );
array_push ( $wgDeferredUpdateList , $u );
2003-09-01 08:30:14 +00:00
$u = new UserTalkUpdate ( 1 , $this -> mTitle -> getNamespace (),
$this -> mTitle -> getDBkey () );
2003-04-14 23:10:40 +00:00
array_push ( $wgDeferredUpdateList , $u );
2003-09-21 13:10:10 +00:00
if ( $this -> getNamespace == NS_MEDIAWIKI ) {
2003-11-02 13:57:24 +00:00
$messageCache = $wgMemc -> get ( " $wgDBname :messages " );
if ( ! $messageCache ) {
$messageCache = wfLoadAllMessages ();
}
$messageCache [ $title ] = $text ;
$wgMemc -> set ( " $wgDBname :messages " );
2003-09-21 13:10:10 +00:00
}
2003-04-14 23:10:40 +00:00
}
}
/* private */ function setOldSubtitle ()
{
global $wgLang , $wgOut ;
$td = $wgLang -> timeanddate ( $this -> mTimestamp , true );
$r = str_replace ( " $ 1 " , " { $td } " , wfMsg ( " revisionasof " ) );
$wgOut -> setSubtitle ( " ( { $r } ) " );
}
2003-11-09 11:45:12 +00:00
function blockedIPpage ()
{
global $wgOut , $wgUser , $wgLang ;
$wgOut -> setPageTitle ( wfMsg ( " blockedtitle " ) );
$wgOut -> setRobotpolicy ( " noindex,nofollow " );
$wgOut -> setArticleFlag ( false );
$id = $wgUser -> blockedBy ();
$reason = $wgUser -> blockedFor ();
$name = User :: whoIs ( $id );
$link = " [[ " . $wgLang -> getNsText ( Namespace :: getUser () ) .
" : { $name } | { $name } ]] " ;
$text = str_replace ( " $ 1 " , $link , wfMsg ( " blockedtext " ) );
$text = str_replace ( " $ 2 " , $reason , $text );
$text = str_replace ( " $ 3 " , getenv ( " REMOTE_ADDR " ), $text );
$wgOut -> addWikiText ( $text );
$wgOut -> returnToMain ( false );
}
2003-04-14 23:10:40 +00:00
# This function is called right before saving the wikitext,
# so we can do things like signatures and links-in-context.
function preSaveTransform ( $text )
{
$s = " " ;
while ( " " != $text ) {
$p = preg_split ( " /< \\ s*nowiki \\ s*>/i " , $text , 2 );
$s .= $this -> pstPass2 ( $p [ 0 ] );
if ( ( count ( $p ) < 2 ) || ( " " == $p [ 1 ] ) ) { $text = " " ; }
else {
$q = preg_split ( " /< \\ / \\ s*nowiki \\ s*>/i " , $p [ 1 ], 2 );
$s .= " <nowiki> { $q [ 0 ] } </nowiki> " ;
$text = $q [ 1 ];
}
}
return rtrim ( $s );
}
/* private */ function pstPass2 ( $text )
{
2003-09-01 08:30:14 +00:00
global $wgUser , $wgLang , $wgLocaltimezone ;
2003-04-14 23:10:40 +00:00
# Signatures
#
$n = $wgUser -> getName ();
$k = $wgUser -> getOption ( " nickname " );
if ( " " == $k ) { $k = $n ; }
if ( isset ( $wgLocaltimezone )) {
$oldtz = getenv ( " TZ " ); putenv ( " TZ= $wgLocaltimezone " );
}
2003-06-30 01:33:16 +00:00
/* Note: this is an ugly timezone hack for the European wikis */
$d = $wgLang -> timeanddate ( date ( " YmdHis " ), false ) .
2003-04-14 23:10:40 +00:00
" ( " . date ( " T " ) . " ) " ;
if ( isset ( $wgLocaltimezone )) putenv ( " TZ= $oldtz " );
$text = preg_replace ( " /~~~~/ " , " [[ " . $wgLang -> getNsText (
Namespace :: getUser () ) . " : $n | $k ]] $d " , $text );
$text = preg_replace ( " /~~~/ " , " [[ " . $wgLang -> getNsText (
Namespace :: getUser () ) . " : $n | $k ]] " , $text );
# Context links: [[|name]] and [[name (context)|]]
#
$tc = " [&;% \\ -,. \\ ( \\ )' _0-9A-Za-z \\ /: \\ x80- \\ xff] " ;
$np = " [&;% \\ -,.' _0-9A-Za-z \\ /: \\ x80- \\ xff] " ; # No parens
2003-11-12 13:07:08 +00:00
$namespacechar = '[ _0-9A-Za-z\x80-\xff]' ; # Namespaces can use non-ascii!
2003-04-14 23:10:40 +00:00
$conpat = " /^( { $np } +) \\ (( { $tc } +) \\ ) $ / " ;
$p1 = " / \ [ \ [( { $np } +) \\ (( { $np } +) \\ ) \\ |]]/ " ; # [[page (context)|]]
$p2 = " / \ [ \ [ \\ |( { $tc } +)]]/ " ; # [[|page]]
2003-11-12 13:07:08 +00:00
$p3 = " / \ [ \ [( $namespacechar +):( { $np } +) \\ |]]/ " ; # [[namespace:page|]]
$p4 = " / \ [ \ [( $namespacechar +):( { $np } +) \\ (( { $np } +) \\ ) \\ |]]/ " ;
2003-04-14 23:10:40 +00:00
# [[ns:page (cont)|]]
$context = " " ;
2003-09-01 08:30:14 +00:00
$t = $this -> mTitle -> getText ();
2003-04-14 23:10:40 +00:00
if ( preg_match ( $conpat , $t , $m ) ) {
$context = $m [ 2 ];
}
$text = preg_replace ( $p4 , " [[ \\ 1: \\ 2 ( \\ 3)| \\ 2]] " , $text );
$text = preg_replace ( $p1 , " [[ \\ 1 ( \\ 2)| \\ 1]] " , $text );
$text = preg_replace ( $p3 , " [[ \\ 1: \\ 2| \\ 2]] " , $text );
if ( " " == $context ) {
$text = preg_replace ( $p2 , " [[ \\ 1]] " , $text );
} else {
$text = preg_replace ( $p2 , " [[ \\ 1 ( { $context } )| \\ 1]] " , $text );
}
2003-09-21 13:10:10 +00:00
# {{SUBST:xxx}} variables
#
$mw =& MagicWord :: get ( MAG_SUBST );
2003-11-02 13:57:24 +00:00
$text = $mw -> substituteCallback ( $text , " wfReplaceSubstVar " );
2003-04-14 23:10:40 +00:00
return $text ;
}
2003-05-16 13:39:22 +00:00
/* Caching functions */
2003-08-02 10:13:27 +00:00
function tryFileCache () {
2003-05-16 13:39:22 +00:00
if ( $this -> isFileCacheable ()) {
2003-09-05 21:12:24 +00:00
$touched = $this -> mTouched ;
if ( strpos ( $this -> mContent , " { { " ) !== false ) {
# Expire pages with variable replacements in an hour
$expire = wfUnix2Timestamp ( time () - 3600 );
$touched = max ( $expire , $touched );
}
2003-09-01 08:30:14 +00:00
$cache = new CacheManager ( $this -> mTitle );
2003-09-05 21:12:24 +00:00
if ( $cache -> isFileCacheGood ( $touched )) {
2003-11-09 11:45:12 +00:00
global $wgOut ;
2003-08-02 10:13:27 +00:00
wfDebug ( " tryFileCache() - about to load \n " );
$cache -> loadFromFileCache ();
2003-11-09 11:45:12 +00:00
$wgOut -> reportTime (); # For profiling
2003-05-16 13:39:22 +00:00
exit ;
} else {
2003-08-02 10:13:27 +00:00
wfDebug ( " tryFileCache() - starting buffer \n " );
2003-08-08 03:08:06 +00:00
if ( $cache -> useGzip () && wfClientAcceptsGzip ()) {
2003-08-02 12:41:30 +00:00
/* For some reason , adding this header line over in
CacheManager :: saveToFileCache () fails on my test
setup at home , though it works on the live install .
Make double - sure ... -- brion */
header ( " Content-Encoding: gzip " );
}
2003-08-02 10:13:27 +00:00
ob_start ( array ( & $cache , 'saveToFileCache' ) );
2003-05-16 13:39:22 +00:00
}
} else {
wfDebug ( " tryFileCache() - not cacheable \n " );
}
}
function isFileCacheable () {
2003-09-01 08:30:14 +00:00
global $wgUser , $wgUseFileCache , $wgShowIPinHeader ;
2003-05-16 13:39:22 +00:00
global $action , $oldid , $diff , $redirect , $printable ;
return $wgUseFileCache
and ( ! $wgShowIPinHeader )
2003-09-01 19:40:52 +00:00
and ( $this -> getID () != 0 )
2003-05-16 13:39:22 +00:00
and ( $wgUser -> getId () == 0 )
and ( ! $wgUser -> getNewtalk ())
2003-09-01 08:30:14 +00:00
and ( $this -> mTitle -> getNamespace != Namespace :: getSpecial ())
2003-05-16 13:39:22 +00:00
and ( $action == " view " )
and ( ! isset ( $oldid ))
and ( ! isset ( $diff ))
and ( ! isset ( $redirect ))
and ( ! isset ( $printable ))
and ( ! $this -> mRedirectedFrom );
}
2003-11-09 11:45:12 +00:00
function checkTouched () {
$id = $this -> getID ();
$sql = " SELECT cur_touched,cur_is_redirect FROM cur WHERE cur_id= $id " ;
$res = wfQuery ( $sql , DB_READ , " Article::checkTouched " );
if ( $s = wfFetchObject ( $res ) ) {
$this -> mTouched = $s -> cur_touched ;
return ! $s -> cur_is_redirect ;
} else {
return false ;
}
}
2003-04-14 23:10:40 +00:00
}
2003-11-02 13:57:24 +00:00
function wfReplaceSubstVar ( $matches ) {
return wfMsg ( $matches [ 1 ] );
}
2003-04-14 23:10:40 +00:00
?>