Capitalization fix in memcached setting
[lhc/web/wiklou.git] / includes / EditPage.php
index f1083b4..0188851 100644 (file)
@@ -1,7 +1,8 @@
 <?php
-# $Id$
 /**
  * Contain the EditPage class
+ * @package MediaWiki
+ * @version $Id$
  */
 
 /**
@@ -9,7 +10,10 @@
  * The actual database and text munging is still in Article,
  * but it should get easier to call those from alternate
  * interfaces.
+ *
+ * @package MediaWiki
  */
+
 class EditPage {
        var $mArticle;
        var $mTitle;
@@ -63,7 +67,7 @@ class EditPage {
                }
                if ( $this->save ) {
                        $this->editForm( 'save' );
-               } else if ( $this->preview ) {
+               } else if ( $this->preview or $wgUser->getOption('previewonfirst')) {
                        $this->editForm( 'preview' );
                } else { # First time through
                        $this->editForm( 'initial' );
@@ -119,10 +123,11 @@ class EditPage {
         */
        function editForm( $formtype ) {
                global $wgOut, $wgUser;
-               global $wgLang, $wgParser, $wgTitle;
+               global $wgLang, $wgContLang, $wgParser, $wgTitle;
                global $wgAllowAnonymousMinor;
                global $wgWhitelistEdit;
                global $wgSpamRegex, $wgFilterCallback;
+               global $wgUseLatin1;
 
                $sk = $wgUser->getSkin();
                $isConflict = false;
@@ -189,8 +194,14 @@ class EditPage {
                        }
                        $userid = $wgUser->getID();
 
-                       $text = $this->mArticle->getTextOfLastEditWithSectionReplacedOrAdded(
-                               $this->section, $this->textbox1, $this->summary);
+                       if ( $isConflict) {
+                               $text = $this->mArticle->getTextOfLastEditWithSectionReplacedOrAdded(
+                                       $this->section, $this->textbox1, $this->summary, $this->edittime);
+                       }
+                       else {
+                               $text = $this->mArticle->getTextOfLastEditWithSectionReplacedOrAdded(
+                                       $this->section, $this->textbox1, $this->summary);
+                       }
                        # Suppress edit conflict with self
 
                        if ( ( 0 != $userid ) && ( $this->mArticle->getUser() == $userid ) ) {
@@ -211,7 +222,11 @@ class EditPage {
                        if ( ! $isConflict ) {
                                # All's well
                                $sectionanchor = '';
-                               if( $this->section != '' ) {
+                               if( $this->section == 'new' ) {
+                                       if( $this->summary != '' ) {
+                                               $sectionanchor = $this->sectionAnchor( $this->summary );
+                                       }
+                               } elseif( $this->section != '' ) {
                                        # 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
@@ -220,17 +235,7 @@ class EditPage {
                                        # headline would need to be parsed to improve this
                                        #if($hasmatch and strlen($matches[2]) > 0 and !preg_match( "/[\\['{<>]/", $matches[2])) {
                                        if($hasmatch and strlen($matches[2]) > 0) {
-                                               global $wgInputEncoding;
-                                               $headline = do_html_entity_decode( $matches[2], ENT_COMPAT, $wgInputEncoding );
-                                               # strip out HTML 
-                                               $headline = preg_replace( "/<.*?" . ">/","",$headline );
-                                               $headline = trim( $headline );
-                                               $sectionanchor = '#'.urlencode( str_replace(' ', '_', $headline ) );
-                                               $replacearray = array(
-                                                       '%3A' => ':',
-                                                       '%' => '.'
-                                               );
-                                               $sectionanchor = str_replace(array_keys($replacearray),array_values($replacearray),$sectionanchor);
+                                               $sectionanchor = $this->sectionAnchor( $matches[2] );
                                        }
                                }
        
@@ -264,13 +269,12 @@ class EditPage {
                        $this->textbox1 = $this->mArticle->getContent( true );
                        $this->edittime = $this->mArticle->getTimestamp();
                } else {
-                       $s = wfMsg( 'editing', $this->mTitle->getPrefixedText() );
 
                        if( $this->section != '' ) {
                                if( $this->section == 'new' ) {
-                                       $s.=wfMsg('commentedit');
+                                       $s = wfMsg('editingcomment', $this->mTitle->getPrefixedText() );
                                } else {
-                                       $s.=wfMsg('sectionedit');
+                                       $s = wfMsg('editingsection', $this->mTitle->getPrefixedText() );
                                }
                                if(!$this->preview) {
                                        $sectitle=preg_match("/^=+(.*?)=+/mi",
@@ -280,8 +284,14 @@ class EditPage {
                                                $this->summary = "/* ". trim($matches[1])." */ ";
                                        }
                                }
+                       } else {
+                               $s = wfMsg( 'editing', $this->mTitle->getPrefixedText() );
                        }
                        $wgOut->setPageTitle( $s );
+                       if ( !$wgUseLatin1 && !$this->checkUnicodeCompliantBrowser() ) {
+                               $this->mArticle->setOldSubtitle();
+                               $wgOut->addWikiText( wfMsg( 'nonunicodebrowser') );
+                       }
                        if ( $this->oldid ) {
                                $this->mArticle->setOldSubtitle();
                                $wgOut->addHTML( wfMsg( 'editingold' ) );
@@ -399,8 +409,14 @@ class EditPage {
                                $parserOutput = $wgParser->parse( $previewtext , $wgTitle, $parserOptions );
                                $wgOut->addHTML( $parserOutput->mText );
                        } 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);
+                               }
+
                                $parserOutput = $wgParser->parse( $this->mArticle->preSaveTransform( $this->textbox1 ) ."\n\n",
-                                               $wgTitle, $parserOptions );
+                                               $wgTitle, $parserOptions );             
+                               
                                $previewHTML = $parserOutput->mText;
 
                                if($wgUser->getOption('previewontop')) {
@@ -415,7 +431,7 @@ class EditPage {
 
                # 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
-               $summarytext = htmlspecialchars( $wgLang->recodeForEdit( $this->summary ) ); # FIXME
+               $summarytext = htmlspecialchars( $wgContLang->recodeForEdit( $this->summary ) ); # FIXME
                        if( $this->section == 'new' ) {
                                $commentsubject="{$subject}: <input tabindex='1' type='text' value=\"$summarytext\" name=\"wpSummary\" maxlength='200' size='60' /><br />";
                                $editsummary = '';
@@ -451,11 +467,11 @@ class EditPage {
                $wgOut->addHTML( "
 {$toolbar}
 <form id=\"editform\" name=\"editform\" method=\"post\" action=\"$action\"
-enctype=\"application/x-www-form-urlencoded\">
+enctype=\"multipart/form-data\">
 {$commentsubject}
 <textarea tabindex='1' accesskey=\",\" name=\"wpTextbox1\" rows='{$rows}'
 cols='{$cols}'{$ew}>" .
-htmlspecialchars( $wgLang->recodeForEdit( $this->textbox1 ) ) .
+htmlspecialchars( $wgContLang->recodeForEdit( $this->textbox1 ) ) .
 "
 </textarea>
 <br />{$editsummary}
@@ -478,7 +494,7 @@ htmlspecialchars( $wgLang->recodeForEdit( $this->textbox1 ) ) .
 
                        $wgOut->addHTML( "<h2>" . wfMsg( "yourtext" ) . "</h2>
 <textarea tabindex=6 id='wpTextbox2' name=\"wpTextbox2\" rows='{$rows}' cols='{$cols}' wrap='virtual'>"
-. htmlspecialchars( $wgLang->recodeForEdit( $this->textbox2 ) ) .
+. htmlspecialchars( $wgContLang->recodeForEdit( $this->textbox2 ) ) .
 "
 </textarea>" );
                }
@@ -493,7 +509,7 @@ htmlspecialchars( $wgLang->recodeForEdit( $this->textbox1 ) ) .
         * @todo document
         */
        function blockedIPpage() {
-               global $wgOut, $wgUser, $wgLang, $wgIP;
+               global $wgOut, $wgUser, $wgContLang, $wgIP;
 
                $wgOut->setPageTitle( wfMsg( 'blockedtitle' ) );
                $wgOut->setRobotpolicy( 'noindex,nofollow' );
@@ -508,7 +524,7 @@ htmlspecialchars( $wgLang->recodeForEdit( $this->textbox1 ) ) .
                } else {
                        $name = $id;
                }
-               $link = '[[' . $wgLang->getNsText( Namespace::getUser() ) .
+               $link = '[[' . $wgContLang->getNsText( Namespace::getUser() ) .
                  ":{$name}|{$name}]]";
 
                $wgOut->addWikiText( wfMsg( 'blockedtext', $link, $reason, $ip, $name ) );
@@ -519,7 +535,7 @@ htmlspecialchars( $wgLang->recodeForEdit( $this->textbox1 ) ) .
         * @todo document
         */
        function userNotLoggedInPage() {
-               global $wgOut, $wgUser, $wgLang;
+               global $wgOut, $wgUser;
 
                $wgOut->setPageTitle( wfMsg( 'whitelistedittitle' ) );
                $wgOut->setRobotpolicy( 'noindex,nofollow' );
@@ -598,13 +614,13 @@ htmlspecialchars( $wgLang->recodeForEdit( $this->textbox1 ) ) .
                $fname = 'EditPage::mergeChangesInto';
                $oldDate = $this->edittime;
                $dbw =& wfGetDB( DB_MASTER );
-               $obj = $dbw->getArray( 'cur', array( 'cur_text' ), array( 'cur_id' => $this->mTitle->getArticleID() ), 
+               $obj = $dbw->selectRow( 'cur', array( 'cur_text' ), array( 'cur_id' => $this->mTitle->getArticleID() ), 
                        $fname, 'FOR UPDATE' );
 
                $yourtext = $obj->cur_text;
                $ns = $this->mTitle->getNamespace();
                $title = $this->mTitle->getDBkey();
-               $obj = $dbw->getArray( 'old', 
+               $obj = $dbw->selectRow( 'old', 
                        array( 'old_text','old_flags'), 
                        array( 'old_namespace' => $ns, 'old_title' => $title, 
                                'old_timestamp' => $dbw->timestamp($oldDate)),
@@ -618,6 +634,41 @@ htmlspecialchars( $wgLang->recodeForEdit( $this->textbox1 ) ) .
                        return false;
                }
        }
+
+
+       function checkUnicodeCompliantBrowser() {
+               global $wgBrowserBlackList;
+               $currentbrowser = $_SERVER["HTTP_USER_AGENT"];
+               foreach ( $wgBrowserBlackList as $browser ) {
+                       if ( preg_match($browser, $currentbrowser) ) {
+                               return false;
+                       }
+               }
+               return true;
+       }
+
+       /**
+        * Format an anchor fragment as it would appear for a given section name
+        * @param string $text
+        * @return string
+        * @access private
+        */
+       function sectionAnchor( $text ) {
+               global $wgInputEncoding;
+               $headline = do_html_entity_decode( $text, ENT_COMPAT, $wgInputEncoding );
+               # 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 );
+       }
 }
 
 ?>