<?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;
}