Scripts and data used for generating ZhConversion.php
[lhc/web/wiklou.git] / includes / Image.php
index ae2ca8e..036c1e7 100644 (file)
@@ -1,8 +1,16 @@
 <?php
-# Class to represent an image
-# Provides methods to retrieve paths (physical, logical, URL),
-# to generate thumbnails or for uploading.
-
+/**
+ * @package MediaWiki
+ * $Id$
+ */
+
+/**
+ * Class to represent an image
+ * 
+ * Provides methods to retrieve paths (physical, logical, URL),
+ * to generate thumbnails or for uploading.
+ * @package MediaWiki
+ */
 class Image
 {
        /* private */
@@ -23,13 +31,18 @@ class Image
 
        function Image( $name )
        {
-               global $wgUploadDirectory;
+               global $wgUploadDirectory,$wgHashedUploadDirectory;
 
                $this->name      = $name;
-               $this->title     = Title::makeTitle( Namespace::getImage(), $this->name );
+               $this->title     = Title::makeTitleSafe( NS_IMAGE, $this->name );
                //$this->imagePath = wfImagePath( $name );
-               $hash            = md5( $this->title->getDBkey() );
-               $this->imagePath = $wgUploadDirectory . '/' . $hash{0} . '/' .substr( $hash, 0, 2 ) . "/{$name}";
+               if ($wgHashedUploadDirectory) {
+                       $hash            = md5( $this->title->getDBkey() );
+                       $this->imagePath = $wgUploadDirectory . '/' . $hash{0} . '/' .
+                                               substr( $hash, 0, 2 ) . "/{$name}";
+               } else {
+                       $this->imagePath = $wgUploadDirectory . '/' . $name;
+               }
 
                $this->url       = $this->wfImageUrl( $name );
 
@@ -63,6 +76,11 @@ class Image
                return $this->name;
        }
 
+       function getTitle()
+       {
+               return $this->title;
+       }
+
        function getURL()
        {
                return $this->url;
@@ -83,6 +101,12 @@ class Image
                return $this->height;
        }
 
+       function getSize()
+       {
+               $st = stat( $this->getImagePath() );
+               return $st['size'];
+       }
+
        function getType()
        {
                return $this->type;
@@ -95,26 +119,32 @@ class Image
 
        function wfImageUrl( $name )
        {
-               global $wgUploadPath;
-               $hash = md5( $name );
-
-               $url = "{$wgUploadPath}/" . $hash{0} . "/" .
-               substr( $hash, 0, 2 ) . "/{$name}";
+               global $wgUploadPath,$wgUploadBaseUrl,$wgHashedUploadDirectory;
+               if ($wgHashedUploadDirectory) {
+                       $hash = md5( $name );
+                       $url = "{$wgUploadBaseUrl}{$wgUploadPath}/" . $hash{0} . "/" .
+                       substr( $hash, 0, 2 ) . "/{$name}";
+               } else {
+                       $url = "{$wgUploadBaseUrl}{$wgUploadPath}/{$name}";
+               }
                return wfUrlencode( $url );
        }
 
-
        function exists()
        {
                return $this->fileExists;
        }
 
        function thumbUrl( $width, $subdir='thumb' ) {
-               global $wgUploadPath;
-
+               global $wgUploadPath,$wgHashedUploadDirectory;
                $name = $this->thumbName( $width );
-               $hash = md5( $name );
-               $url = "{$wgUploadPath}/{$subdir}/" . $hash{0} . "/" . substr( $hash, 0, 2 ) . "/{$name}";
+               if ($wgHashedUploadDirectory) {
+                       $hash = md5( $name );
+                       $url = "{$wgUploadPath}/{$subdir}/" . $hash{0} . "/" . 
+                               substr( $hash, 0, 2 ) . "/{$name}";
+               } else {
+                       $url = "{$wgUploadPath}/{$subdir}/{$name}";
+               }
 
                return wfUrlencode($url);
        }
@@ -123,14 +153,33 @@ class Image
                return $width."px-".$this->name;
        }
 
-       //**********************************************************************
-       // Create a thumbnail of the image having the specified width.
-       // The thumbnail will not be created if the width is larger than the
-       // image's width. Let the browser do the scaling in this case.
-       // The thumbnail is stored on disk and is only computed if the thumbnail
-       // file does not exist OR if it is older than the image.
-       // Returns the URL.
-       function createThumb( $width ) {
+       function createThumb( $width, $height=-1 ) {
+               if ( $height == -1 ) {
+                       return $this->renderThumb( $width );
+               }
+               if ( $width < $this->width ) {
+                       $thumbheight = $this->height * $width / $this->width;
+                       $thumbwidth = $width;
+               } else {
+                       $thumbheight = $this->height;
+                       $thumbwidth = $this->width;
+               }
+               if ( $thumbheight > $height ) {
+                       $thumbwidth = $thumbwidth * $height / $thumbheight;
+                       $thumbheight = $height;
+               }
+               return $this->renderThumb( $thumbwidth );
+       }
+               
+       /**
+        * Create a thumbnail of the image having the specified width.
+        * The thumbnail will not be created if the width is larger than the
+        * image's width. Let the browser do the scaling in this case.
+        * The thumbnail is stored on disk and is only computed if the thumbnail
+        * file does not exist OR if it is older than the image.
+        * Returns the URL.
+        */
+       function /* private */ renderThumb( $width ) {
                global $wgUploadDirectory;
                global $wgImageMagickConvertCommand;
                global $wgUseImageMagick;
@@ -254,13 +303,14 @@ class Image
                return $thumbUrl;
        } // END OF function createThumb
 
-       //**********************************************************************
-       // Return the image history of this image, line by line.
-       // starts with current version, then old versions.
-       // uses $this->historyLine to check which line to return:
-       //  0      return line for current version
-       //  1      query for old versions, return first one
-       //  2, ... return next old version from above query
+       /**
+        * Return the image history of this image, line by line.
+        * starts with current version, then old versions.
+        * uses $this->historyLine to check which line to return:
+        *  0      return line for current version
+        *  1      query for old versions, return first one
+        *  2, ... return next old version from above query
+        */
        function nextHistoryLine()
        {
                $fname = 'Image::nextHistoryLine()';
@@ -297,7 +347,9 @@ class Image
 
 function wfImageDir( $fname )
 {
-       global $wgUploadDirectory;
+       global $wgUploadDirectory, $wgHashedUploadDirectory;
+       
+       if (!$wgHashedUploadDirectory) { return $wgUploadDirectory; }
 
        $hash = md5( $fname );
        $oldumask = umask(0);
@@ -317,7 +369,9 @@ function wfImageThumbDir( $fname , $subdir='thumb')
 
 function wfImageArchiveDir( $fname , $subdir='archive')
 {
-       global $wgUploadDirectory;
+       global $wgUploadDirectory, $wgHashedUploadDirectory;
+
+       if (!$wgHashedUploadDirectory) { return $wgUploadDirectory.'/'.$subdir; }
 
        $hash = md5( $fname );
        $oldumask = umask(0);
@@ -367,17 +421,17 @@ function wfRecordUpload( $name, $oldver, $size, $desc, $copyStatus = "", $source
        # Test to see if the row exists using INSERT IGNORE
        # This avoids race conditions by locking the row until the commit, and also
        # doesn't deadlock. SELECT FOR UPDATE causes a deadlock for every race condition.
-       $dbw->insert( 'image',
+       $dbw->insertArray( 'image',
                array(
                        'img_name' => $name,
                        'img_size'=> $size,
-                       'img_timestamp' => $now,
+                       'img_timestamp' => $dbw->timestamp($now),
                        'img_description' => $desc,
                        'img_user' => $wgUser->getID(),
                        'img_user_text' => $wgUser->getName(),
                ), $fname, 'IGNORE'
        );
-       $descTitle = Title::makeTitle( NS_IMAGE, $name );
+       $descTitle = Title::makeTitleSafe( NS_IMAGE, $name );
 
        if ( $dbw->affectedRows() ) {
                # Successfully inserted, this is a new image
@@ -393,11 +447,11 @@ function wfRecordUpload( $name, $oldver, $size, $desc, $copyStatus = "", $source
                                        'cur_comment' => $desc,
                                        'cur_user' => $wgUser->getID(),
                                        'cur_user_text' => $wgUser->getName(),
-                                       'cur_timestamp' => $now,
+                                       'cur_timestamp' => $dbw->timestamp($now),
                                        'cur_is_new' => 1,
                                        'cur_text' => $textdesc,
                                        'inverse_timestamp' => $won,
-                                       'cur_touched' => $now
+                                       'cur_touched' => $dbw->timestamp($now)
                                ), $fname
                        );
                        $id = $dbw->insertId() or 0; # We should throw an error instead
@@ -419,7 +473,7 @@ function wfRecordUpload( $name, $oldver, $size, $desc, $copyStatus = "", $source
                                'oi_name' => $s->img_name,
                                'oi_archive_name' => $oldver,
                                'oi_size' => $s->img_size,
-                               'oi_timestamp' => $s->img_timestamp,
+                               'oi_timestamp' => $dbw->timestamp($s->img_timestamp),
                                'oi_description' => $s->img_description,
                                'oi_user' => $s->img_user,
                                'oi_user_text' => $s->img_user_text
@@ -430,7 +484,7 @@ function wfRecordUpload( $name, $oldver, $size, $desc, $copyStatus = "", $source
                $dbw->updateArray( 'image',
                        array( /* SET */
                                'img_size' => $size,
-                               'img_timestamp' => wfTimestampNow(),
+                               'img_timestamp' => $dbw->timestamp(),
                                'img_user' => $wgUser->getID(),
                                'img_user_text' => $wgUser->getName(),
                                'img_description' => $desc,
@@ -443,20 +497,21 @@ function wfRecordUpload( $name, $oldver, $size, $desc, $copyStatus = "", $source
                $descTitle->invalidateCache();
        }
 
-       $log = new LogPage( wfMsg( 'uploadlogpage' ), wfMsg( 'uploadlogpagetext' ) );
-       $da = wfMsg( 'uploadedimage', '[[:' . $wgLang->getNsText(
-         Namespace::getImage() ) . ":{$name}|{$name}]]" );
-       $ta = wfMsg( 'uploadedimage', $name );
-       $log->addEntry( $da, $desc, $ta );
+       $log = new LogPage( 'upload' );
+       $log->addEntry( 'upload', $descTitle, $desc );
 }
 
-function wfImageArchiveUrl( $name )
+function wfImageArchiveUrl( $name, $subdir='archive' )
 {
-       global $wgUploadPath;
+       global $wgUploadPath, $wgHashedUploadDirectory;
 
-       $hash = md5( substr( $name, 15) );
-       $url = $wgUploadPath.'/archive/' . $hash{0} . '/' .
-         substr( $hash, 0, 2 ) . '/'.$name;
+       if ($wgHashedUploadDirectory) {
+               $hash = md5( substr( $name, 15) );
+               $url = $wgUploadPath.'/'.$subdir.'/' . $hash{0} . '/' .
+                 substr( $hash, 0, 2 ) . '/'.$name;
+       } else {
+               $url = $wgUploadPath.'/'.$subdir.'/'.$name;
+       }
        return wfUrlencode($url);
 }