| 
<?php/*
 * KOIVI PNG Alpha IMG Tag Replacer for PHP (C) 2004-2005 Justin Koivisto
 * Version 2.0.6
 * Last Modified: 2/25/2005
 *
 *   This library is free software; you can redistribute it and/or modify it
 *   under the terms of the GNU Lesser General Public License as published by
 *   the Free Software Foundation; either version 2.1 of the License, or (at
 *   your option) any later version.
 *
 *   This library is distributed in the hope that it will be useful, but
 *   WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 *   or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
 *   License for more details.
 *
 *   You should have received a copy of the GNU Lesser General Public License
 *   along with this library; if not, write to the Free Software Foundation,
 *   Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 *
 *   Full license agreement notice can be found in the LICENSE file contained
 *   within this distribution package.
 *
 *   Justin Koivisto
 *   [email protected]
 *   http://www.koivi.com
 *
 *   Modifies IMG and INPUT tags for MSIE5+ browsers to ensure that PNG-24
 *   transparencies are displayed correctly.  Replaces original SRC attribute
 *   with a transparent GIF file (spacer.png) that is located in the same
 *   directory as the orignal image, and adds the STYLE attribute needed to for
 *   the browser. (Matching is case-insensitive. However, the width attribute
 *   should come before height.
 *
 *   Also replaces code for PNG images specified as backgrounds via:
 *   background-image: url(image.png); or background-image: url('image.png');
 *   When using PNG images in the background, there is no need to use a spacer.png
 *   image. (Only supports inline CSS at this point.)
 *
 *   @param  $x  String containing the content to search and replace in.
 *   @param  $img_path   The path to the directory with the spacer image relative to
 *                       the DOCUMENT_ROOT. If none os supplied, the spacer.png image
 *                       should be in the same directory as PNG-24 image.
 *   @param  $sizeMeth   String containing the sizingMethod to be used in the
 *                       Microsoft.AlphaImageLoader call. Possible values are:
 *                       crop - Clips the image to fit the dimensions of the object.
 *                       image - Enlarges or reduces the border of the object to fit
 *                               the dimensions of the image.
 *                       scale - Default. Stretches or shrinks the image to fill the borders
 *                               of the object.
 *   @result Returns the modified string.
 */
 function replacePngTags($x,$img_path='',$sizeMeth='scale',$escapequotes=false){
 $quotechar = $escapequotes ? '\"' : '"';
 $arr2=array();
 // make sure that we are only replacing for the Windows versions of Internet
 // Explorer 5+
 $msie='/msie\s(5\.[5-9]|[6-9]\.[0-9]*).*(win)/i';
 if( !isset($_SERVER['HTTP_USER_AGENT']) ||
 !preg_match($msie,$_SERVER['HTTP_USER_AGENT']) ||
 preg_match('/opera/i',$_SERVER['HTTP_USER_AGENT']))
 return $x;
 
 // find all the png images in backgrounds
 preg_match_all('/background-image:\s*url\((\'?)([^\)]+\.png)\1\);/Uis',$x,$background);
 for($i=0;$i<count($background[0]);$i++){
 // simply replace:
 //  "background-image: url('image.png');"
 // with:
 //  "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(
 //      enabled=true, sizingMethod=scale src='image.png');"
 // I don't think that the background-repeat styles will work with this...
 $x=str_replace($background[0][$i],'filter:progid:DXImageTransform.'.
 'Microsoft.AlphaImageLoader(enabled=true, sizingMethod='.$sizeMeth.
 ' src=\''.$background[2][$i].'\');',$x);
 }
 
 // find all the IMG tags with ".png" in them
 $pattern='/<(input|img)[^>]*src=(\\\'|\\")([^>]*\.png)\2[^>]*>/i';
 preg_match_all($pattern,$x,$images);
 for($num_images=0;$num_images<count($images[0]);$num_images++){
 // for each found image pattern
 $original=$images[0][$num_images];
 $quote=$images[2][$num_images];
 $atts=''; $width=0; $height=0; $modified=$original;
 
 // We do this so that we can put our spacer.png image in the same
 // directory as the image - if a path wasn't passed to the function
 if(empty($img_path)){
 $tmp=split('[\\/]',$images[3][$num_images]);
 $this_img=array_pop($tmp);
 $img_path=join('/',$tmp);
 if(empty($img_path)){
 // this was a relative URI, image should be in this directory
 $tmp=split('[\\/]',$_SERVER['SCRIPT_NAME']);
 array_pop($tmp);    // trash the script name, we only want the directory name
 $img_path=join('/',$tmp).'/';
 }else{
 $img_path.='/';
 }
 }else if(substr($img_path,-1)!='/'){
 // in case the supplied path didn't end with a /
 $img_path.='/';
 }
 
 // this is a really ugly hack -- if the image class is _no_transparency, that indicates
 // that we shouldn't try to apply the IE alpha transparency fix to the image
 if (strpos($images[0][$num_images],'class="_no_transparency"')!==false) continue;
 
 // If the size is defined by styles, find them
 preg_match_all(
 '/style=(\\\'|\\").*(\s?width:\s?([0-9]+(px|%));).*'.
 '(\s?height:\s?([0-9]+(px|%));).*\\1/Ui',
 $images[0][$num_images],$arr2);
 if(is_array($arr2) && count($arr2[0])){
 // size was defined by styles, get values
 $width=$arr2[3][0];
 $height=$arr2[6][0];
 
 // remove the width and height from the style
 $stripper=str_replace(' ','\s','/('.$arr2[2][0].'|'.$arr2[5][0].')/');
 // Also remove any empty style tags
 $modified=preg_replace(
 '`style='.$arr2[1][0].$arr2[1][0].'`i',
 '',
 preg_replace($stripper,'',$modified));
 }else{
 // size was not defined by styles, get values from attributes
 preg_match_all('/width=(\\\'|\\")?([0-9%]+)\\1?/i',$images[0][$num_images],$arr2);
 if(is_array($arr2) && count($arr2[0])){
 $width=$arr2[2][0];
 if(is_numeric($width))
 $width.='px';
 
 // remove width from the tag
 $modified=str_replace($arr2[0][0],'',$modified);
 }
 preg_match_all('/height=(\\\'|\\")?([0-9%]+)\\1?/i',$images[0][$num_images],$arr2);
 if(is_array($arr2) && count($arr2[0])){
 $height=$arr2[2][0];
 if(is_numeric($height))
 $height.='px';
 
 // remove height from the tag
 $modified=str_replace($arr2[0][0],'',$modified);
 }
 }
 
 if($width==0 || $height==0){
 // width and height not defined in HTML attributes or css style
 
 $imagename = $images[3][$num_images];
 if (substr($imagename,0,strlen(ADMIN_URI))==ADMIN_URI) {
 $imagename = ADMIN_PATH.substr($imagename,strlen(ADMIN_URI));
 } else {
 $imagename = $_SERVER['DOCUMENT_ROOT'].$imagename;
 }
 
 if ($GLOBALS['_pngtrans_sizecache'][$imagename]) {
 $size = $GLOBALS['_pngtrans_sizecache'][$imagename];
 $width=$size[0].'px';
 $height=$size[1].'px';
 } else {
 if(file_exists($imagename)){
 // image is on this filesystem, get width & height
 $size = getimagesize($imagename);
 $width = $size[0].'px';
 $height = $size[1].'px';
 
 $GLOBALS['_pngtrans_sizecache'][$imagename] = array($size[0],$size[1]);
 } else {
 // can't figure out the width/height, so disable alpha transparency for this image
 continue;
 }
 }
 }
 
 // end quote is already supplied by originial src attribute
 $replace_src_with=$quote.$img_path.'spacer.png'.$quote.' style='.$quotechar.'width: '.$width.
 '; height: '.$height.'; filter: progid:DXImageTransform.'.
 'Microsoft.AlphaImageLoader(src=\''.$images[3][$num_images].'\', sizingMethod='.
 $sizeMeth.');'.$quotechar;
 
 // now create the new tag from the old
 $new_tag=str_replace($quote.$images[3][$num_images].$quote,$replace_src_with,
 str_replace('  ',' ',$modified));
 // now place the new tag into the content
 $x=str_replace($original,$new_tag,$x);
 }
 return $x;
 }
 
 function replacePngTagsQuoted($x,$img_path='',$sizeMeth='scale') {
 return replacePngTags($x,$img_path,$sizeMeth,true);
 }
 
 function dt_register_pngtransparency(&$tpl) {
 $tpl->filters['pngtransparency'] = 'replacePngTags';
 
 return true;
 }
 ?>
 |