X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FExif.php;h=2b48eabb5cbc33fb1ef856e101c95411a4f7abbf;hb=8ce3c5cf23f920a0fea1c7d08fd2009716545133;hp=84d8e8d2cb2ee6b50c2ca83b413978de246b6d33;hpb=113bb1c772d2ddb70345e5027676338ad00f1c2a;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Exif.php b/includes/Exif.php index 84d8e8d2cb..2b48eabb5c 100644 --- a/includes/Exif.php +++ b/includes/Exif.php @@ -1,11 +1,5 @@ - * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason - * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License - * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -21,35 +15,38 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * http://www.gnu.org/copyleft/gpl.html * - * @link http://exif.org/Exif2-2.PDF The Exif 2.2 specification + * @ingroup Media + * @author Ævar Arnfjörð Bjarmason + * @copyright Copyright © 2005, Ævar Arnfjörð Bjarmason + * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License + * @see http://exif.org/Exif2-2.PDF The Exif 2.2 specification + * @file */ /** * @todo document (e.g. one-sentence class-overview description) - * @addtogroup Metadata + * @ingroup Media */ class Exif { + + const BYTE = 1; //!< An 8-bit (1-byte) unsigned integer. + const ASCII = 2; //!< An 8-bit byte containing one 7-bit ASCII code. The final byte is terminated with NULL. + const SHORT = 3; //!< A 16-bit (2-byte) unsigned integer. + const LONG = 4; //!< A 32-bit (4-byte) unsigned integer. + const RATIONAL = 5; //!< Two LONGs. The first LONG is the numerator and the second LONG expresses the denominator + const UNDEFINED = 7; //!< An 8-bit byte that can take any value depending on the field definition + const SLONG = 9; //!< A 32-bit (4-byte) signed integer (2's complement notation), + const SRATIONAL = 10; //!< Two SLONGs. The first SLONG is the numerator and the second SLONG is the denominator. + //@{ /* @var array * @private */ - /**#@+ - * Exif tag type definition - */ - const BYTE = 1; # An 8-bit (1-byte) unsigned integer. - const ASCII = 2; # An 8-bit byte containing one 7-bit ASCII code. The final byte is terminated with NULL. - const SHORT = 3; # A 16-bit (2-byte) unsigned integer. - const LONG = 4; # A 32-bit (4-byte) unsigned integer. - const RATIONAL = 5; # Two LONGs. The first LONG is the numerator and the second LONG expresses the denominator - const UNDEFINED = 7; # An 8-bit byte that can take any value depending on the field definition - const SLONG = 9; # A 32-bit (4-byte) signed integer (2's complement notation), - const SRATIONAL = 10; # Two SLONGs. The first SLONG is the numerator and the second SLONG is the denominator. - /** * Exif tags grouped by category, the tagname itself is the key and the type * is the value, in the case of more than one possible value type they are - * seperated by commas. + * separated by commas. */ var $mExifTags; @@ -93,9 +90,9 @@ class Exif { var $basename; /** - * The private log to log to + * The private log to log to, e.g. 'exif' */ - var $log = 'exif'; + var $log = false; //@} @@ -405,7 +402,7 @@ class Exif { * * @return int */ - function version() { + public static function version() { return 1; // We don't need no bloddy constants! } @@ -431,7 +428,7 @@ class Exif { if ( is_array( $in ) ) { return false; } - + if ( preg_match( "/[^\x0a\x20-\x7e]/", $in ) ) { $this->debug( $in, __FUNCTION__, 'found a character not in our whitelist' ); return false; @@ -557,11 +554,14 @@ class Exif { * * @private * - * @param $in Mixed: - * @param $fname String: + * @param $in Mixed: + * @param $fname String: * @param $action Mixed: , default NULL. */ - function debug( $in, $fname, $action = NULL ) { + function debug( $in, $fname, $action = null ) { + if ( !$this->log ) { + return; + } $type = gettype( $in ); $class = ucfirst( __CLASS__ ); if ( $type === 'array' ) @@ -586,6 +586,9 @@ class Exif { * @param $io Boolean: Specify whether we're beginning or ending */ function debugFile( $fname, $io ) { + if ( !$this->log ) { + return; + } $class = ucfirst( __CLASS__ ); if ( $io ) { wfDebugLog( $this->log, "$class::$fname: begin processing: '{$this->basename}'\n" ); @@ -598,7 +601,7 @@ class Exif { /** * @todo document (e.g. one-sentence class-overview description) - * @addtogroup Metadata + * @ingroup Media */ class FormatExif { /** @@ -731,7 +734,7 @@ class FormatExif { case 'DateTimeDigitized': if( $val == '0000:00:00 00:00:00' ) { $tags[$tag] = wfMsg('exif-unknowndate'); - } elseif( preg_match( '/^(\d{4}):(\d\d):(\d\d) (\d\d):(\d\d):(\d\d)$/', $val ) ) { + } elseif( preg_match( '/^(?:\d{4}):(?:\d\d):(?:\d\d) (?:\d\d):(?:\d\d):(?:\d\d)$/', $val ) ) { $tags[$tag] = $wgLang->timeanddate( wfTimestamp(TS_MW, $val) ); } break; @@ -775,7 +778,28 @@ class FormatExif { } break; - // TODO: Flash + case 'Flash': + $flashDecode = array( + 'fired' => $val & bindec( '00000001' ), + 'return' => ($val & bindec( '00000110' )) >> 1, + 'mode' => ($val & bindec( '00011000' )) >> 3, + 'function' => ($val & bindec( '00100000' )) >> 5, + 'redeye' => ($val & bindec( '01000000' )) >> 6, +// 'reserved' => ($val & bindec( '10000000' )) >> 7, + ); + + # We do not need to handle unknown values since all are used. + foreach( $flashDecode as $subTag => $subValue ) { + # We do not need any message for zeroed values. + if( $subTag != 'fired' && $subValue == 0) { + continue; + } + $fullTag = $tag . '-' . $subTag ; + $flashMsgs[] = $this->msg( $fullTag, $subValue ); + } + $tags[$tag] = $wgLang->commaList( $flashMsgs ); + break; + case 'FocalPlaneResolutionUnit': switch( $val ) { case 2: @@ -1019,6 +1043,14 @@ class FormatExif { $this->formatNum( $val ) ); break; + // Do not transform fields with pure text. + // For some languages the formatNum() conversion results to wrong output like + // foo,bar@example,com or foo٫bar@example٫com + case 'ImageDescription': + case 'Artist': + case 'Copyright': + $tags[$tag] = htmlspecialchars( $val ); + break; default: $tags[$tag] = $this->formatNum( $val ); break; @@ -1056,11 +1088,13 @@ class FormatExif { * @return mixed A floating point number or whatever we were fed */ function formatNum( $num ) { + global $wgLang; + $m = array(); if ( preg_match( '/^(\d+)\/(\d+)$/', $num, $m ) ) - return $m[2] != 0 ? $m[1] / $m[2] : $num; + return $wgLang->formatNum( $m[2] != 0 ? $m[1] / $m[2] : $num ); else - return $num; + return $wgLang->formatNum( $num ); } /** @@ -1079,7 +1113,7 @@ class FormatExif { $gcd = $this->gcd( $numerator, $denominator ); if( $gcd != 0 ) { // 0 shouldn't happen! ;) - return $numerator / $gcd . '/' . $denominator / $gcd; + return $this->formatNum( $numerator / $gcd ) . '/' . $this->formatNum( $denominator / $gcd ); } } return $this->formatNum( $num ); @@ -1112,17 +1146,3 @@ class FormatExif { return $a; } } - -/** - * MW 1.6 compatibility - */ -define( 'MW_EXIF_BYTE', Exif::BYTE ); -define( 'MW_EXIF_ASCII', Exif::ASCII ); -define( 'MW_EXIF_SHORT', Exif::SHORT ); -define( 'MW_EXIF_LONG', Exif::LONG ); -define( 'MW_EXIF_RATIONAL', Exif::RATIONAL ); -define( 'MW_EXIF_UNDEFINED', Exif::UNDEFINED ); -define( 'MW_EXIF_SLONG', Exif::SLONG ); -define( 'MW_EXIF_SRATIONAL', Exif::SRATIONAL ); - -?>