# Placeholders for text injection by hooks (must be HTML)
# extensions should take care to _append_ to the present value
- var $editFormTextTop;
- var $editFormTextAfterWarn;
- var $editFormTextAfterTools;
- var $editFormTextBottom;
+ public $editFormPageTop; // Before even the preview
+ public $editFormTextTop;
+ public $editFormTextAfterWarn;
+ public $editFormTextAfterTools;
+ public $editFormTextBottom;
/**
* @todo document
$this->mTitle =& $wgTitle;
# Placeholders for text injection by hooks (empty per default)
- $this->editFormTextTop = "";
- $this->editFormTextAfterWarn = "";
- $this->editFormTextAfterTools = "";
+ $this->editFormPageTop =
+ $this->editFormTextTop =
+ $this->editFormTextAfterWarn =
+ $this->editFormTextAfterTools =
$this->editFormTextBottom = "";
}
# Get variables from query string :P
$section = $wgRequest->getVal( 'section' );
$preload = $wgRequest->getVal( 'preload' );
+ $undo = $wgRequest->getVal( 'undo' );
wfProfileIn( __METHOD__ );
// information.
$text = $this->mArticle->getContent();
-
- if( $section != '' ) {
+
+ if ( $undo > 0 ) {
+ #Undoing a specific edit overrides section editing; section-editing
+ # doesn't work with undoing.
+ $undorev = Revision::newFromId($undo);
+
+ #Sanity check, make sure it's the right page.
+ # Otherwise, $text will be left as-is.
+ if (!is_null($undorev) && $undorev->getPage() == $this->mArticle->getID()) {
+ $oldrev = $undorev->getPrevious();
+ $undorev_text = $undorev->getText();
+ $oldrev_text = $oldrev->getText();
+ $currev_text = $text;
+
+ #No use doing a merge if it's just a straight revert.
+ if ($currev_text != $undorev_text) {
+ $result = wfMerge($undorev_text, $oldrev_text, $currev_text, $text);
+ } else {
+ $result = true;
+ }
+
+ if (!$result) {
+ #Undoing failed. Bailing out with regular revision text.
+ $text = $currev_text;
+
+ #Give a warning
+ $this->editFormPageTop .= "<h2>" . wfMsg('undofailed') . "</h2>\n" .
+ '<p><strong class="error">'.wfMsg('explainundofailed').'</strong></p>';
+ } else {
+ $this->editFormPageTop .= '<h2>'.wfMsg('undosucceeded')."</h2>\n" .
+ '<p>'.wfMsg('explainundosucceeded').'</p>';
+ $this->summary = wfMsgForContent('undo-summary', $undo, $undorev->getUserText());
+ }
+ }
+ }
+ else if( $section != '' ) {
if( $section == 'new' ) {
$text = $this->getPreloadedText( $preload );
} else {
global $wgUser;
if( $wgUser->isAnon() ) {
# Anonymous users may not have a session
- # open. Don't tokenize.
- $this->mTokenOk = true;
+ # open. Check for suffix anyway.
+ $this->mTokenOk = ( EDIT_TOKEN_SUFFIX == $request->getVal( 'wpEditToken' ) );
} else {
$this->mTokenOk = $wgUser->matchEditToken( $request->getVal( 'wpEditToken' ) );
}
wfProfileIn( $fname );
wfProfileIn( "$fname-checks" );
+ if( !wfRunHooks( 'EditPage::attemptSave', array( &$this ) ) )
+ {
+ wfDebug( "Hook 'EditPage::attemptSave' aborted article saving" );
+ return false;
+ }
+
# Reintegrate metadata
if ( $this->mMetaData != '' ) $this->textbox1 .= "\n" . $this->mMetaData ;
$this->mMetaData = '' ;
# Check for spam
+ $matches = array();
if ( $wgSpamRegex && preg_match( $wgSpamRegex, $this->textbox1, $matches ) ) {
$this->spamPage ( $matches[0] );
wfProfileOut( "$fname-checks" );
# If article is new, insert it.
$aid = $this->mTitle->getArticleID( GAID_FOR_UPDATE );
if ( 0 == $aid ) {
+
// Late check for create permission, just in case *PARANOIA*
if ( !$this->mTitle->userCanCreate() ) {
wfDebug( "$fname: no create permission\n" );
*/
function initialiseForm() {
$this->edittime = $this->mArticle->getTimestamp();
- $this->textbox1 = $this->getContent();
$this->summary = '';
+ $this->textbox1 = $this->getContent();
if ( !$this->mArticle->exists() && $this->mArticle->mTitle->getNamespace() == NS_MEDIAWIKI )
$this->textbox1 = wfMsgWeirdKey( $this->mArticle->mTitle->getText() ) ;
wfProxyCheck();
$s = wfMsg('editingcomment', $this->mTitle->getPrefixedText() );
} else {
$s = wfMsg('editingsection', $this->mTitle->getPrefixedText() );
+ $matches = array();
if( !$this->summary && !$this->preview && !$this->diff ) {
preg_match( "/^(=+)(.+)\\1/mi",
$this->textbox1,
$checkboxhtml = $minoredithtml . $watchhtml;
+ $wgOut->addHTML( $this->editFormPageTop );
+
if ( $wgUser->getOption( 'previewontop' ) ) {
if ( 'preview' == $this->formtype ) {
</div><!-- editButtons -->
</div><!-- editOptions -->");
+ $wgOut->addHtml( '<div class="editTools">' );
$wgOut->addWikiText( wfMsgForContent( 'edittools' ) );
+ $wgOut->addHtml( '</div>' );
+
$wgOut->addHTML( $this->editFormTextAfterTools );
$wgOut->addHTML( "
</div>
" );
- if ( $wgUser->isLoggedIn() ) {
- /**
- * To make it harder for someone to slip a user a page
- * which submits an edit form to the wiki without their
- * knowledge, a random token is associated with the login
- * session. If it's not passed back with the submission,
- * we won't save the page, or render user JavaScript and
- * CSS previews.
- */
+ /**
+ * To make it harder for someone to slip a user a page
+ * which submits an edit form to the wiki without their
+ * knowledge, a random token is associated with the login
+ * session. If it's not passed back with the submission,
+ * we won't save the page, or render user JavaScript and
+ * CSS previews.
+ *
+ * For anon editors, who may not have a session, we just
+ * include the constant suffix to prevent editing from
+ * broken text-mangling proxies.
+ */
+ if ( $wgUser->isLoggedIn() )
$token = htmlspecialchars( $wgUser->editToken() );
- $wgOut->addHTML( "\n<input type='hidden' value=\"$token\" name=\"wpEditToken\" />\n" );
- }
+ else
+ $token = EDIT_TOKEN_SUFFIX;
+ $wgOut->addHTML( "\n<input type='hidden' value=\"$token\" name=\"wpEditToken\" />\n" );
+
# If a blank edit summary was previously provided, and the appropriate
# user preference is active, pass a hidden tag here. This will stop the
}
$currentText = $currentRevision->getText();
+ $result = '';
if( wfMerge( $baseText, $editText, $currentText, $result ) ){
$editText = $result;
wfProfileOut( $fname );
*/
$toolarray=array(
array( 'image'=>'button_bold.png',
- 'open' => "\'\'\'",
- 'close' => "\'\'\'",
+ 'open' => '\\\'\\\'\\\'',
+ 'close' => '\\\'\\\'\\\'',
'sample'=> wfMsg('bold_sample'),
'tip' => wfMsg('bold_tip'),
'key' => 'B'
),
array( 'image'=>'button_italic.png',
- 'open' => "\'\'",
- 'close' => "\'\'",
+ 'open' => '\\\'\\\'',
+ 'close' => '\\\'\\\'',
'sample'=> wfMsg('italic_sample'),
'tip' => wfMsg('italic_tip'),
'key' => 'I'