All pastes #986500 Raw Edit

Stuff

public php v1 · immutable
·published 2008-04-15 21:01 UTC
rendered paste body
	function zem_ir_set($atts) {		global $zem_ir_set;		$group = (empty($atts['group']) ? 'default' : $atts['group']);		$orig = (isset($zem_ir_set[$group]) ? $zem_ir_set[$group] : array());		$zem_ir_set[$group] = array_merge($orig, $atts);		return '';	}	function zem_ir_get_atts($atts) {		global $pfr, $txpcfg, $img_dir;		$group = (empty($atts['group']) ? 'default' : $atts['group']);		$wraptag = (empty($atts["wraptag"]) ? "h1" : $atts["wraptag"]);		$position = (empty($atts["position"]) ? "top left" : $atts["position"]);		$limit = (empty($atts["limit"]) ? 0 : $atts["limit"]);		$class = (empty($atts["class"]) ? "" : $atts["class"]);		$font = (empty($atts["font"]) ? "" : $atts["font"]);		$font_dir = (empty($atts["fontdir"]) ? dirname($txpcfg["doc_root"]) : $atts["fontdir"]);		$font_size = (empty($atts["fontsize"]) ? 24 : (int)$atts["fontsize"]);		$angle = (empty($atts["angle"]) ? 0 : $atts["angle"]);		$color = (empty($atts["color"]) ? "#000000" : $atts["color"]);		$backgroundcolor = (empty($atts["backgroundcolor"]) ? "#ffffff" : $atts["backgroundcolor"]);		$cachedir = (empty($atts["cachedir"]) ? "$img_dir/zir" : $atts["cachedir"]);		$ft = (isset($atts["ft"]) ? $atts["ft"] : 0);		$aa = (isset($atts["aa"]) ? $atts["aa"] : 1);		$info = (isset($atts["info"]) ? $atts["info"] : 0);		$trans = (isset($atts["trans"]) ? $atts["trans"] : 1);		$cache = (isset($atts["cache"]) ? $atts["cache"] : 1);		$depth = (empty($atts["depth"]) ? 8 : $atts["depth"]);		$method = (empty($atts["method"]) ? "phark" : $atts["method"]);		$align = (empty($atts["align"]) ? "left" : $atts["align"]);		$padding = (empty($atts["padding"]) ? "0" : $atts["padding"]);		$text = (empty($atts['text']) ? '' : $atts['text']);		$wrap = (empty($atts['wrap']) ? 0 : $atts['wrap']);		$tr = (empty($atts['tr']) ? '' : $atts['tr']);		$tt = (empty($atts['tt']) ? ' ' : $atts['tt']);		$charset = (empty($atts['charset']) ? 'ISO-8859-15' : $atts['charset']);		$transform = (empty($atts['transform']) ? '' : $atts['transform']);		$pad = preg_split('/\s+/', trim($padding));		if (count($pad) != 4)			$pad = array_fill(0, 4, $pad[0]);		if (substr($font_dir, -1, 1) != DIRECTORY_SEPARATOR) $font_dir .= DIRECTORY_SEPARATOR;		$font_file = $font_dir . $font;		$cache_folder = $txpcfg["doc_root"].$pfr.$cachedir;		return compact('wraptag', 'position', 'limit', 'class', 'font', 'font_dir', 'font_size', 'angle', 'color', 'backgroundcolor', 'cachedir', 'ft', 'aa', 'info', 'trans', 'cache', 'depth', 'method', 'align', 'padding', 'text', 'wrap', 'tr', 'charset', 'transform', 'pad', 'font_file', 'cache_folder');	}	function zem_image_replace($atts, $thing) {		return zem_ir($atts, $thing);	}	function zem_ir($atts, $thing=NULL) {		global $pfr, $zem_ir_set, $txpcfg;		# Merge any settings configured by zem_ir_set with the attributes for this tag		$group = (empty($atts['group']) ? 'default' : $atts['group']);		$defaults = (isset($zem_ir_set[$group]) ? $zem_ir_set[$group] : array());		$settings = zem_ir_get_atts(array_merge($defaults, $atts));		extract($settings);		$content = $text;		if ($thing) {			$content = parse($thing);			$text = trim(html_entity_decode(strip_tags($content), ENT_NOQUOTES, $charset));			if ($limit)				$text = substr($text, 0, $limit);		}		if ($tr) {			$tr = html_entity_decode($tr, ENT_NOQUOTES, $charset);			$tt = substr(html_entity_decode($tt, ENT_NOQUOTES, $charset), 0, 1);			$text = strtr($text, $tr, str_repeat($tt, strlen($tr)));		}		if ($transform == 'capitalize')			$text = ucwords($text);		elseif ($transform == 'lowercase')			$text = strtolower($text);		elseif ($transform == 'uppercase')			$text = strtoupper($text);		if ($info) {			ob_start();			echo "<pre>";			var_dump(compact("text", "font_file", "font_size", "angle", "color", "backgroundcolor", "cache_folder", "aa", "trans", "depth", "ft", "cache", "method", "align", "pad"));			echo "doc_root setting ".$txpcfg['doc_root']." ". ($txpcfg['doc_root'] == $_SERVER['DOCUMENT_ROOT'] ? "does" : "<b>does not</b>"). " match the server setting '".$_SERVER['DOCUMENT_ROOT']."'\n";			echo "cache folder $cache_folder " . (is_dir($cache_folder) ? "is" : "is <b>not</b>") . " a directory\n";			echo "cache folder $cache_folder " . (is_writable($cache_folder) ? "is" : "is <b>not</b>") . " writable\n";			echo "font file $font_file " . (is_file($font_file) ? "is" : "is <b>not</b>") . " a file\n";			echo "font file $font_file " . (is_readable($font_file) ? "is" : "is <b>not</b>") . " readable\n";			echo "freetype 2 " . (is_callable("imagefttext") ? "is" : "is <b>not</b>") . " supported\n";			echo "freetype 1 " . (is_callable("imagettfbbox") ? "is" : "is <b>not</b>") . " supported\n";			echo "</pre>";			return ob_get_clean();		}		// Skip the image routines if there's no text to display		if (!trim($text))			return tag($wraptag, $content);		$old_umask = umask(0000);		$result = dynamic_image($text, $settings);		umask($old_umask);		if ($result[0]) {			return $result[1];		}		list($error, $data, $w, $h) = $result;		$url = $pfr . $cachedir . "/" . $data;		$height = (empty($atts["height"]) ? $h : $atts["height"]);		$width = (empty($atts["width"]) ? $w : $atts["width"]);		$title = " title=\"{$text}\"";		if ($class) {			$style = " style=\"background: url($url) no-repeat {$position};\"";			$class = " class=\"$class\"";		}		elseif ($method == "radu") {			$style = " style=\"margin: 0 0 0 -5000px; background: url($url) no-repeat top right; height: {$height}px;\"";		}		elseif ($method == "lir") {			$style = " style=\"padding: {$height}px 0 0 0; overflow: hidden; background: url($url) no-repeat {$position}; height: 0px !important; height /**/: {$height}px;\"";		}		elseif ($method == "dwyer") {			$style = " style=\"background: url($url) no-repeat {$position}; height: {$height}px; width: {$width}px;\"";			$spanstyle = " style=\"display: block; width: 0; height: 0; overflow: hidden;\"";			$content = tag($content, "span", $spanstyle);		}		elseif ($method == "img") {			$wraptag = "img";			$style = " src=\"{$url}\" alt=\"{$text}\"";		}		else {			// Default: Phark Revisited			$style = " style=\"text-indent: -5000px; background: url($url) no-repeat {$position}; height: {$height}px;\"";		}		return tag($content, $wraptag, $class.$style.$title);	}# The following code is taken from Stewart Rosenberger's header.php, with modifications to allow text rotation and FT support# http://www.stewartspeak.com/headings/function dynamic_image($content, $settings) {extract($settings);$text = $content;$transparent_background  = $trans ;$mime_type = "image/png" ;$extension = ".png" ;$send_buffer_size = 4096 ;// check for GD supportif(!function_exists("ImageCreate"))    return array(1, "Error: Server does not support PHP image generation");// look for cached copy, send if it exists$hash = md5(join('-', array(basename($font_file), $font_size , $color , $angle , $aa, $ft , $depth , $backgroundcolor , $trans, $padding , $wrap, $text)));$cache_filename = $cache_folder . DIRECTORY_SEPARATOR . $hash . $extension ;if($cache && is_readable($cache_filename)){	list($w, $h) = getimagesize($cache_filename);	return array(0, $hash.$extension, $w, $h);}// check font availability$font_found = is_readable($font_file) ;if(!$font_found){    return array(1, "Error: The server is missing the specified font '$font_file'.") ;}// create cache dir if necessaryif (!is_dir($cache_folder)) {	mkdir($cache_folder, 0777);	if (!is_dir($cache_folder)) {		return array(1, "Error: unable to create cache folder '$cache_folder'.") ;	}}if (!is_writable($cache_folder)) {		return array(1, "Error: unable to write to cache folder '$cache_folder'.") ;}// create image$background_rgb = hex_to_rgb($backgroundcolor) ;$font_rgb = hex_to_rgb($color) ;if ($ft and is_callable('imageftbbox'))	$boxfn = 'imageftbbox';else	$boxfn = 'imagettfbbox';if ($wrap) {	# Word wrapping is measured in characters, not pixels.  We have to guess the number of characters	# that will fit in the specified pixel width, then gradually reduce our guess until the text fits.	$wrapstart = max($wrap/4, 80);	for ($i = $wrapstart; $i >= 6; $i--) {		$box = @$boxfn($font_size, 0, $font_file, wordwrap($text, $i, "\n", 1));		$wrap_w = max($box[0], $box[2], $box[4], $box[6]) - min($box[0], $box[2], $box[4], $box[6]);		if ($wrap_w <= $wrap) {			$text = wordwrap($text, $i, "\n", 1);			break;		}	}}else {		$box = @$boxfn($font_size,0,$font_file,$text) ;}@list($w, $h, $base_x, $base_y) = imagerotatedbbox($box, $angle, $pad);if (isset($w, $h, $base_x, $base_y)) {	if ($depth == 24 and is_callable("imagecreatetruecolor"))		$image = @ImageCreateTrueColor($w, $h);	else		$image = @ImageCreate($w,$h) ;}if(!$image || !$box){    return array(1, "Error: The server could not create this heading image.") ;}// allocate colors and draw text$background_color = ImageColorAllocate($image,$background_rgb["red"],    $background_rgb["green"],$background_rgb["blue"]) ;$font_color = ImageColorAllocate($image,$font_rgb["red"],    $font_rgb["green"],$font_rgb["blue"]) ;// have to explicitly draw the background color for 24-bitimageFilledRectangle($image, 0, 0, $w, $h, $background_color);if ($ft and is_callable("imagefttext")) {	if (!$aa)		$font_color = -$font_color;	imagefttext($image, $font_size, $angle, $base_x, $base_y,    $font_color, $font_file, $text) ;}else {	ImageTTFText($image, $font_size, $angle, $base_x, $base_y,    $font_color, $font_file, $text) ;}// set transparencyif($transparent_background)    ImageColorTransparent($image,$background_color) ;// save copy of image for cache ImagePNG($image,$cache_filename) ;ImageDestroy($image) ;return array(0, $hash.$extension, $w, $h);}/*    decode an HTML hex-code into an array of R,G, and B values.    accepts these formats: (case insensitive) #ffffff, ffffff, #fff, fff*/function hex_to_rgb($hex){    // remove "#"    if(substr($hex,0,1) == "#")        $hex = substr($hex,1) ;    // expand short form ("fff") color    if(strlen($hex) == 3)    {        $hex = substr($hex,0,1) . substr($hex,0,1) .               substr($hex,1,1) . substr($hex,1,1) .               substr($hex,2,1) . substr($hex,2,1) ;    }    if(strlen($hex) != 6)        print("Error: Invalid color \"$hex\"") ;    // convert    $rgb["red"] = hexdec(substr($hex,0,2)) ;    $rgb["green"] = hexdec(substr($hex,2,2)) ;    $rgb["blue"] = hexdec(substr($hex,4,2)) ;    return $rgb ;}// Determine the text bounding box after rotation is appliedfunction imagerotatedbbox($bbox, $angle=0, $pad=0) {	if (count($bbox) != 8)		return;	if (empty($pad))		$pad = array(0,0,0,0);	$a = $angle * M_PI / 180;	$cosa = cos($a);	$sina = sin($a);	$result = array();	# baseline and total width/height of text when horizontal	$base_x = abs($bbox[6]);	$base_y = abs($bbox[7]);	$old_w = max($bbox[0], $bbox[2], $bbox[4], $bbox[6]) - min($bbox[0], $bbox[2], $bbox[4], $bbox[6]);	$old_h = max($bbox[1], $bbox[3], $bbox[5], $bbox[7]) - min($bbox[1], $bbox[3], $bbox[5], $bbox[7]);	// rotate the box coordinates to get the new width & height of the final image	for ($i = 0; $i < 7; $i += 2) {		$result[$i] = round($bbox[$i] * $cosa + $bbox[$i+1] * $sina);		$result[$i+1] = round($bbox[$i+1] * $cosa - $bbox[$i] * $sina);	}	$w = max($result[0], $result[2], $result[4], $result[6]) - min($result[0], $result[2], $result[4], $result[6]);	$h = max($result[1], $result[3], $result[5], $result[7]) - min($result[1], $result[3], $result[5], $result[7]);	$pad_w = $w + ($pad[3] + $pad[1]);	$pad_h = $h + ($pad[0] + $pad[2]);	// center of bounding box (xc,yc);	$xc = $old_w/2.0;	$yc = $old_h/2.0;	// center of image	$px = $w/2.0;	$py = $h/2.0;	// baseline coordinates relative to the center	$x1 = $base_x - $xc;	$y1 = $base_y - $yc;	// baseline after rotation	$x2= intval( $x1*$cosa+$y1*$sina+$px+0.5);	$y2= intval(-$x1*$sina+$y1*$cosa+$py+0.5);	return array($pad_w, $pad_h, $x2 + $pad[3], $y2 + $pad[0]);}