1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-05-04 06:39:14 +02:00
php-phpbb/phpBB/develop/imageset_to_css.php
Vjacheslav Trushkin 7295e5824a [ticket/10380] BIDI support for imageset
BIDI support for imageset conversion script, added RTL imageset entries to prosilver and subsilver2, fixed small bug in imageset.css, changed spacing in code to match phpbb coding guidelines

PHPBB3-10380
2012-01-16 14:35:29 +02:00

375 lines
8.4 KiB
PHP

<?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 . '/theme2';
// 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;
}