$wgOut->readOnlyPage( $this->mArticle->getContent( true ), true );
return;
}
- if ( !$this->preview && !$this->diff && $wgUser->isBlocked( !$this->save ) ) {
+ if ( !$this->preview && !$this->diff && $wgUser->isBlockedFrom( $this->mTitle, !$this->save ) ) {
# 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.
$this->blockedIPpage();
} else if ( $this->diff ) {
$this->editForm( 'diff' );
} else { # First time through
- if( $wgUser->getOption('previewonfirst') ) {
+ if( $this->previewOnOpen() ) {
$this->editForm( 'preview', true );
} else {
$this->extractMetaDataFromArticle () ;
}
}
}
+
+ /**
+ * Return true if this page should be previewed when the edit form
+ * is initially opened.
+ * @return bool
+ * @access private
+ */
+ function previewOnOpen() {
+ global $wgUser;
+ return $wgUser->getOption( 'previewonfirst' ) ||
+ ( $this->mTitle->getNamespace() == NS_CATEGORY &&
+ !$this->mTitle->exists() );
+ }
/**
* @todo document
function editForm( $formtype, $firsttime = false ) {
global $wgOut, $wgUser;
global $wgLang, $wgContLang, $wgParser, $wgTitle;
- global $wgAllowAnonymousMinor;
+ global $wgAllowAnonymousMinor, $wgRequest;
global $wgSpamRegex, $wgFilterCallback;
$sk = $wgUser->getSkin();
// css / js subpages of user pages get a special treatment
$isCssJsSubpage = $wgTitle->isCssJsSubpage();
-
if(!$this->mTitle->getArticleID()) { # new article
- $wgOut->addWikiText(wfmsg('newarticletext'));
+ $editintro = $wgRequest->getText( 'editintro' );
+ $addstandardintro=true;
+ if($editintro) {
+ $introtitle=Title::newFromText($editintro);
+ if(isset($introtitle) && $introtitle->userCanRead()) {
+ $rev=Revision::newFromTitle($introtitle);
+ if($rev) {
+ $wgOut->addWikiText($rev->getText());
+ $addstandardintro=false;
+ }
+ }
+ }
+ if($addstandardintro) {
+ $wgOut->addWikiText(wfmsg('newarticletext'));
+ }
}
if( $this->mTitle->isTalkPage() ) {
# Error messages or other handling should be performed by the filter function
return;
}
- if ( $wgUser->isBlocked( false ) ) {
+ if ( $wgUser->isBlockedFrom( $this->mTitle, false ) ) {
# Check block state against master, thus 'false'.
$this->blockedIPpage();
return;
}
if (wfRunHooks('ArticleSave', array(&$this->mArticle, &$wgUser, &$this->textbox1,
&$this->summary, &$this->minoredit, &$this->watchthis, NULL)))
- {
+ {
+
+ $isComment=($this->section=='new');
$this->mArticle->insertNewArticle( $this->textbox1, $this->summary,
- $this->minoredit, $this->watchthis );
+ $this->minoredit, $this->watchthis, false, $isComment);
wfRunHooks('ArticleSaveComplete', array(&$this->mArticle, &$wgUser, $this->textbox1,
$this->summary, $this->minoredit,
$this->watchthis, NULL));
$userid = $wgUser->getID();
if ( $isConflict) {
- wfDebug( "EditPage::editForm conflict! getting section '$this->section' for time '$this->edittime'\n" );
+ wfDebug( "EditPage::editForm conflict! getting section '$this->section' for time '$this->edittime' (article time '" .
+ $this->mArticle->getTimestamp() . "'\n" );
$text = $this->mArticle->getTextOfLastEditWithSectionReplacedOrAdded(
$this->section, $this->textbox1, $this->summary, $this->edittime);
}
# Suppress edit conflict with self
if ( ( 0 != $userid ) && ( $this->mArticle->getUser() == $userid ) ) {
+ wfDebug( "Suppressing edit conflict, same user.\n" );
$isConflict = false;
} else {
# switch from section editing to normal editing in edit conflict
if( $this->mergeChangesInto( $text ) ){
// Successful merge! Maybe we should tell the user the good news?
$isConflict = false;
+ wfDebug( "Suppressing edit conflict, successful merge.\n" );
} else {
$this->section = '';
$this->textbox1 = $text;
+ wfDebug( "Keeping edit conflict, failed merge.\n" );
}
}
}
}
}
+ // Save errors may fall down to the edit form, but we've now
+ // merged the section into full text. Clear the section field
+ // so that later submission of conflict forms won't try to
+ // replace that into a duplicated mess.
+ $this->textbox1 = $text;
+ $this->section = '';
+
if (wfRunHooks('ArticleSave', array(&$this->mArticle, &$wgUser, &$text,
&$this->summary, &$this->minoredit,
&$this->watchthis, &$sectionanchor)))
$this->summary, $this->minoredit,
$this->watchthis, $sectionanchor));
return;
+ } else {
+ $isConflict = true;
}
- else
- $isConflict = true;
}
}
}
$s = wfMsg('editingcomment', $this->mTitle->getPrefixedText() );
} else {
$s = wfMsg('editingsection', $this->mTitle->getPrefixedText() );
- }
- if(!$this->preview) {
- preg_match( "/^(=+)(.+)\\1/mi",
- $this->textbox1,
- $matches );
- if( !empty( $matches[2] ) ) {
- $this->summary = "/* ". trim($matches[2])." */ ";
- }
+ if( !$this->preview && !$this->diff ) {
+ preg_match( "/^(=+)(.+)\\1/mi",
+ $this->textbox1,
+ $matches );
+ if( !empty( $matches[2] ) ) {
+ $this->summary = "/* ". trim($matches[2])." */ ";
+ }
+ }
}
} else {
$s = wfMsg( 'editing', $this->mTitle->getPrefixedText() );
$this->mArticle->setOldSubtitle();
$wgOut->addWikiText( wfMsg( 'nonunicodebrowser') );
}
- if ( $this->oldid ) {
+ if ( isset( $this->mArticle )
+ && isset( $this->mArticle->mRevision )
+ && !$this->mArticle->mRevision->isCurrent() ) {
$this->mArticle->setOldSubtitle();
$wgOut->addWikiText( wfMsg( 'editingold' ) );
}
$previewOutput = $this->getPreviewText( $isConflict, $isCssJsSubpage );
if ( $wgUser->getOption('previewontop' ) ) {
$wgOut->addHTML( $previewOutput );
+ if($this->mTitle->getNamespace() == NS_CATEGORY) {
+ $this->mArticle->closeShowCategory();
+ }
$wgOut->addHTML( "<br style=\"clear:both;\" />\n" );
}
}
$this->textbox1 = $this->mArticle->getContent(true);
}
- $toparse = $this->textbox1 ;
+ $toparse = $this->textbox1;
+
+ # If we're adding a comment, we need to show the
+ # summary as the headline
+ if($this->section=="new" && $this->summary!="") {
+ $toparse="== {$this->summary} ==\n\n".$toparse;
+ }
+
if ( $this->mMetaData != "" ) $toparse .= "\n" . $this->mMetaData ;
$parserOutput = $wgParser->parse( $this->mArticle->preSaveTransform( $toparse ) ."\n\n",
$wgTitle, $parserOptions );
$previewHTML = $parserOutput->mText;
-
+
$wgOut->addCategoryLinks($parserOutput->getCategoryLinks());
$wgOut->addLanguageLinks($parserOutput->getLanguageLinks());
return $previewhead . $previewHTML;
* @access private
* @todo document
*/
- function mergeChangesInto( &$text ){
- $yourtext = $this->mArticle->fetchRevisionText();
-
+ function mergeChangesInto( &$editText ){
$db =& wfGetDB( DB_MASTER );
- $oldText = $this->mArticle->fetchRevisionText(
- $db->timestamp( $this->edittime ),
- 'rev_timestamp' );
- if(wfMerge($oldText, $text, $yourtext, $result)){
- $text = $result;
+ // 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;
return true;
} else {
return false;
*/
function getDiff() {
require_once( 'DifferenceEngine.php' );
- $oldtext = $this->mArticle->getContent( true );
+ $oldtext = $this->mArticle->fetchContent();
$newtext = $this->mArticle->getTextOfLastEditWithSectionReplacedOrAdded(
$this->section, $this->textbox1, $this->summary, $this->edittime );
$oldtitle = wfMsg( 'currentrev' );