diff options
Diffstat (limited to 'phpBB/develop/imageset_to_css.php')
| -rw-r--r-- | phpBB/develop/imageset_to_css.php | 374 | 
1 files changed, 374 insertions, 0 deletions
| diff --git a/phpBB/develop/imageset_to_css.php b/phpBB/develop/imageset_to_css.php new file mode 100644 index 0000000000..d49fe9c741 --- /dev/null +++ b/phpBB/develop/imageset_to_css.php @@ -0,0 +1,374 @@ +<?php + +/* +	Converts imageset to CSS code +	 +	Change style name and path below, open in browser. +*/ + +$phpbb_root_path = '../'; +$style = 'subsilver2'; + +$imageset_path = $phpbb_root_path . 'styles/' . $style . '/imageset'; +$theme_path = $phpbb_root_path . 'styles/' . $style . '/theme'; + +// Start output buffering +ob_start(); + +// Get global and English images +$images_global = get_imageset($imageset_path); +if ($images_global === false) +{ +	echo 'imageset.cfg was not found.'; +	echo ob_get_clean(); +	return; +} +$images_en = get_imageset($imageset_path, 'en'); +if ($images_en === false) +{ +	echo 'English imageset.cfg was not found.'; +	echo ob_get_clean(); +	return; +} + +// Remove duplicate images +foreach ($images_en as $key => $row) +{ +	unset($images_global[$key]); +} + +// CSS replacements +$not_compatible = array( +	'{T_TEMPLATE_PATH}', +	'{T_IMAGESET_PATH}', +	'{T_IMAGESET_LANG_PATH}', +	'{T_STYLESHEET_NAME}', +	'{S_USER_LANG}' +); +$replace = array( +	'{T_THEME_PATH}'	=> '.', +); +// Enable/disable one of lines below to enable/disable replacement of English buttons +// $replace = array_merge($replace, get_replacements($images_global)); +$replace = array_merge($replace, get_replacements($images_global), get_replacements($images_en)); + +// BIDI code +$bidi_code = css($images_global, './images/', true); + +// Get all CSS files, parse them +$files = list_files($theme_path, 'css'); +if ($files === false || !count($files)) +{ +	echo 'No CSS files found in theme directory.<br />'; +} +else for ($i=0; $i<count($files); $i++) +{ +	$file = $theme_path . '/' . $files[$i]; +	$data = file_get_contents($file); +	$hash = md5($data); +	$data = strtr($data, $replace); +	$errors = false; +	for($j=0; $j<count($not_compatible); $j++) +	{ +		if (strpos($data, $not_compatible[$j]) !== false) +		{ +			echo 'Error: ', $file, ' contains ', $not_compatible[$j], '. That variable cannot be converted.<br />'; +			continue; +		} +	} +	if (basename($file) == 'bidi.css' && strpos($data, '/* Former imageset */') === false && strlen($bidi_code)) +	{ +		// Add bidi data +		$data .= "\n/* Former imageset */\n" . $bidi_code; +		$bidi_code = ''; +		echo 'Note: RTL imageset entries were added at the end of file below:<br />'; +	} +	if (md5($data) == $hash) +	{ +		echo 'Nothing to replace in ', $file, '<br />'; +	} +	else +	{ +		echo 'Updated ', $file, ':', dump_code($data, $files[$i]); +	} +} + +// Check if there are invalid images in imageset +$list = array_merge($images_global, $images_en); +foreach ($list as $key => $row) +{ +	if ($row['skip']) +	{ +		echo 'Unable to generate code to add to CSS files because some images are missing or invalid. See errors above.'; +		echo ob_get_clean(); +		return; +	} +} + +// Code to add to CSS files +$code = ' +/* Former imageset */ +span.imageset { +	display: inline-block; +	background: transparent none 0 0 no-repeat; +	margin: 0; +	padding: 0; +	width: 0; +	height: 0; +	overflow: hidden; +} + +/* Global imageset items */ +' . css($images_global, './images/') . ' + +/* English images for fallback */ +' . css($images_en, './en/'); +if (strlen($bidi_code)) +{ +	$code .= "\n/* RTL imageset entries */\n" . $bidi_code; +} +echo 'Code to add to CSS file:', dump_code($code, 'imageset.css'); + + +$list = list_languages($imageset_path); +for ($i=0; $i<count($list); $i++) +{ +	$lang = $list[$i]; +	$images = get_imageset($imageset_path . '/' . $lang); +	if (!count($images)) +	{ +		continue; +	} +	$code = '/* ' . strtoupper($lang) . ' Language Pack */ +' . css($images, './'); +	echo 'New CSS file: ', $theme_path, '/', $lang, '/stylesheet.css', dump_code($code, 'stylesheet_' . $lang . '.css'); +} + +echo ob_get_clean(); +return; + + +/* +	Functions +*/ +function get_imageset($path, $lang = '') +{ +	$cfg = $path . ($lang ? '/' . $lang : '') . '/imageset.cfg'; +	if (!@file_exists($cfg)) +	{	 +		return false; +	} +	$data = file($cfg); +	$result = array(); +	for ($i=0; $i<count($data); $i++) +	{ +		$str = trim($data[$i]); +		if (substr($str, 0, 4) != 'img_')  +		{ +			continue; +		} +		$list = explode('=', $data[$i]); +		if (count($list) != 2)  +		{ +			continue; +		} +		$key = trim($list[0]); +		$row = explode('*', trim($list[1])); +		$file = trim($row[0]); +		$height = isset($row[1]) && intval($row[1]) ? intval($row[1]) : false; +		$width = isset($row[2]) && intval($row[2]) ? intval($row[2]) : false; +		$skip = false; +		if (strlen($file) && (!$width || !$height)) +		{ +			// Try to detect width/height +			$filename = $path . ($lang ? '/' . $lang : '') . '/' . $file; +			if (!@file_exists($filename)) +			{ +				echo 'Error: file ', $filename, ' does not exist and its dimensions are not available in imageset.cfg<br />'; +				$skip = true; +			} +			else +			{ +				$size = @getimagesize($filename); +				if ($size === false) +				{ +					echo 'Error: file ', $filename, ' is not a valid image<br />'; +					$skip = true; +				} +				else +				{ +					if(!$width) $width = intval($size[0]); +					if(!$height) $height = intval($size[1]); +				} +			} +		} +		$result[$key] = array( +			'lang'  => $lang, +			'file'  => $file, +			'height'	=> $height, +			'width' => $width, +			'skip'  => $skip +		); +	} +	return $result; +} + +function get_replacements($list) +{ +	$result = array(); +	foreach ($list as $key => $row) +	{ +		$key = '{' . strtoupper($key); +		$result[$key . '_SRC}'] = strlen($row['file']) ? ($row['lang'] ? './' . $row['lang'] : './images') . '/' . $row['file'] : ''; +		$result[$key . '_WIDTH}'] = intval($row['width']); +		$result[$key . '_HEIGHT}'] = intval($row['height']); +	} +	return $result; +} + +function list_files($dir, $ext) +{ +	$res = @opendir($dir); +	if ($res === false) +	{ +		return false; +	} +	$files = array(); +	while (($file = readdir($res)) !== false) +	{ +		$list = explode('.', $file); +		if(count($list) > 1 && strtolower($list[count($list) - 1]) == $ext) +		{ +			$files[] = $file; +		} +	} +	closedir($res); +	return $files; +} + +function list_languages($dir) +{ +	$res = @opendir($dir); +	if ($res === false) +	{ +		return array(); +	} +	$files = array(); +	while (($file = readdir($res)) !== false) +	{ +		if (substr($file, 0, 1) == '.') +		{ +			continue; +		} +		$filename = $dir . '/' . $file; +		if (is_dir($filename) && file_exists($filename . '/imageset.cfg')) +		{ +			$files[] = $file; +		} +	} +	closedir($res); +	return $files; +} + +function dump_code($code, $filename = 'file.txt') +{ +	$hash = md5($code); +	if (isset($_GET['download']) && $_GET['download'] === $hash) +	{ +		// Download file +		ob_end_clean(); +		header('Pragma: public'); +		header('Expires: 0'); +		header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); +		header('Content-Type: application/force-download'); +		header('Content-Disposition: attachment; filename="' . $filename . '";'); +		header('Content-Transfer-Encoding: binary'); +		header('Content-Length: ' . strlen($code)); +		echo $code; +		exit; +	} +	$list = explode("\n", $code); +	$height = 15 * count($list); +	echo ' [ <a href="?download=', $hash, '">download</a> <a href="javascript:void(0);" onclick="document.getElementById(\'code-', $hash, '\').style.height = \'', $height, 'px\'; this.style.display = \'none\'; return false;">expand</a> ]<br />'; +	echo '<textarea id="code-', $hash, '" onfocus="this.select();" style="width: 98%; height: 200px;">', htmlspecialchars($code), '</textarea><br />'; +} + +function css($list, $path = './', $bidi = false) +{ +	$code = ''; +	// Change value to true if you want images to be grouped up by size +	$group = $bidi; +	if ($group) +	{ +		// group up images by size +		$groups = array(); +		foreach ($list as $key => $row) +		{ +			if (!strlen($row['file'])) +			{ +				continue; +			} +			$groups[$row['width'] . '*' . $row['height']][] = $key; +		} +		foreach ($groups as $size => $keys) +		{ +			$extra = ''; +			for ($i=0; $i<count($keys); $i++) +			{ +				$code .= ($i == 0 ? '' : ', ') . ($bidi ? '.rtl ' : '') . '.imageset.' . substr($keys[$i], 4); +				if (!$bidi) +				{ +					$extra .= '.imageset.' . substr($keys[$i], 4) . ' { background-image: url("' . $path . $list[$keys[$i]]['file'] . "\"); }\n"; +				} +			} +			$row = $list[$keys[0]]; +			$code .= ' {'; +			if ($bidi) +			{ +				$code .= ' +	padding-right: ' . $row['width'] . 'px; +	padding-left: 0; +} +'; +			} +			else +			{ +				$code .= ' +	padding-left: ' . $row['width'] . 'px; +	padding-top: ' . $row['height'] . 'px; +} +' . $extra; +			} +		} +	} +	else +	{ +		foreach ($list as $key => $row) +		{ +			if (!strlen($row['file'])) +			{ +				continue; +			} +			$code .= ($bidi ? '.rtl ' : '') . '.imageset.' . substr($key, 4) . ' {'; +			if ($bidi) +			{ +				$code .= ' +	padding-right: ' . $row['width'] . 'px; +	padding-left: 0; +} +'; +			} +			else +			{ +				$code .= ' +	background-image: url("' . $path . $row['file'] . '"); +	padding-left: ' . $row['width'] . 'px; +	padding-top: ' . $row['height'] . 'px; +} +'; +			} +		} +	} +	return $code; +} + | 
