2004-02-18 02:15:00 +00:00
|
|
|
<?php
|
2004-09-02 23:28:24 +00:00
|
|
|
/**
|
|
|
|
|
* Contain the EditPage class
|
2004-09-03 23:00:01 +00:00
|
|
|
* @package MediaWiki
|
2004-09-02 23:28:24 +00:00
|
|
|
*/
|
2003-08-02 20:43:11 +00:00
|
|
|
|
2004-09-02 23:28:24 +00:00
|
|
|
/**
|
|
|
|
|
* Splitting edit page/HTML interface from Article...
|
|
|
|
|
* The actual database and text munging is still in Article,
|
|
|
|
|
* but it should get easier to call those from alternate
|
|
|
|
|
* interfaces.
|
2004-09-03 23:00:01 +00:00
|
|
|
*
|
|
|
|
|
* @package MediaWiki
|
2004-09-02 23:28:24 +00:00
|
|
|
*/
|
2004-10-10 21:30:17 +00:00
|
|
|
|
2003-08-02 20:43:11 +00:00
|
|
|
class EditPage {
|
|
|
|
|
var $mArticle;
|
|
|
|
|
var $mTitle;
|
2004-12-29 13:46:10 +00:00
|
|
|
var $mMetaData = '';
|
2003-08-02 20:43:11 +00:00
|
|
|
|
2004-03-08 09:09:35 +00:00
|
|
|
# Form values
|
2005-03-19 12:01:57 +00:00
|
|
|
var $save = false, $preview = false, $diff = false;
|
2004-03-08 09:09:35 +00:00
|
|
|
var $minoredit = false, $watchthis = false;
|
2004-08-22 17:24:50 +00:00
|
|
|
var $textbox1 = '', $textbox2 = '', $summary = '';
|
|
|
|
|
var $edittime = '', $section = '';
|
2004-03-08 09:09:35 +00:00
|
|
|
var $oldid = 0;
|
|
|
|
|
|
2004-09-03 16:51:45 +00:00
|
|
|
/**
|
|
|
|
|
* @todo document
|
|
|
|
|
* @param $article
|
|
|
|
|
*/
|
2003-08-02 20:43:11 +00:00
|
|
|
function EditPage( $article ) {
|
|
|
|
|
$this->mArticle =& $article;
|
|
|
|
|
global $wgTitle;
|
|
|
|
|
$this->mTitle =& $wgTitle;
|
|
|
|
|
}
|
|
|
|
|
|
2004-12-29 13:46:10 +00:00
|
|
|
/**
|
|
|
|
|
* This is the function that extracts metadata from the article body on the first view.
|
|
|
|
|
* To turn the feature on, set $wgUseMetadataEdit = true ; in LocalSettings
|
2004-12-29 14:39:43 +00:00
|
|
|
* and set $wgMetadataWhitelist to the *full* title of the template whitelist
|
2004-12-29 13:46:10 +00:00
|
|
|
*/
|
2005-06-26 23:15:39 +00:00
|
|
|
function extractMetaDataFromArticle () {
|
2004-12-29 14:39:43 +00:00
|
|
|
global $wgUseMetadataEdit , $wgMetadataWhitelist , $wgLang ;
|
2005-03-30 09:26:48 +00:00
|
|
|
$this->mMetaData = '' ;
|
2004-12-29 13:46:10 +00:00
|
|
|
if ( !$wgUseMetadataEdit ) return ;
|
2005-06-26 23:15:39 +00:00
|
|
|
if ( $wgMetadataWhitelist == '' ) return ;
|
2005-03-30 09:26:48 +00:00
|
|
|
$s = '' ;
|
2004-12-29 13:46:10 +00:00
|
|
|
$t = $this->mArticle->getContent ( true ) ;
|
|
|
|
|
|
|
|
|
|
# MISSING : <nowiki> filtering
|
|
|
|
|
|
|
|
|
|
# Categories and language links
|
|
|
|
|
$t = explode ( "\n" , $t ) ;
|
|
|
|
|
$catlow = strtolower ( $wgLang->getNsText ( NS_CATEGORY ) ) ;
|
|
|
|
|
$cat = $ll = array() ;
|
|
|
|
|
foreach ( $t AS $key => $x )
|
|
|
|
|
{
|
|
|
|
|
$y = trim ( strtolower ( $x ) ) ;
|
2005-06-26 23:15:39 +00:00
|
|
|
while ( substr ( $y , 0 , 2 ) == '[[' )
|
2004-12-29 13:46:10 +00:00
|
|
|
{
|
2005-06-26 23:15:39 +00:00
|
|
|
$y = explode ( ']]' , trim ( $x ) ) ;
|
2004-12-29 13:46:10 +00:00
|
|
|
$first = array_shift ( $y ) ;
|
2005-06-26 23:15:39 +00:00
|
|
|
$first = explode ( ':' , $first ) ;
|
2004-12-29 13:46:10 +00:00
|
|
|
$ns = array_shift ( $first ) ;
|
2005-03-30 09:26:48 +00:00
|
|
|
$ns = trim ( str_replace ( '[' , '' , $ns ) ) ;
|
2004-12-29 13:46:10 +00:00
|
|
|
if ( strlen ( $ns ) == 2 OR strtolower ( $ns ) == $catlow )
|
|
|
|
|
{
|
2005-03-30 09:26:48 +00:00
|
|
|
$add = '[[' . $ns . ':' . implode ( ':' , $first ) . ']]' ;
|
2004-12-29 13:46:10 +00:00
|
|
|
if ( strtolower ( $ns ) == $catlow ) $cat[] = $add ;
|
|
|
|
|
else $ll[] = $add ;
|
2005-03-30 09:26:48 +00:00
|
|
|
$x = implode ( ']]' , $y ) ;
|
2004-12-29 13:46:10 +00:00
|
|
|
$t[$key] = $x ;
|
|
|
|
|
$y = trim ( strtolower ( $x ) ) ;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2005-03-30 09:26:48 +00:00
|
|
|
if ( count ( $cat ) ) $s .= implode ( ' ' , $cat ) . "\n" ;
|
|
|
|
|
if ( count ( $ll ) ) $s .= implode ( ' ' , $ll ) . "\n" ;
|
2004-12-29 13:46:10 +00:00
|
|
|
$t = implode ( "\n" , $t ) ;
|
|
|
|
|
|
2004-12-29 14:39:43 +00:00
|
|
|
# Load whitelist
|
|
|
|
|
$sat = array () ; # stand-alone-templates; must be lowercase
|
|
|
|
|
$wl_title = Title::newFromText ( $wgMetadataWhitelist ) ;
|
|
|
|
|
$wl_article = new Article ( $wl_title ) ;
|
|
|
|
|
$wl = explode ( "\n" , $wl_article->getContent(true) ) ;
|
|
|
|
|
foreach ( $wl AS $x )
|
|
|
|
|
{
|
|
|
|
|
$isentry = false ;
|
|
|
|
|
$x = trim ( $x ) ;
|
2005-03-30 09:26:48 +00:00
|
|
|
while ( substr ( $x , 0 , 1 ) == '*' )
|
2004-12-29 14:39:43 +00:00
|
|
|
{
|
|
|
|
|
$isentry = true ;
|
|
|
|
|
$x = trim ( substr ( $x , 1 ) ) ;
|
|
|
|
|
}
|
|
|
|
|
if ( $isentry )
|
|
|
|
|
{
|
|
|
|
|
$sat[] = strtolower ( $x ) ;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2004-12-29 13:46:10 +00:00
|
|
|
# Templates, but only some
|
2005-03-30 09:26:48 +00:00
|
|
|
$t = explode ( '{{' , $t ) ;
|
2004-12-29 13:46:10 +00:00
|
|
|
$tl = array () ;
|
|
|
|
|
foreach ( $t AS $key => $x )
|
|
|
|
|
{
|
2005-03-30 09:26:48 +00:00
|
|
|
$y = explode ( '}}' , $x , 2 ) ;
|
2004-12-29 13:46:10 +00:00
|
|
|
if ( count ( $y ) == 2 )
|
|
|
|
|
{
|
|
|
|
|
$z = $y[0] ;
|
2005-03-30 09:26:48 +00:00
|
|
|
$z = explode ( '|' , $z ) ;
|
2004-12-29 13:46:10 +00:00
|
|
|
$tn = array_shift ( $z ) ;
|
|
|
|
|
if ( in_array ( strtolower ( $tn ) , $sat ) )
|
|
|
|
|
{
|
2005-03-30 09:26:48 +00:00
|
|
|
$tl[] = '{{' . $y[0] . '}}' ;
|
2004-12-29 13:46:10 +00:00
|
|
|
$t[$key] = $y[1] ;
|
2005-03-30 09:26:48 +00:00
|
|
|
$y = explode ( '}}' , $y[1] , 2 ) ;
|
2004-12-29 13:46:10 +00:00
|
|
|
}
|
2005-03-30 09:26:48 +00:00
|
|
|
else $t[$key] = '{{' . $x ;
|
2004-12-29 13:46:10 +00:00
|
|
|
}
|
2005-03-30 09:26:48 +00:00
|
|
|
else if ( $key != 0 ) $t[$key] = '{{' . $x ;
|
2004-12-29 13:46:10 +00:00
|
|
|
else $t[$key] = $x ;
|
|
|
|
|
}
|
2005-03-30 09:26:48 +00:00
|
|
|
if ( count ( $tl ) ) $s .= implode ( ' ' , $tl ) ;
|
|
|
|
|
$t = implode ( '' , $t ) ;
|
2004-12-29 13:46:10 +00:00
|
|
|
|
|
|
|
|
$t = str_replace ( "\n\n\n" , "\n" , $t ) ;
|
|
|
|
|
$this->mArticle->mContent = $t ;
|
|
|
|
|
$this->mMetaData = $s ;
|
|
|
|
|
}
|
|
|
|
|
|
2004-09-03 16:51:45 +00:00
|
|
|
/**
|
|
|
|
|
* This is the function that gets called for "action=edit".
|
|
|
|
|
*/
|
|
|
|
|
function edit() {
|
2005-06-25 06:24:46 +00:00
|
|
|
global $wgOut, $wgUser, $wgRequest;
|
2004-01-29 22:36:02 +00:00
|
|
|
// this is not an article
|
|
|
|
|
$wgOut->setArticleFlag(false);
|
2003-08-02 20:43:11 +00:00
|
|
|
|
2004-03-08 09:09:35 +00:00
|
|
|
$this->importFormData( $wgRequest );
|
2004-12-19 02:36:04 +00:00
|
|
|
|
|
|
|
|
if( $this->live ) {
|
|
|
|
|
$this->livePreview();
|
|
|
|
|
return;
|
|
|
|
|
}
|
2003-08-02 20:43:11 +00:00
|
|
|
|
|
|
|
|
if ( ! $this->mTitle->userCanEdit() ) {
|
2004-04-30 08:19:59 +00:00
|
|
|
$wgOut->readOnlyPage( $this->mArticle->getContent( true ), true );
|
2003-08-02 20:43:11 +00:00
|
|
|
return;
|
|
|
|
|
}
|
2005-03-19 12:01:57 +00:00
|
|
|
if ( !$this->preview && !$this->diff && $wgUser->isBlocked( !$this->save ) ) {
|
2005-02-17 22:56:51 +00:00
|
|
|
# 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.
|
2003-08-02 20:43:11 +00:00
|
|
|
$this->blockedIPpage();
|
|
|
|
|
return;
|
|
|
|
|
}
|
2005-06-25 06:24:46 +00:00
|
|
|
if ( !$wgUser->isAllowed('edit') ) {
|
|
|
|
|
if ( $wgUser->isAnon() ) {
|
|
|
|
|
$this->userNotLoggedInPage();
|
|
|
|
|
return;
|
|
|
|
|
} else {
|
|
|
|
|
$wgOut->readOnlyPage( $this->mArticle->getContent( true ), true );
|
|
|
|
|
return;
|
|
|
|
|
}
|
2003-08-05 11:04:02 +00:00
|
|
|
}
|
2003-08-02 20:43:11 +00:00
|
|
|
if ( wfReadOnly() ) {
|
2004-03-08 09:09:35 +00:00
|
|
|
if( $this->save || $this->preview ) {
|
2004-08-22 17:24:50 +00:00
|
|
|
$this->editForm( 'preview' );
|
2005-03-19 12:01:57 +00:00
|
|
|
} else if ( $this->diff ) {
|
|
|
|
|
$this->editForm( 'diff' );
|
2003-08-02 20:43:11 +00:00
|
|
|
} else {
|
2004-04-30 08:19:59 +00:00
|
|
|
$wgOut->readOnlyPage( $this->mArticle->getContent( true ) );
|
2003-08-02 20:43:11 +00:00
|
|
|
}
|
|
|
|
|
return;
|
|
|
|
|
}
|
2004-03-08 09:09:35 +00:00
|
|
|
if ( $this->save ) {
|
2004-08-22 17:24:50 +00:00
|
|
|
$this->editForm( 'save' );
|
2004-12-24 05:19:04 +00:00
|
|
|
} else if ( $this->preview ) {
|
2004-08-22 17:24:50 +00:00
|
|
|
$this->editForm( 'preview' );
|
2005-03-19 12:01:57 +00:00
|
|
|
} else if ( $this->diff ) {
|
|
|
|
|
$this->editForm( 'diff' );
|
2003-08-02 20:43:11 +00:00
|
|
|
} else { # First time through
|
2005-06-27 00:06:30 +00:00
|
|
|
if( $wgUser->getOption('previewonfirst')
|
|
|
|
|
or $this->mTitle->getNamespace() == NS_CATEGORY ) {
|
2004-12-24 09:51:36 +00:00
|
|
|
$this->editForm( 'preview', true );
|
2004-12-24 05:19:04 +00:00
|
|
|
} else {
|
2004-12-29 13:46:10 +00:00
|
|
|
$this->extractMetaDataFromArticle () ;
|
2004-12-24 09:51:36 +00:00
|
|
|
$this->editForm( 'initial', true );
|
2004-12-24 05:19:04 +00:00
|
|
|
}
|
2003-08-02 20:43:11 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2004-09-03 16:51:45 +00:00
|
|
|
/**
|
|
|
|
|
* @todo document
|
|
|
|
|
*/
|
2004-03-08 09:09:35 +00:00
|
|
|
function importFormData( &$request ) {
|
2005-02-15 00:24:49 +00:00
|
|
|
if( $request->wasPosted() ) {
|
|
|
|
|
# These fields need to be checked for encoding.
|
|
|
|
|
# Also remove trailing whitespace, but don't remove _initial_
|
|
|
|
|
# whitespace from the text boxes. This may be significant formatting.
|
|
|
|
|
$this->textbox1 = rtrim( $request->getText( 'wpTextbox1' ) );
|
|
|
|
|
$this->textbox2 = rtrim( $request->getText( 'wpTextbox2' ) );
|
|
|
|
|
$this->mMetaData = rtrim( $request->getText( 'metadata' ) );
|
2005-06-01 08:18:34 +00:00
|
|
|
$this->summary = $request->getText( 'wpSummary' );
|
2005-02-15 00:24:49 +00:00
|
|
|
|
|
|
|
|
$this->edittime = $request->getVal( 'wpEdittime' );
|
|
|
|
|
if( is_null( $this->edittime ) ) {
|
|
|
|
|
# If the form is incomplete, force to preview.
|
|
|
|
|
$this->preview = true;
|
|
|
|
|
} else {
|
|
|
|
|
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.
|
|
|
|
|
$this->preview = $request->getCheck( 'wpPreview' );
|
2005-03-19 12:01:57 +00:00
|
|
|
$this->diff = $request->getCheck( 'wpDiff' );
|
2005-02-15 00:24:49 +00:00
|
|
|
} else {
|
|
|
|
|
# Page might be a hack attempt posted from
|
|
|
|
|
# an external site. Preview instead of saving.
|
|
|
|
|
$this->preview = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
2005-03-19 12:01:57 +00:00
|
|
|
$this->save = ! ( $this->preview OR $this->diff );
|
2005-02-15 00:24:49 +00:00
|
|
|
if( !preg_match( '/^\d{14}$/', $this->edittime )) {
|
|
|
|
|
$this->edittime = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$this->minoredit = $request->getCheck( 'wpMinoredit' );
|
|
|
|
|
$this->watchthis = $request->getCheck( 'wpWatchthis' );
|
|
|
|
|
} else {
|
|
|
|
|
# Not a posted form? Start with nothing.
|
|
|
|
|
$this->textbox1 = '';
|
|
|
|
|
$this->textbox2 = '';
|
|
|
|
|
$this->mMetaData = '';
|
|
|
|
|
$this->summary = '';
|
|
|
|
|
$this->edittime = '';
|
|
|
|
|
$this->preview = false;
|
|
|
|
|
$this->save = false;
|
2005-03-19 12:01:57 +00:00
|
|
|
$this->diff = false;
|
2005-02-15 00:24:49 +00:00
|
|
|
$this->minoredit = false;
|
|
|
|
|
$this->watchthis = false;
|
|
|
|
|
}
|
2004-03-18 06:56:14 +00:00
|
|
|
|
2004-03-08 09:09:35 +00:00
|
|
|
$this->oldid = $request->getInt( 'oldid' );
|
2004-03-18 06:56:14 +00:00
|
|
|
|
2004-03-08 09:09:35 +00:00
|
|
|
# Section edit can come from either the form or a link
|
|
|
|
|
$this->section = $request->getVal( 'wpSection', $request->getVal( 'section' ) );
|
2004-12-19 02:36:04 +00:00
|
|
|
|
|
|
|
|
$this->live = $request->getCheck( 'live' );
|
2004-03-08 09:09:35 +00:00
|
|
|
}
|
2004-03-18 06:56:14 +00:00
|
|
|
|
2005-02-04 06:19:37 +00:00
|
|
|
/**
|
2005-02-15 00:24:49 +00:00
|
|
|
* Make sure the form isn't faking a user's credentials.
|
|
|
|
|
*
|
|
|
|
|
* @param WebRequest $request
|
|
|
|
|
* @return bool
|
|
|
|
|
* @access private
|
2005-02-04 06:19:37 +00:00
|
|
|
*/
|
2005-02-15 00:24:49 +00:00
|
|
|
function tokenOk( &$request ) {
|
|
|
|
|
global $wgUser;
|
2005-02-21 12:46:37 +00:00
|
|
|
if( $wgUser->isAnon() ) {
|
2005-02-15 00:24:49 +00:00
|
|
|
# Anonymous users may not have a session
|
|
|
|
|
# open. Don't tokenize.
|
|
|
|
|
return true;
|
|
|
|
|
} else {
|
|
|
|
|
return $wgUser->matchEditToken( $request->getVal( 'wpEditToken' ) );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2004-09-03 16:51:45 +00:00
|
|
|
function submit() {
|
2003-08-02 20:43:11 +00:00
|
|
|
$this->edit();
|
|
|
|
|
}
|
|
|
|
|
|
2004-09-03 16:51:45 +00:00
|
|
|
/**
|
|
|
|
|
* 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.
|
|
|
|
|
*
|
2005-03-19 12:01:57 +00:00
|
|
|
* @param string $formtype Type of form either : save, initial, diff or preview
|
2004-12-24 09:51:36 +00:00
|
|
|
* @param bool $firsttime True to load form data from db
|
2004-09-03 16:51:45 +00:00
|
|
|
*/
|
2004-12-24 09:51:36 +00:00
|
|
|
function editForm( $formtype, $firsttime = false ) {
|
2003-08-02 20:43:11 +00:00
|
|
|
global $wgOut, $wgUser;
|
2004-09-24 13:14:52 +00:00
|
|
|
global $wgLang, $wgContLang, $wgParser, $wgTitle;
|
2004-05-10 13:15:28 +00:00
|
|
|
global $wgAllowAnonymousMinor;
|
2004-06-21 07:41:53 +00:00
|
|
|
global $wgSpamRegex, $wgFilterCallback;
|
2003-08-02 20:43:11 +00:00
|
|
|
|
|
|
|
|
$sk = $wgUser->getSkin();
|
|
|
|
|
$isConflict = false;
|
2004-05-10 13:15:28 +00:00
|
|
|
// css / js subpages of user pages get a special treatment
|
2005-02-21 12:23:52 +00:00
|
|
|
$isCssJsSubpage = $wgTitle->isCssJsSubpage();
|
|
|
|
|
|
2003-08-02 20:43:11 +00:00
|
|
|
|
|
|
|
|
if(!$this->mTitle->getArticleID()) { # new article
|
2004-08-22 17:24:50 +00:00
|
|
|
$wgOut->addWikiText(wfmsg('newarticletext'));
|
2004-03-05 21:44:38 +00:00
|
|
|
}
|
2003-08-02 20:43:11 +00:00
|
|
|
|
2005-02-21 12:23:52 +00:00
|
|
|
if( $this->mTitle->isTalkPage() ) {
|
2004-08-22 17:24:50 +00:00
|
|
|
$wgOut->addWikiText(wfmsg('talkpagetext'));
|
2003-08-02 20:43:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# 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.
|
|
|
|
|
|
2004-08-22 17:24:50 +00:00
|
|
|
if ( 'save' == $formtype ) {
|
2004-12-29 13:46:10 +00:00
|
|
|
# Reintegrate metadata
|
2005-03-30 09:26:48 +00:00
|
|
|
if ( $this->mMetaData != '' ) $this->textbox1 .= "\n" . $this->mMetaData ;
|
|
|
|
|
$this->mMetaData = '' ;
|
2004-12-29 13:46:10 +00:00
|
|
|
|
2004-05-04 12:49:41 +00:00
|
|
|
# Check for spam
|
2004-08-13 20:52:15 +00:00
|
|
|
if ( $wgSpamRegex && preg_match( $wgSpamRegex, $this->textbox1, $matches ) ) {
|
2004-12-11 11:32:53 +00:00
|
|
|
$this->spamPage ( $matches[0] );
|
2004-06-21 07:41:53 +00:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if ( $wgFilterCallback && $wgFilterCallback( $this->mTitle, $this->textbox1, $this->section ) ) {
|
|
|
|
|
# Error messages or other handling should be performed by the filter function
|
|
|
|
|
return;
|
2004-05-04 12:49:41 +00:00
|
|
|
}
|
2005-02-17 22:56:51 +00:00
|
|
|
if ( $wgUser->isBlocked( false ) ) {
|
|
|
|
|
# Check block state against master, thus 'false'.
|
2003-08-02 20:43:11 +00:00
|
|
|
$this->blockedIPpage();
|
|
|
|
|
return;
|
|
|
|
|
}
|
2005-06-25 06:24:46 +00:00
|
|
|
|
|
|
|
|
if ( !$wgUser->isAllowed('edit') ) {
|
|
|
|
|
if ( $wgUser->isAnon() ) {
|
2003-08-05 11:04:02 +00:00
|
|
|
$this->userNotLoggedInPage();
|
|
|
|
|
return;
|
|
|
|
|
}
|
2005-06-25 06:24:46 +00:00
|
|
|
else {
|
|
|
|
|
$wgOut->readOnlyPage();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2003-08-02 20:43:11 +00:00
|
|
|
if ( wfReadOnly() ) {
|
|
|
|
|
$wgOut->readOnlyPage();
|
|
|
|
|
return;
|
|
|
|
|
}
|
2005-05-27 11:03:37 +00:00
|
|
|
if ( $wgUser->pingLimiter() ) {
|
|
|
|
|
$wgOut->rateLimited();
|
|
|
|
|
return;
|
|
|
|
|
}
|
New edit toolbar for bold, italic, links, headlines, math, images, media,
sigs, horizontal lines (more can be added easily). Select text and click
to apply, or just click to see an example. Mouseover should show speedtips.
Also, access keys for the edit window (ALT+P=Preview, ALT+S=Save) -> Moz+IE
2004-01-11 04:11:43 +00:00
|
|
|
|
2004-03-22 04:38:47 +00:00
|
|
|
# If article is new, insert it.
|
2004-08-20 14:59:49 +00:00
|
|
|
$aid = $this->mTitle->getArticleID( GAID_FOR_UPDATE );
|
2003-08-02 20:43:11 +00:00
|
|
|
if ( 0 == $aid ) {
|
2004-03-08 09:09:35 +00:00
|
|
|
# Don't save a new article if it's blank.
|
2004-08-22 17:24:50 +00:00
|
|
|
if ( ( '' == $this->textbox1 ) ||
|
|
|
|
|
( wfMsg( 'newarticletext' ) == $this->textbox1 ) ) {
|
2004-03-07 07:26:56 +00:00
|
|
|
$wgOut->redirect( $this->mTitle->getFullURL() );
|
2003-08-02 20:43:11 +00:00
|
|
|
return;
|
|
|
|
|
}
|
Changed the calling protocol for function wfRunHooks() in Hooks.php.
Previously, this function used variable arguments to allow
different hooks to pass different parameters. However, var args
silently convert reference-calling to value-calling. So a call
that used to work like this:
# old
wfRunHooks('SomeEvent', $param1, &$param2, $param3);
...now works like this:
# new
wfRunHooks('SomeEvent', array($param1, &$param2, $param3));
Hook functions can now change pass-by-reference parameters correctly
(e.g. $param2 in the above example).
All calls to wfRunHooks() were changed and tested, and the change
was documented in docs/hooks.doc. This change was originally checked
in on REL1_4 branch as a bugfix, but per vibber reverted and checked
in to HEAD instead.
2005-03-13 15:29:43 +00:00
|
|
|
if (wfRunHooks('ArticleSave', array(&$this->mArticle, &$wgUser, &$this->textbox1,
|
|
|
|
|
&$this->summary, &$this->minoredit, &$this->watchthis, NULL)))
|
2004-11-28 06:45:24 +00:00
|
|
|
{
|
|
|
|
|
$this->mArticle->insertNewArticle( $this->textbox1, $this->summary,
|
|
|
|
|
$this->minoredit, $this->watchthis );
|
Changed the calling protocol for function wfRunHooks() in Hooks.php.
Previously, this function used variable arguments to allow
different hooks to pass different parameters. However, var args
silently convert reference-calling to value-calling. So a call
that used to work like this:
# old
wfRunHooks('SomeEvent', $param1, &$param2, $param3);
...now works like this:
# new
wfRunHooks('SomeEvent', array($param1, &$param2, $param3));
Hook functions can now change pass-by-reference parameters correctly
(e.g. $param2 in the above example).
All calls to wfRunHooks() were changed and tested, and the change
was documented in docs/hooks.doc. This change was originally checked
in on REL1_4 branch as a bugfix, but per vibber reverted and checked
in to HEAD instead.
2005-03-13 15:29:43 +00:00
|
|
|
wfRunHooks('ArticleSaveComplete', array(&$this->mArticle, &$wgUser, $this->textbox1,
|
|
|
|
|
$this->summary, $this->minoredit,
|
|
|
|
|
$this->watchthis, NULL));
|
2004-11-28 06:45:24 +00:00
|
|
|
}
|
2003-08-02 20:43:11 +00:00
|
|
|
return;
|
|
|
|
|
}
|
2004-03-18 15:02:56 +00:00
|
|
|
|
2003-08-02 20:43:11 +00:00
|
|
|
# Article exists. Check for edit conflict.
|
|
|
|
|
|
|
|
|
|
$this->mArticle->clear(); # Force reload of dates, etc.
|
2004-08-20 14:59:49 +00:00
|
|
|
$this->mArticle->forUpdate( true ); # Lock the article
|
2004-03-14 22:28:52 +00:00
|
|
|
|
2004-08-22 17:24:50 +00:00
|
|
|
if( ( $this->section != 'new' ) &&
|
2004-03-14 22:28:52 +00:00
|
|
|
($this->mArticle->getTimestamp() != $this->edittime ) ) {
|
New edit toolbar for bold, italic, links, headlines, math, images, media,
sigs, horizontal lines (more can be added easily). Select text and click
to apply, or just click to see an example. Mouseover should show speedtips.
Also, access keys for the edit window (ALT+P=Preview, ALT+S=Save) -> Moz+IE
2004-01-11 04:11:43 +00:00
|
|
|
$isConflict = true;
|
2003-08-02 20:43:11 +00:00
|
|
|
}
|
2004-03-08 09:09:35 +00:00
|
|
|
$userid = $wgUser->getID();
|
2003-08-02 20:43:11 +00:00
|
|
|
|
2004-09-19 20:58:10 +00:00
|
|
|
if ( $isConflict) {
|
2005-06-28 23:19:56 +00:00
|
|
|
wfDebug( "EditPage::editForm conflict! getting section '$this->section' for time '$this->edittime' (article time '" .
|
|
|
|
|
$this->mArticle->getTimestamp() . "'\n" );
|
2004-09-19 20:58:10 +00:00
|
|
|
$text = $this->mArticle->getTextOfLastEditWithSectionReplacedOrAdded(
|
|
|
|
|
$this->section, $this->textbox1, $this->summary, $this->edittime);
|
|
|
|
|
}
|
|
|
|
|
else {
|
2005-04-26 09:52:11 +00:00
|
|
|
wfDebug( "EditPage::editForm getting section '$this->section'\n" );
|
2004-09-19 20:58:10 +00:00
|
|
|
$text = $this->mArticle->getTextOfLastEditWithSectionReplacedOrAdded(
|
|
|
|
|
$this->section, $this->textbox1, $this->summary);
|
|
|
|
|
}
|
2004-02-26 13:37:26 +00:00
|
|
|
# Suppress edit conflict with self
|
2003-08-02 20:43:11 +00:00
|
|
|
|
2004-03-08 09:09:35 +00:00
|
|
|
if ( ( 0 != $userid ) && ( $this->mArticle->getUser() == $userid ) ) {
|
2005-06-28 23:19:56 +00:00
|
|
|
wfDebug( "Suppressing edit conflict, same user.\n" );
|
2003-08-02 20:43:11 +00:00
|
|
|
$isConflict = false;
|
|
|
|
|
} else {
|
|
|
|
|
# switch from section editing to normal editing in edit conflict
|
|
|
|
|
if($isConflict) {
|
2004-05-10 13:15:28 +00:00
|
|
|
# Attempt merge
|
2004-03-14 22:28:52 +00:00
|
|
|
if( $this->mergeChangesInto( $text ) ){
|
2004-03-14 15:05:52 +00:00
|
|
|
// Successful merge! Maybe we should tell the user the good news?
|
|
|
|
|
$isConflict = false;
|
2005-06-28 23:19:56 +00:00
|
|
|
wfDebug( "Suppressing edit conflict, successful merge.\n" );
|
2004-03-14 15:05:52 +00:00
|
|
|
} else {
|
2004-08-22 17:24:50 +00:00
|
|
|
$this->section = '';
|
2004-03-14 22:28:52 +00:00
|
|
|
$this->textbox1 = $text;
|
2005-06-28 23:19:56 +00:00
|
|
|
wfDebug( "Keeping edit conflict, failed merge.\n" );
|
2004-03-14 15:05:52 +00:00
|
|
|
}
|
2003-08-02 20:43:11 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if ( ! $isConflict ) {
|
2004-05-14 13:03:57 +00:00
|
|
|
# All's well
|
|
|
|
|
$sectionanchor = '';
|
2004-10-26 05:44:54 +00:00
|
|
|
if( $this->section == 'new' ) {
|
|
|
|
|
if( $this->summary != '' ) {
|
|
|
|
|
$sectionanchor = $this->sectionAnchor( $this->summary );
|
|
|
|
|
}
|
|
|
|
|
} elseif( $this->section != '' ) {
|
2004-05-14 13:03:57 +00:00
|
|
|
# Try to get a section anchor from the section source, redirect to edited section if header found
|
|
|
|
|
# XXX: might be better to integrate this into Article::getTextOfLastEditWithSectionReplacedOrAdded
|
|
|
|
|
# for duplicate heading checking and maybe parsing
|
|
|
|
|
$hasmatch = preg_match( "/^ *([=]{1,6})(.*?)(\\1) *\\n/i", $this->textbox1, $matches );
|
|
|
|
|
# we can't deal with anchors, includes, html etc in the header for now,
|
|
|
|
|
# headline would need to be parsed to improve this
|
2004-06-01 19:51:22 +00:00
|
|
|
#if($hasmatch and strlen($matches[2]) > 0 and !preg_match( "/[\\['{<>]/", $matches[2])) {
|
|
|
|
|
if($hasmatch and strlen($matches[2]) > 0) {
|
2004-10-26 05:44:54 +00:00
|
|
|
$sectionanchor = $this->sectionAnchor( $matches[2] );
|
2004-05-14 13:03:57 +00:00
|
|
|
}
|
|
|
|
|
}
|
2004-11-28 06:45:24 +00:00
|
|
|
|
Changed the calling protocol for function wfRunHooks() in Hooks.php.
Previously, this function used variable arguments to allow
different hooks to pass different parameters. However, var args
silently convert reference-calling to value-calling. So a call
that used to work like this:
# old
wfRunHooks('SomeEvent', $param1, &$param2, $param3);
...now works like this:
# new
wfRunHooks('SomeEvent', array($param1, &$param2, $param3));
Hook functions can now change pass-by-reference parameters correctly
(e.g. $param2 in the above example).
All calls to wfRunHooks() were changed and tested, and the change
was documented in docs/hooks.doc. This change was originally checked
in on REL1_4 branch as a bugfix, but per vibber reverted and checked
in to HEAD instead.
2005-03-13 15:29:43 +00:00
|
|
|
if (wfRunHooks('ArticleSave', array(&$this->mArticle, &$wgUser, &$text,
|
|
|
|
|
&$this->summary, &$this->minoredit,
|
|
|
|
|
&$this->watchthis, &$sectionanchor)))
|
2004-11-28 06:45:24 +00:00
|
|
|
{
|
|
|
|
|
# update the article here
|
|
|
|
|
if($this->mArticle->updateArticle( $text, $this->summary, $this->minoredit,
|
|
|
|
|
$this->watchthis, '', $sectionanchor ))
|
|
|
|
|
{
|
Changed the calling protocol for function wfRunHooks() in Hooks.php.
Previously, this function used variable arguments to allow
different hooks to pass different parameters. However, var args
silently convert reference-calling to value-calling. So a call
that used to work like this:
# old
wfRunHooks('SomeEvent', $param1, &$param2, $param3);
...now works like this:
# new
wfRunHooks('SomeEvent', array($param1, &$param2, $param3));
Hook functions can now change pass-by-reference parameters correctly
(e.g. $param2 in the above example).
All calls to wfRunHooks() were changed and tested, and the change
was documented in docs/hooks.doc. This change was originally checked
in on REL1_4 branch as a bugfix, but per vibber reverted and checked
in to HEAD instead.
2005-03-13 15:29:43 +00:00
|
|
|
wfRunHooks('ArticleSaveComplete', array(&$this->mArticle, &$wgUser, $text,
|
|
|
|
|
$this->summary, $this->minoredit,
|
|
|
|
|
$this->watchthis, $sectionanchor));
|
2004-11-28 06:45:24 +00:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
$isConflict = true;
|
|
|
|
|
}
|
2004-05-13 14:17:44 +00:00
|
|
|
}
|
2003-08-02 20:43:11 +00:00
|
|
|
}
|
|
|
|
|
# First time through: get contents, set time for conflict
|
|
|
|
|
# checking, etc.
|
|
|
|
|
|
2004-12-24 09:51:36 +00:00
|
|
|
if ( 'initial' == $formtype || $firsttime ) {
|
|
|
|
|
$this->edittime = $this->mArticle->getTimestamp();
|
|
|
|
|
$this->textbox1 = $this->mArticle->getContent( true );
|
|
|
|
|
$this->summary = '';
|
|
|
|
|
$this->proxyCheck();
|
2003-08-02 20:43:11 +00:00
|
|
|
}
|
2004-08-22 17:24:50 +00:00
|
|
|
$wgOut->setRobotpolicy( 'noindex,nofollow' );
|
2004-03-18 06:56:14 +00:00
|
|
|
|
2004-01-17 09:49:43 +00:00
|
|
|
# Enabled article-related sidebar, toplinks, etc.
|
|
|
|
|
$wgOut->setArticleRelated( true );
|
2003-08-02 20:43:11 +00:00
|
|
|
|
|
|
|
|
if ( $isConflict ) {
|
2004-08-22 17:24:50 +00:00
|
|
|
$s = wfMsg( 'editconflict', $this->mTitle->getPrefixedText() );
|
2003-08-02 20:43:11 +00:00
|
|
|
$wgOut->setPageTitle( $s );
|
2005-05-04 02:05:21 +00:00
|
|
|
$wgOut->addWikiText( wfMsg( 'explainconflict' ) );
|
2003-08-02 20:43:11 +00:00
|
|
|
|
2004-03-08 09:09:35 +00:00
|
|
|
$this->textbox2 = $this->textbox1;
|
2004-04-30 08:19:59 +00:00
|
|
|
$this->textbox1 = $this->mArticle->getContent( true );
|
2004-03-08 09:09:35 +00:00
|
|
|
$this->edittime = $this->mArticle->getTimestamp();
|
2003-08-02 20:43:11 +00:00
|
|
|
} else {
|
|
|
|
|
|
2004-08-22 17:24:50 +00:00
|
|
|
if( $this->section != '' ) {
|
|
|
|
|
if( $this->section == 'new' ) {
|
2004-11-19 12:50:21 +00:00
|
|
|
$s = wfMsg('editingcomment', $this->mTitle->getPrefixedText() );
|
2003-08-02 20:43:11 +00:00
|
|
|
} else {
|
2004-11-19 12:50:21 +00:00
|
|
|
$s = wfMsg('editingsection', $this->mTitle->getPrefixedText() );
|
2003-08-02 20:43:11 +00:00
|
|
|
}
|
2005-06-29 08:37:46 +00:00
|
|
|
if( !$this->preview && !$this->diff ) {
|
2004-12-05 23:16:35 +00:00
|
|
|
preg_match( "/^(=+)(.+)\\1/mi",
|
|
|
|
|
$this->textbox1,
|
|
|
|
|
$matches );
|
|
|
|
|
if( !empty( $matches[2] ) ) {
|
|
|
|
|
$this->summary = "/* ". trim($matches[2])." */ ";
|
2004-04-09 09:29:47 +00:00
|
|
|
}
|
2004-03-20 01:18:19 +00:00
|
|
|
}
|
2004-11-06 09:21:28 +00:00
|
|
|
} else {
|
|
|
|
|
$s = wfMsg( 'editing', $this->mTitle->getPrefixedText() );
|
2003-08-02 20:43:11 +00:00
|
|
|
}
|
|
|
|
|
$wgOut->setPageTitle( $s );
|
2005-03-26 22:23:48 +00:00
|
|
|
if ( !$this->checkUnicodeCompliantBrowser() ) {
|
2004-10-10 21:30:17 +00:00
|
|
|
$this->mArticle->setOldSubtitle();
|
|
|
|
|
$wgOut->addWikiText( wfMsg( 'nonunicodebrowser') );
|
|
|
|
|
}
|
2005-06-29 05:30:20 +00:00
|
|
|
if ( isset( $this->mArticle )
|
2005-06-29 05:30:50 +00:00
|
|
|
&& isset( $this->mArticle->mRevision )
|
2005-06-29 05:30:20 +00:00
|
|
|
&& !$this->mArticle->mRevision->isCurrent() ) {
|
2003-08-02 20:43:11 +00:00
|
|
|
$this->mArticle->setOldSubtitle();
|
2005-05-04 02:05:21 +00:00
|
|
|
$wgOut->addWikiText( wfMsg( 'editingold' ) );
|
2003-08-02 20:43:11 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if( wfReadOnly() ) {
|
2005-05-04 02:05:21 +00:00
|
|
|
$wgOut->addWikiText( wfMsg( 'readonlywarning' ) );
|
2004-08-22 17:24:50 +00:00
|
|
|
} else if ( $isCssJsSubpage and 'preview' != $formtype) {
|
2005-05-04 02:05:21 +00:00
|
|
|
$wgOut->addWikiText( wfMsg( 'usercssjsyoucanpreview' ));
|
2003-08-02 20:43:11 +00:00
|
|
|
}
|
2004-11-24 12:55:48 +00:00
|
|
|
if( $this->mTitle->isProtected('edit') ) {
|
2005-05-04 02:05:21 +00:00
|
|
|
$wgOut->addWikiText( wfMsg( 'protectedpagewarning' ) );
|
2003-08-02 20:43:11 +00:00
|
|
|
}
|
|
|
|
|
|
2004-03-08 09:09:35 +00:00
|
|
|
$kblength = (int)(strlen( $this->textbox1 ) / 1024);
|
2003-08-02 20:43:11 +00:00
|
|
|
if( $kblength > 29 ) {
|
2005-05-04 02:05:21 +00:00
|
|
|
$wgOut->addWikiText( wfMsg( 'longpagewarning', $wgLang->formatNum( $kblength ) ) );
|
2003-08-02 20:43:11 +00:00
|
|
|
}
|
New edit toolbar for bold, italic, links, headlines, math, images, media,
sigs, horizontal lines (more can be added easily). Select text and click
to apply, or just click to see an example. Mouseover should show speedtips.
Also, access keys for the edit window (ALT+P=Preview, ALT+S=Save) -> Moz+IE
2004-01-11 04:11:43 +00:00
|
|
|
|
2004-08-22 17:24:50 +00:00
|
|
|
$rows = $wgUser->getOption( 'rows' );
|
|
|
|
|
$cols = $wgUser->getOption( 'cols' );
|
2003-08-02 20:43:11 +00:00
|
|
|
|
2004-08-22 17:24:50 +00:00
|
|
|
$ew = $wgUser->getOption( 'editwidth' );
|
2003-08-02 20:43:11 +00:00
|
|
|
if ( $ew ) $ew = " style=\"width:100%\"";
|
2004-08-22 17:24:50 +00:00
|
|
|
else $ew = '';
|
2003-08-02 20:43:11 +00:00
|
|
|
|
2004-08-22 17:24:50 +00:00
|
|
|
$q = 'action=submit';
|
2004-03-08 09:09:35 +00:00
|
|
|
#if ( "no" == $redirect ) { $q .= "&redirect=no"; }
|
2004-03-07 07:26:56 +00:00
|
|
|
$action = $this->mTitle->escapeLocalURL( $q );
|
2003-08-02 20:43:11 +00:00
|
|
|
|
2004-08-22 17:24:50 +00:00
|
|
|
$summary = wfMsg('summary');
|
|
|
|
|
$subject = wfMsg('subject');
|
|
|
|
|
$minor = wfMsg('minoredit');
|
|
|
|
|
$watchthis = wfMsg ('watchthis');
|
|
|
|
|
$save = wfMsg('savearticle');
|
|
|
|
|
$prev = wfMsg('showpreview');
|
2005-03-19 12:01:57 +00:00
|
|
|
$diff = wfMsg('showdiff');
|
2003-08-02 20:43:11 +00:00
|
|
|
|
2004-05-29 19:52:47 +00:00
|
|
|
$cancel = $sk->makeKnownLink( $this->mTitle->getPrefixedText(),
|
2004-08-22 17:24:50 +00:00
|
|
|
wfMsg('cancel') );
|
2005-06-25 21:32:11 +00:00
|
|
|
$edithelpurl = $sk->makeInternalOrExternalUrl( wfMsg( 'edithelppage' ));
|
2004-06-09 06:59:05 +00:00
|
|
|
$edithelp = '<a target="helpwindow" href="'.$edithelpurl.'">'.
|
|
|
|
|
htmlspecialchars( wfMsg( 'edithelp' ) ).'</a> '.
|
|
|
|
|
htmlspecialchars( wfMsg( 'newwindow' ) );
|
2004-08-18 00:04:06 +00:00
|
|
|
|
|
|
|
|
global $wgRightsText;
|
|
|
|
|
$copywarn = "<div id=\"editpage-copywarn\">\n" .
|
2004-08-22 17:24:50 +00:00
|
|
|
wfMsg( $wgRightsText ? 'copyrightwarning' : 'copyrightwarning2',
|
2005-03-18 14:13:58 +00:00
|
|
|
'[[' . wfMsgForContent( 'copyrightpage' ) . ']]',
|
2004-08-18 00:04:06 +00:00
|
|
|
$wgRightsText ) . "\n</div>";
|
2003-08-02 20:43:11 +00:00
|
|
|
|
2004-08-22 17:24:50 +00:00
|
|
|
if( $wgUser->getOption('showtoolbar') and !$isCssJsSubpage ) {
|
2004-08-19 11:43:48 +00:00
|
|
|
# prepare toolbar for edit buttons
|
2004-11-25 13:52:56 +00:00
|
|
|
$toolbar = $this->getEditToolbar();
|
2004-04-11 23:21:44 +00:00
|
|
|
} else {
|
2004-08-22 17:24:50 +00:00
|
|
|
$toolbar = '';
|
New edit toolbar for bold, italic, links, headlines, math, images, media,
sigs, horizontal lines (more can be added easily). Select text and click
to apply, or just click to see an example. Mouseover should show speedtips.
Also, access keys for the edit window (ALT+P=Preview, ALT+S=Save) -> Moz+IE
2004-01-11 04:11:43 +00:00
|
|
|
}
|
|
|
|
|
|
2003-08-02 20:43:11 +00:00
|
|
|
// activate checkboxes if user wants them to be always active
|
2005-03-19 12:01:57 +00:00
|
|
|
if( !$this->preview && !$this->diff ) {
|
2004-08-22 17:24:50 +00:00
|
|
|
if( $wgUser->getOption( 'watchdefault' ) ) $this->watchthis = true;
|
|
|
|
|
if( $wgUser->getOption( 'minordefault' ) ) $this->minoredit = true;
|
2004-03-18 06:56:14 +00:00
|
|
|
|
2004-03-08 09:09:35 +00:00
|
|
|
// activate checkbox also if user is already watching the page,
|
|
|
|
|
// require wpWatchthis to be unset so that second condition is not
|
|
|
|
|
// checked unnecessarily
|
|
|
|
|
if( !$this->watchthis && $this->mTitle->userIsWatching() ) $this->watchthis = true;
|
|
|
|
|
}
|
2004-03-18 06:56:14 +00:00
|
|
|
|
2004-08-22 17:24:50 +00:00
|
|
|
$minoredithtml = '';
|
New edit toolbar for bold, italic, links, headlines, math, images, media,
sigs, horizontal lines (more can be added easily). Select text and click
to apply, or just click to see an example. Mouseover should show speedtips.
Also, access keys for the edit window (ALT+P=Preview, ALT+S=Save) -> Moz+IE
2004-01-11 04:11:43 +00:00
|
|
|
|
2005-02-21 12:46:37 +00:00
|
|
|
if ( $wgUser->isLoggedIn() || $wgAllowAnonymousMinor ) {
|
2004-01-28 22:57:07 +00:00
|
|
|
$minoredithtml =
|
2004-08-19 11:26:44 +00:00
|
|
|
"<input tabindex='3' type='checkbox' value='1' name='wpMinoredit'".($this->minoredit?" checked='checked'":"").
|
|
|
|
|
" accesskey='".wfMsg('accesskey-minoredit')."' id='wpMinoredit' />".
|
|
|
|
|
"<label for='wpMinoredit' title='".wfMsg('tooltip-minoredit')."'>{$minor}</label>";
|
2003-08-02 20:43:11 +00:00
|
|
|
}
|
2004-03-18 06:56:14 +00:00
|
|
|
|
2004-08-22 17:24:50 +00:00
|
|
|
$watchhtml = '';
|
2004-03-18 06:56:14 +00:00
|
|
|
|
2005-02-21 12:46:37 +00:00
|
|
|
if ( $wgUser->isLoggedIn() ) {
|
2004-04-09 18:16:29 +00:00
|
|
|
$watchhtml = "<input tabindex='4' type='checkbox' name='wpWatchthis'".($this->watchthis?" checked='checked'":"").
|
2004-08-19 11:26:44 +00:00
|
|
|
" accesskey='".wfMsg('accesskey-watch')."' id='wpWatchthis' />".
|
|
|
|
|
"<label for='wpWatchthis' title='".wfMsg('tooltip-watch')."'>{$watchthis}</label>";
|
2004-01-28 22:57:07 +00:00
|
|
|
}
|
2004-03-18 06:56:14 +00:00
|
|
|
|
2004-08-22 17:24:50 +00:00
|
|
|
$checkboxhtml = $minoredithtml . $watchhtml . '<br />';
|
2003-08-02 20:43:11 +00:00
|
|
|
|
2004-12-19 02:36:04 +00:00
|
|
|
$wgOut->addHTML( '<div id="wikiPreview">' );
|
2004-08-22 17:24:50 +00:00
|
|
|
if ( 'preview' == $formtype) {
|
2005-05-15 20:42:11 +00:00
|
|
|
$previewOutput = $this->getPreviewText( $isConflict, $isCssJsSubpage );
|
2005-03-19 12:01:57 +00:00
|
|
|
if ( $wgUser->getOption('previewontop' ) ) {
|
2004-12-19 02:36:04 +00:00
|
|
|
$wgOut->addHTML( $previewOutput );
|
2005-06-27 00:06:30 +00:00
|
|
|
if($this->mTitle->getNamespace() == NS_CATEGORY) {
|
|
|
|
|
$this->mArticle->closeShowCategory();
|
|
|
|
|
}
|
2004-05-10 13:15:28 +00:00
|
|
|
$wgOut->addHTML( "<br style=\"clear:both;\" />\n" );
|
2003-08-02 20:43:11 +00:00
|
|
|
}
|
|
|
|
|
}
|
2004-12-19 02:36:04 +00:00
|
|
|
$wgOut->addHTML( '</div>' );
|
2005-03-19 12:01:57 +00:00
|
|
|
if ( 'diff' == $formtype ) {
|
|
|
|
|
if ( $wgUser->getOption('previewontop' ) ) {
|
2005-05-15 11:11:23 +00:00
|
|
|
$wgOut->addHTML( $this->getDiff() );
|
2005-03-19 12:01:57 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2003-08-02 20:43:11 +00:00
|
|
|
|
2004-08-19 11:43:48 +00:00
|
|
|
# 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
|
2004-09-24 13:14:52 +00:00
|
|
|
$summarytext = htmlspecialchars( $wgContLang->recodeForEdit( $this->summary ) ); # FIXME
|
2004-08-22 17:24:50 +00:00
|
|
|
if( $this->section == 'new' ) {
|
2004-08-19 11:26:44 +00:00
|
|
|
$commentsubject="{$subject}: <input tabindex='1' type='text' value=\"$summarytext\" name=\"wpSummary\" maxlength='200' size='60' /><br />";
|
2004-08-22 17:24:50 +00:00
|
|
|
$editsummary = '';
|
2004-08-19 11:26:44 +00:00
|
|
|
} else {
|
2004-08-22 17:24:50 +00:00
|
|
|
$commentsubject = '';
|
2005-05-12 08:28:26 +00:00
|
|
|
$editsummary="{$summary}: <input tabindex='2' type='text' value=\"$summarytext\" name=\"wpSummary\" maxlength='200' size='60' /><br />";
|
2004-08-19 11:26:44 +00:00
|
|
|
}
|
2003-08-02 20:43:11 +00:00
|
|
|
|
2005-03-19 12:01:57 +00:00
|
|
|
if( !$this->preview && !$this->diff ) {
|
2004-08-19 11:26:44 +00:00
|
|
|
# Don't select the edit box on preview; this interferes with seeing what's going on.
|
2004-08-22 17:24:50 +00:00
|
|
|
$wgOut->setOnloadHandler( 'document.editform.wpTextbox1.focus()' );
|
2003-12-11 05:52:15 +00:00
|
|
|
}
|
2004-08-19 11:26:44 +00:00
|
|
|
# Prepare a list of templates used by this page
|
2005-02-15 00:24:49 +00:00
|
|
|
$templates = '';
|
2005-04-03 07:01:29 +00:00
|
|
|
$articleTemplates = $this->mArticle->getUsedTemplates();
|
|
|
|
|
if ( count( $articleTemplates ) > 0 ) {
|
|
|
|
|
$templates = '<br />'. wfMsg( 'templatesused' ) . '<ul>';
|
|
|
|
|
foreach ( $articleTemplates as $tpl ) {
|
|
|
|
|
if ( $titleObj = Title::makeTitle( NS_TEMPLATE, $tpl ) ) {
|
|
|
|
|
$templates .= '<li>' . $sk->makeLinkObj( $titleObj ) . '</li>';
|
2004-08-19 11:26:44 +00:00
|
|
|
}
|
|
|
|
|
}
|
2005-04-03 07:01:29 +00:00
|
|
|
$templates .= '</ul>';
|
2004-08-19 11:26:44 +00:00
|
|
|
}
|
2004-12-19 02:36:04 +00:00
|
|
|
|
|
|
|
|
global $wgLivePreview, $wgStylePath;
|
|
|
|
|
/**
|
|
|
|
|
* Live Preview lets us fetch rendered preview page content and
|
|
|
|
|
* add it to the page without refreshing the whole page.
|
|
|
|
|
* Set up the button for it; if not supported by the browser
|
|
|
|
|
* it will fall through to the normal form submission method.
|
|
|
|
|
*/
|
|
|
|
|
if( $wgLivePreview ) {
|
2005-05-05 21:00:49 +00:00
|
|
|
global $wgJsMimeType;
|
|
|
|
|
$wgOut->addHTML( '<script type="'.$wgJsMimeType.'" src="' .
|
2004-12-19 02:36:04 +00:00
|
|
|
htmlspecialchars( $wgStylePath . '/common/preview.js' ) .
|
|
|
|
|
'"></script>' . "\n" );
|
|
|
|
|
$liveAction = $wgTitle->getLocalUrl( 'action=submit&wpPreview=true&live=true' );
|
|
|
|
|
$liveOnclick = 'onclick="return !livePreview('.
|
|
|
|
|
'getElementById(\'wikiPreview\'),' .
|
|
|
|
|
'editform.wpTextbox1.value,' .
|
|
|
|
|
htmlspecialchars( '"' . $liveAction . '"' ) . ')"';
|
|
|
|
|
} else {
|
|
|
|
|
$liveOnclick = '';
|
|
|
|
|
}
|
|
|
|
|
|
2004-12-29 13:46:10 +00:00
|
|
|
global $wgUseMetadataEdit ;
|
|
|
|
|
if ( $wgUseMetadataEdit )
|
|
|
|
|
{
|
|
|
|
|
$metadata = $this->mMetaData ;
|
|
|
|
|
$metadata = htmlspecialchars( $wgContLang->recodeForEdit( $metadata ) ) ;
|
2004-12-29 15:18:12 +00:00
|
|
|
$helppage = Title::newFromText ( wfmsg("metadata_page") ) ;
|
|
|
|
|
$top = str_replace ( "$1" , $helppage->getInternalURL() , wfmsg("metadata") ) ;
|
|
|
|
|
$metadata = $top . "<textarea name='metadata' rows='3' cols='{$cols}'{$ew}>{$metadata}</textarea>" ;
|
2004-12-29 13:46:10 +00:00
|
|
|
}
|
|
|
|
|
else $metadata = "" ;
|
|
|
|
|
|
|
|
|
|
|
2004-12-19 08:00:50 +00:00
|
|
|
$wgOut->addHTML( <<<END
|
New edit toolbar for bold, italic, links, headlines, math, images, media,
sigs, horizontal lines (more can be added easily). Select text and click
to apply, or just click to see an example. Mouseover should show speedtips.
Also, access keys for the edit window (ALT+P=Preview, ALT+S=Save) -> Moz+IE
2004-01-11 04:11:43 +00:00
|
|
|
{$toolbar}
|
2004-12-19 08:00:50 +00:00
|
|
|
<form id="editform" name="editform" method="post" action="$action"
|
|
|
|
|
enctype="multipart/form-data">
|
2003-08-02 20:43:11 +00:00
|
|
|
{$commentsubject}
|
2004-12-19 08:00:50 +00:00
|
|
|
<textarea tabindex='1' accesskey="," name="wpTextbox1" rows='{$rows}'
|
|
|
|
|
cols='{$cols}'{$ew}>
|
|
|
|
|
END
|
|
|
|
|
. htmlspecialchars( $wgContLang->recodeForEdit( $this->textbox1 ) ) .
|
2003-08-02 20:43:11 +00:00
|
|
|
"
|
2004-04-29 12:17:33 +00:00
|
|
|
</textarea>
|
2004-12-29 13:46:10 +00:00
|
|
|
{$metadata}
|
2004-04-03 10:01:08 +00:00
|
|
|
<br />{$editsummary}
|
2003-08-02 20:43:11 +00:00
|
|
|
{$checkboxhtml}
|
2004-06-10 18:42:05 +00:00
|
|
|
<input tabindex='5' id='wpSave' type='submit' value=\"{$save}\" name=\"wpSave\" accesskey=\"".wfMsg('accesskey-save')."\"".
|
2005-05-03 20:27:34 +00:00
|
|
|
" title=\"".wfMsg('tooltip-save')."\"/>
|
2004-12-19 02:36:04 +00:00
|
|
|
<input tabindex='6' id='wpPreview' type='submit' $liveOnclick value=\"{$prev}\" name=\"wpPreview\" accesskey=\"".wfMsg('accesskey-preview')."\"".
|
2004-04-09 19:22:51 +00:00
|
|
|
" title=\"".wfMsg('tooltip-preview')."\"/>
|
2005-05-12 08:28:26 +00:00
|
|
|
<input tabindex='7' id='wpDiff' type='submit' value=\"{$diff}\" name=\"wpDiff\" accesskey=\"".wfMsg('accesskey-diff')."\"".
|
2005-03-19 12:01:57 +00:00
|
|
|
" title=\"".wfMsg('tooltip-diff')."\"/>
|
2004-08-19 11:26:44 +00:00
|
|
|
<em>{$cancel}</em> | <em>{$edithelp}</em>{$templates}" );
|
2004-08-18 00:04:06 +00:00
|
|
|
$wgOut->addWikiText( $copywarn );
|
|
|
|
|
$wgOut->addHTML( "
|
2004-04-03 10:01:08 +00:00
|
|
|
<input type='hidden' value=\"" . htmlspecialchars( $this->section ) . "\" name=\"wpSection\" />
|
|
|
|
|
<input type='hidden' value=\"{$this->edittime}\" name=\"wpEdittime\" />\n" );
|
2003-08-02 20:43:11 +00:00
|
|
|
|
2005-02-21 12:46:37 +00:00
|
|
|
if ( $wgUser->isLoggedIn() ) {
|
2005-02-15 00:24:49 +00:00
|
|
|
/**
|
|
|
|
|
* 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.
|
|
|
|
|
*/
|
2005-04-28 23:06:47 +00:00
|
|
|
$token = htmlspecialchars( $wgUser->editToken() );
|
2005-02-15 00:24:49 +00:00
|
|
|
$wgOut->addHTML( "
|
|
|
|
|
<input type='hidden' value=\"$token\" name=\"wpEditToken\" />\n" );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2003-08-02 20:43:11 +00:00
|
|
|
if ( $isConflict ) {
|
2004-08-21 09:32:34 +00:00
|
|
|
require_once( "DifferenceEngine.php" );
|
2005-05-14 17:55:04 +00:00
|
|
|
$wgOut->addWikiText( '==' . wfMsg( "yourdiff" ) . '==' );
|
2004-03-14 13:42:16 +00:00
|
|
|
DifferenceEngine::showDiff( $this->textbox2, $this->textbox1,
|
2003-08-02 20:43:11 +00:00
|
|
|
wfMsg( "yourtext" ), wfMsg( "storedversion" ) );
|
|
|
|
|
|
2005-05-14 17:55:04 +00:00
|
|
|
$wgOut->addWikiText( '==' . wfMsg( "yourtext" ) . '==' );
|
2005-05-04 02:05:21 +00:00
|
|
|
$wgOut->addHTML( "<textarea tabindex=6 id='wpTextbox2' name=\"wpTextbox2\" rows='{$rows}' cols='{$cols}' wrap='virtual'>"
|
2004-09-24 13:14:52 +00:00
|
|
|
. htmlspecialchars( $wgContLang->recodeForEdit( $this->textbox2 ) ) .
|
2003-08-02 20:43:11 +00:00
|
|
|
"
|
2004-04-29 12:17:33 +00:00
|
|
|
</textarea>" );
|
2003-08-02 20:43:11 +00:00
|
|
|
}
|
|
|
|
|
$wgOut->addHTML( "</form>\n" );
|
2005-03-19 12:01:57 +00:00
|
|
|
if ( $formtype == 'preview' && !$wgUser->getOption( 'previewontop' ) ) {
|
|
|
|
|
$wgOut->addHTML( '<div id="wikiPreview">' . $previewOutput . '</div>' );
|
|
|
|
|
}
|
|
|
|
|
if ( $formtype == 'diff' && !$wgUser->getOption( 'previewontop' ) ) {
|
2005-05-15 11:11:23 +00:00
|
|
|
#$wgOut->addHTML( '<div id="wikiPreview">' . $difftext . '</div>' );
|
|
|
|
|
$wgOut->addHTML( $this->getDiff() );
|
2003-08-02 20:43:11 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2005-03-19 12:01:57 +00:00
|
|
|
/**
|
|
|
|
|
* @todo document
|
|
|
|
|
*/
|
2004-12-19 02:36:04 +00:00
|
|
|
function getPreviewText( $isConflict, $isCssJsSubpage ) {
|
2005-03-19 12:01:57 +00:00
|
|
|
global $wgOut, $wgUser, $wgTitle, $wgParser, $wgAllowDiffPreview, $wgEnableDiffPreviewPreference;
|
2005-02-25 09:13:03 +00:00
|
|
|
$previewhead = '<h2>' . htmlspecialchars( wfMsg( 'preview' ) ) . "</h2>\n" .
|
|
|
|
|
"<p class='previewnote'>" . htmlspecialchars( wfMsg( 'previewnote' ) ) . "</p>\n";
|
2004-12-19 02:36:04 +00:00
|
|
|
if ( $isConflict ) {
|
2005-02-25 09:13:03 +00:00
|
|
|
$previewhead.='<h2>' . htmlspecialchars( wfMsg( 'previewconflict' ) ) .
|
2004-12-19 02:36:04 +00:00
|
|
|
"</h2>\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$parserOptions = ParserOptions::newFromUser( $wgUser );
|
|
|
|
|
$parserOptions->setEditSection( false );
|
|
|
|
|
|
|
|
|
|
# don't parse user css/js, show message about preview
|
|
|
|
|
# XXX: stupid php bug won't let us use $wgTitle->isCssJsSubpage() here
|
|
|
|
|
|
|
|
|
|
if ( $isCssJsSubpage ) {
|
|
|
|
|
if(preg_match("/\\.css$/", $wgTitle->getText() ) ) {
|
|
|
|
|
$previewtext = wfMsg('usercsspreview');
|
|
|
|
|
} else if(preg_match("/\\.js$/", $wgTitle->getText() ) ) {
|
|
|
|
|
$previewtext = wfMsg('userjspreview');
|
|
|
|
|
}
|
|
|
|
|
$parserOutput = $wgParser->parse( $previewtext , $wgTitle, $parserOptions );
|
|
|
|
|
$wgOut->addHTML( $parserOutput->mText );
|
2005-02-15 00:24:49 +00:00
|
|
|
return $previewhead;
|
2004-12-19 02:36:04 +00:00
|
|
|
} else {
|
|
|
|
|
# if user want to see preview when he edit an article
|
|
|
|
|
if( $wgUser->getOption('previewonfirst') and ($this->textbox1 == '')) {
|
|
|
|
|
$this->textbox1 = $this->mArticle->getContent(true);
|
|
|
|
|
}
|
|
|
|
|
|
2004-12-29 13:46:10 +00:00
|
|
|
$toparse = $this->textbox1 ;
|
|
|
|
|
if ( $this->mMetaData != "" ) $toparse .= "\n" . $this->mMetaData ;
|
|
|
|
|
|
|
|
|
|
$parserOutput = $wgParser->parse( $this->mArticle->preSaveTransform( $toparse ) ."\n\n",
|
2004-12-19 02:36:04 +00:00
|
|
|
$wgTitle, $parserOptions );
|
|
|
|
|
|
|
|
|
|
$previewHTML = $parserOutput->mText;
|
2005-06-27 00:06:30 +00:00
|
|
|
|
2004-12-19 02:36:04 +00:00
|
|
|
$wgOut->addCategoryLinks($parserOutput->getCategoryLinks());
|
|
|
|
|
$wgOut->addLanguageLinks($parserOutput->getLanguageLinks());
|
2005-02-15 00:24:49 +00:00
|
|
|
return $previewhead . $previewHTML;
|
2004-12-19 02:36:04 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2004-09-03 16:51:45 +00:00
|
|
|
/**
|
|
|
|
|
* @todo document
|
|
|
|
|
*/
|
|
|
|
|
function blockedIPpage() {
|
2004-09-24 13:14:52 +00:00
|
|
|
global $wgOut, $wgUser, $wgContLang, $wgIP;
|
2003-08-02 20:43:11 +00:00
|
|
|
|
2004-08-22 17:24:50 +00:00
|
|
|
$wgOut->setPageTitle( wfMsg( 'blockedtitle' ) );
|
|
|
|
|
$wgOut->setRobotpolicy( 'noindex,nofollow' );
|
2004-01-17 09:49:43 +00:00
|
|
|
$wgOut->setArticleRelated( false );
|
2003-08-02 20:43:11 +00:00
|
|
|
|
|
|
|
|
$id = $wgUser->blockedBy();
|
|
|
|
|
$reason = $wgUser->blockedFor();
|
2004-08-20 14:59:49 +00:00
|
|
|
$ip = $wgIP;
|
2004-01-30 17:07:50 +00:00
|
|
|
|
2004-07-10 01:09:36 +00:00
|
|
|
if ( is_numeric( $id ) ) {
|
2004-08-20 14:59:49 +00:00
|
|
|
$name = User::whoIs( $id );
|
2004-07-10 01:09:36 +00:00
|
|
|
} else {
|
|
|
|
|
$name = $id;
|
2004-06-21 07:41:53 +00:00
|
|
|
}
|
2005-02-21 12:23:52 +00:00
|
|
|
$link = '[[' . $wgContLang->getNsText( NS_USER ) .
|
2003-08-02 20:43:11 +00:00
|
|
|
":{$name}|{$name}]]";
|
|
|
|
|
|
2004-08-22 17:24:50 +00:00
|
|
|
$wgOut->addWikiText( wfMsg( 'blockedtext', $link, $reason, $ip, $name ) );
|
2003-08-02 20:43:11 +00:00
|
|
|
$wgOut->returnToMain( false );
|
|
|
|
|
}
|
|
|
|
|
|
2004-09-03 16:51:45 +00:00
|
|
|
/**
|
|
|
|
|
* @todo document
|
|
|
|
|
*/
|
|
|
|
|
function userNotLoggedInPage() {
|
2005-02-21 12:46:37 +00:00
|
|
|
global $wgOut;
|
2003-08-05 11:04:02 +00:00
|
|
|
|
2004-08-22 17:24:50 +00:00
|
|
|
$wgOut->setPageTitle( wfMsg( 'whitelistedittitle' ) );
|
|
|
|
|
$wgOut->setRobotpolicy( 'noindex,nofollow' );
|
2004-01-17 09:49:43 +00:00
|
|
|
$wgOut->setArticleRelated( false );
|
2003-08-05 11:04:02 +00:00
|
|
|
|
2004-08-22 17:24:50 +00:00
|
|
|
$wgOut->addWikiText( wfMsg( 'whitelistedittext' ) );
|
2003-08-05 11:04:02 +00:00
|
|
|
$wgOut->returnToMain( false );
|
|
|
|
|
}
|
|
|
|
|
|
2004-09-03 16:51:45 +00:00
|
|
|
/**
|
|
|
|
|
* @todo document
|
|
|
|
|
*/
|
2004-12-11 11:32:53 +00:00
|
|
|
function spamPage ( $match = false )
|
2004-05-29 07:41:16 +00:00
|
|
|
{
|
2004-06-21 07:41:53 +00:00
|
|
|
global $wgOut;
|
2004-08-22 17:24:50 +00:00
|
|
|
$wgOut->setPageTitle( wfMsg( 'spamprotectiontitle' ) );
|
|
|
|
|
$wgOut->setRobotpolicy( 'noindex,nofollow' );
|
2004-05-29 07:41:16 +00:00
|
|
|
$wgOut->setArticleRelated( false );
|
|
|
|
|
|
2004-08-13 20:52:15 +00:00
|
|
|
$wgOut->addWikiText( wfMsg( 'spamprotectiontext' ) );
|
2004-12-11 11:32:53 +00:00
|
|
|
if ( $match ) {
|
|
|
|
|
$wgOut->addWikiText( wfMsg( 'spamprotectionmatch', "<nowiki>{$match}</nowiki>" ) );
|
2004-08-13 20:52:15 +00:00
|
|
|
}
|
2004-05-29 07:41:16 +00:00
|
|
|
$wgOut->returnToMain( false );
|
|
|
|
|
}
|
|
|
|
|
|
2004-09-03 16:51:45 +00:00
|
|
|
/**
|
|
|
|
|
* Forks processes to scan the originating IP for an open proxy server
|
|
|
|
|
* MemCached can be used to skip IPs that have already been scanned
|
|
|
|
|
*/
|
|
|
|
|
function proxyCheck() {
|
2004-03-10 14:24:40 +00:00
|
|
|
global $wgBlockOpenProxies, $wgProxyPorts, $wgProxyScriptPath;
|
|
|
|
|
global $wgIP, $wgUseMemCached, $wgMemc, $wgDBname, $wgProxyMemcExpiry;
|
|
|
|
|
|
|
|
|
|
if ( !$wgBlockOpenProxies ) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Get MemCached key
|
|
|
|
|
$skip = false;
|
2004-03-13 02:20:35 +00:00
|
|
|
if ( $wgUseMemCached ) {
|
2004-08-22 17:24:50 +00:00
|
|
|
$mcKey = $wgDBname.':proxy:ip:'.$wgIP;
|
2004-03-10 14:24:40 +00:00
|
|
|
$mcValue = $wgMemc->get( $mcKey );
|
|
|
|
|
if ( $mcValue ) {
|
|
|
|
|
$skip = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
2003-08-05 11:04:02 +00:00
|
|
|
|
2004-03-10 14:24:40 +00:00
|
|
|
# Fork the processes
|
|
|
|
|
if ( !$skip ) {
|
2004-08-22 17:24:50 +00:00
|
|
|
$title = Title::makeTitle( NS_SPECIAL, 'Blockme' );
|
2004-04-06 01:25:26 +00:00
|
|
|
$iphash = md5( $wgIP . $wgProxyKey );
|
2004-08-22 17:24:50 +00:00
|
|
|
$url = $title->getFullURL( 'ip='.$iphash );
|
2004-04-06 01:25:26 +00:00
|
|
|
|
2004-03-10 14:24:40 +00:00
|
|
|
foreach ( $wgProxyPorts as $port ) {
|
2004-08-22 17:24:50 +00:00
|
|
|
$params = implode( ' ', array(
|
2004-04-06 01:25:26 +00:00
|
|
|
escapeshellarg( $wgProxyScriptPath ),
|
|
|
|
|
escapeshellarg( $wgIP ),
|
|
|
|
|
escapeshellarg( $port ),
|
|
|
|
|
escapeshellarg( $url )
|
|
|
|
|
));
|
2004-03-10 14:24:40 +00:00
|
|
|
exec( "php $params &>/dev/null &" );
|
|
|
|
|
}
|
|
|
|
|
# Set MemCached key
|
|
|
|
|
if ( $wgUseMemCached ) {
|
|
|
|
|
$wgMemc->set( $mcKey, 1, $wgProxyMemcExpiry );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2004-03-14 15:05:52 +00:00
|
|
|
|
2004-09-03 16:51:45 +00:00
|
|
|
/**
|
|
|
|
|
* @access private
|
|
|
|
|
* @todo document
|
|
|
|
|
*/
|
2005-06-28 23:19:56 +00:00
|
|
|
function mergeChangesInto( &$editText ){
|
2005-05-28 12:21:56 +00:00
|
|
|
$db =& wfGetDB( DB_MASTER );
|
2004-05-29 16:20:08 +00:00
|
|
|
|
2005-06-28 23:19:56 +00:00
|
|
|
// This is the revision the editor started from
|
|
|
|
|
$baseRevision = Revision::loadFromTimestamp(
|
|
|
|
|
$db, $this->mArticle->mTitle, $this->edittime );
|
|
|
|
|
if( is_null( $baseRevision ) ) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
$baseText = $baseRevision->getText();
|
|
|
|
|
|
|
|
|
|
// The current state, we want to merge updates into it
|
|
|
|
|
$currentRevision = Revision::loadFromTitle(
|
|
|
|
|
$db, $this->mArticle->mTitle );
|
|
|
|
|
if( is_null( $currentRevision ) ) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
$currentText = $currentRevision->getText();
|
|
|
|
|
|
|
|
|
|
if( wfMerge( $baseText, $editText, $currentText, $result ) ){
|
|
|
|
|
$editText = $result;
|
2004-03-14 15:05:52 +00:00
|
|
|
return true;
|
|
|
|
|
} else {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
2004-10-10 21:30:17 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
function checkUnicodeCompliantBrowser() {
|
|
|
|
|
global $wgBrowserBlackList;
|
|
|
|
|
$currentbrowser = $_SERVER["HTTP_USER_AGENT"];
|
|
|
|
|
foreach ( $wgBrowserBlackList as $browser ) {
|
|
|
|
|
if ( preg_match($browser, $currentbrowser) ) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2004-10-26 05:44:54 +00:00
|
|
|
/**
|
|
|
|
|
* Format an anchor fragment as it would appear for a given section name
|
|
|
|
|
* @param string $text
|
|
|
|
|
* @return string
|
|
|
|
|
* @access private
|
|
|
|
|
*/
|
|
|
|
|
function sectionAnchor( $text ) {
|
2005-05-31 11:54:36 +00:00
|
|
|
$headline = Sanitizer::decodeCharReferences( $text );
|
2004-10-26 05:44:54 +00:00
|
|
|
# strip out HTML
|
|
|
|
|
$headline = preg_replace( '/<.*?' . '>/', '', $headline );
|
|
|
|
|
$headline = trim( $headline );
|
|
|
|
|
$sectionanchor = '#' . urlencode( str_replace( ' ', '_', $headline ) );
|
|
|
|
|
$replacearray = array(
|
|
|
|
|
'%3A' => ':',
|
|
|
|
|
'%' => '.'
|
|
|
|
|
);
|
|
|
|
|
return str_replace(
|
|
|
|
|
array_keys( $replacearray ),
|
|
|
|
|
array_values( $replacearray ),
|
|
|
|
|
$sectionanchor );
|
|
|
|
|
}
|
2004-11-25 13:52:56 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Shows a bulletin board style toolbar for common editing functions.
|
|
|
|
|
* It can be disabled in the user preferences.
|
|
|
|
|
* The necessary JavaScript code can be found in style/wikibits.js.
|
|
|
|
|
*/
|
|
|
|
|
function getEditToolbar() {
|
2005-05-05 21:00:49 +00:00
|
|
|
global $wgStylePath, $wgLang, $wgMimeType, $wgJsMimeType;
|
2004-11-25 13:52:56 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* toolarray an array of arrays which each include the filename of
|
|
|
|
|
* the button image (without path), the opening tag, the closing tag,
|
|
|
|
|
* and optionally a sample text that is inserted between the two when no
|
|
|
|
|
* selection is highlighted.
|
|
|
|
|
* The tip text is shown when the user moves the mouse over the button.
|
|
|
|
|
*
|
|
|
|
|
* Already here are accesskeys (key), which are not used yet until someone
|
|
|
|
|
* can figure out a way to make them work in IE. However, we should make
|
|
|
|
|
* sure these keys are not defined on the edit page.
|
|
|
|
|
*/
|
|
|
|
|
$toolarray=array(
|
|
|
|
|
array( 'image'=>'button_bold.png',
|
|
|
|
|
'open' => "\'\'\'",
|
|
|
|
|
'close' => "\'\'\'",
|
|
|
|
|
'sample'=> wfMsg('bold_sample'),
|
|
|
|
|
'tip' => wfMsg('bold_tip'),
|
|
|
|
|
'key' => 'B'
|
|
|
|
|
),
|
|
|
|
|
array( 'image'=>'button_italic.png',
|
|
|
|
|
'open' => "\'\'",
|
|
|
|
|
'close' => "\'\'",
|
|
|
|
|
'sample'=> wfMsg('italic_sample'),
|
|
|
|
|
'tip' => wfMsg('italic_tip'),
|
|
|
|
|
'key' => 'I'
|
|
|
|
|
),
|
|
|
|
|
array( 'image'=>'button_link.png',
|
|
|
|
|
'open' => '[[',
|
|
|
|
|
'close' => ']]',
|
|
|
|
|
'sample'=> wfMsg('link_sample'),
|
|
|
|
|
'tip' => wfMsg('link_tip'),
|
|
|
|
|
'key' => 'L'
|
|
|
|
|
),
|
|
|
|
|
array( 'image'=>'button_extlink.png',
|
|
|
|
|
'open' => '[',
|
|
|
|
|
'close' => ']',
|
|
|
|
|
'sample'=> wfMsg('extlink_sample'),
|
|
|
|
|
'tip' => wfMsg('extlink_tip'),
|
|
|
|
|
'key' => 'X'
|
|
|
|
|
),
|
|
|
|
|
array( 'image'=>'button_headline.png',
|
|
|
|
|
'open' => "\\n== ",
|
|
|
|
|
'close' => " ==\\n",
|
|
|
|
|
'sample'=> wfMsg('headline_sample'),
|
|
|
|
|
'tip' => wfMsg('headline_tip'),
|
|
|
|
|
'key' => 'H'
|
|
|
|
|
),
|
|
|
|
|
array( 'image'=>'button_image.png',
|
|
|
|
|
'open' => '[['.$wgLang->getNsText(NS_IMAGE).":",
|
|
|
|
|
'close' => ']]',
|
|
|
|
|
'sample'=> wfMsg('image_sample'),
|
|
|
|
|
'tip' => wfMsg('image_tip'),
|
|
|
|
|
'key' => 'D'
|
|
|
|
|
),
|
2005-04-28 20:44:26 +00:00
|
|
|
array( 'image' =>'button_media.png',
|
2004-11-25 13:52:56 +00:00
|
|
|
'open' => '[['.$wgLang->getNsText(NS_MEDIA).':',
|
|
|
|
|
'close' => ']]',
|
|
|
|
|
'sample'=> wfMsg('media_sample'),
|
|
|
|
|
'tip' => wfMsg('media_tip'),
|
|
|
|
|
'key' => 'M'
|
|
|
|
|
),
|
2005-04-28 20:44:26 +00:00
|
|
|
array( 'image' =>'button_math.png',
|
2004-11-25 13:52:56 +00:00
|
|
|
'open' => "\\<math\\>",
|
|
|
|
|
'close' => "\\</math\\>",
|
|
|
|
|
'sample'=> wfMsg('math_sample'),
|
|
|
|
|
'tip' => wfMsg('math_tip'),
|
|
|
|
|
'key' => 'C'
|
|
|
|
|
),
|
2005-04-28 20:44:26 +00:00
|
|
|
array( 'image' =>'button_nowiki.png',
|
2004-11-25 13:52:56 +00:00
|
|
|
'open' => "\\<nowiki\\>",
|
|
|
|
|
'close' => "\\</nowiki\\>",
|
|
|
|
|
'sample'=> wfMsg('nowiki_sample'),
|
|
|
|
|
'tip' => wfMsg('nowiki_tip'),
|
|
|
|
|
'key' => 'N'
|
|
|
|
|
),
|
2005-04-28 20:44:26 +00:00
|
|
|
array( 'image' =>'button_sig.png',
|
2004-11-25 13:52:56 +00:00
|
|
|
'open' => '--~~~~',
|
|
|
|
|
'close' => '',
|
|
|
|
|
'sample'=> '',
|
|
|
|
|
'tip' => wfMsg('sig_tip'),
|
|
|
|
|
'key' => 'Y'
|
|
|
|
|
),
|
2005-04-28 20:44:26 +00:00
|
|
|
array( 'image' =>'button_hr.png',
|
2004-11-25 13:52:56 +00:00
|
|
|
'open' => "\\n----\\n",
|
|
|
|
|
'close' => '',
|
|
|
|
|
'sample'=> '',
|
|
|
|
|
'tip' => wfMsg('hr_tip'),
|
|
|
|
|
'key' => 'R'
|
|
|
|
|
)
|
|
|
|
|
);
|
2005-05-05 21:00:49 +00:00
|
|
|
$toolbar ="<script type='$wgJsMimeType'>\n/*<![CDATA[*/\n";
|
2004-11-25 13:52:56 +00:00
|
|
|
|
|
|
|
|
$toolbar.="document.writeln(\"<div id='toolbar'>\");\n";
|
|
|
|
|
foreach($toolarray as $tool) {
|
|
|
|
|
|
|
|
|
|
$image=$wgStylePath.'/common/images/'.$tool['image'];
|
|
|
|
|
$open=$tool['open'];
|
|
|
|
|
$close=$tool['close'];
|
2005-04-30 08:04:02 +00:00
|
|
|
$sample = wfEscapeJsString( $tool['sample'] );
|
2004-11-25 13:52:56 +00:00
|
|
|
|
|
|
|
|
// Note that we use the tip both for the ALT tag and the TITLE tag of the image.
|
|
|
|
|
// Older browsers show a "speedtip" type message only for ALT.
|
|
|
|
|
// Ideally these should be different, realistically they
|
|
|
|
|
// probably don't need to be.
|
2005-04-30 09:13:44 +00:00
|
|
|
$tip = wfEscapeJsString( $tool['tip'] );
|
2004-11-25 13:52:56 +00:00
|
|
|
|
|
|
|
|
#$key = $tool["key"];
|
|
|
|
|
|
|
|
|
|
$toolbar.="addButton('$image','$tip','$open','$close','$sample');\n";
|
|
|
|
|
}
|
|
|
|
|
|
2005-04-30 08:04:02 +00:00
|
|
|
$toolbar.="addInfobox('" . wfEscapeJsString( wfMsg( "infobox" ) ) .
|
|
|
|
|
"','" . wfEscapeJsString( wfMsg( "infobox_alert" ) ) . "');\n";
|
2004-11-25 13:52:56 +00:00
|
|
|
$toolbar.="document.writeln(\"</div>\");\n";
|
|
|
|
|
|
|
|
|
|
$toolbar.="/*]]>*/\n</script>";
|
|
|
|
|
return $toolbar;
|
|
|
|
|
}
|
2004-12-19 02:36:04 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Output preview text only. This can be sucked into the edit page
|
|
|
|
|
* via JavaScript, and saves the server time rendering the skin as
|
|
|
|
|
* well as theoretically being more robust on the client (doesn't
|
|
|
|
|
* disturb the edit box's undo history, won't eat your text on
|
|
|
|
|
* failure, etc).
|
|
|
|
|
*
|
|
|
|
|
* @todo This doesn't include category or interlanguage links.
|
|
|
|
|
* Would need to enhance it a bit, maybe wrap them in XML
|
|
|
|
|
* or something... that might also require more skin
|
|
|
|
|
* initialization, so check whether that's a problem.
|
|
|
|
|
*/
|
|
|
|
|
function livePreview() {
|
|
|
|
|
global $wgOut;
|
|
|
|
|
$wgOut->disable();
|
|
|
|
|
header( 'Content-type: text/xml' );
|
|
|
|
|
header( 'Cache-control: no-cache' );
|
|
|
|
|
# FIXME
|
|
|
|
|
echo $this->getPreviewText( false, false );
|
|
|
|
|
}
|
2004-11-25 13:52:56 +00:00
|
|
|
|
2005-05-15 11:11:23 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get a diff between the current contents of the edit box and the
|
|
|
|
|
* version of the page we're editing from.
|
|
|
|
|
*
|
|
|
|
|
* If this is a section edit, we'll replace the section as for final
|
|
|
|
|
* save and then make a comparison.
|
|
|
|
|
*
|
|
|
|
|
* @return string HTML
|
|
|
|
|
*/
|
|
|
|
|
function getDiff() {
|
|
|
|
|
require_once( 'DifferenceEngine.php' );
|
2005-06-29 00:31:07 +00:00
|
|
|
$oldtext = $this->mArticle->fetchContent();
|
2005-05-15 11:11:23 +00:00
|
|
|
$newtext = $this->mArticle->getTextOfLastEditWithSectionReplacedOrAdded(
|
|
|
|
|
$this->section, $this->textbox1, $this->summary, $this->edittime );
|
|
|
|
|
$oldtitle = wfMsg( 'currentrev' );
|
|
|
|
|
$newtitle = wfMsg( 'yourtext' );
|
|
|
|
|
if ( $oldtext != wfMsg( 'noarticletext' ) || $newtext != '' ) {
|
|
|
|
|
$difftext = DifferenceEngine::getDiff( $oldtext, $newtext, $oldtitle, $newtitle );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return '<div id="wikiDiff">' . $difftext . '</div>';
|
|
|
|
|
}
|
|
|
|
|
|
2003-08-02 20:43:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
?>
|