/phpBB/develop/imageset_to_css.php
PHP | 374 lines | 330 code | 21 blank | 23 comment | 51 complexity | 632df64c268d7e1572a51f13ce3175a8 MD5 | raw file
Possible License(s): AGPL-1.0
- <?php
- /*
- Converts imageset to CSS code
-
- Change style name and path below, open in browser.
- */
- $phpbb_root_path = '../';
- $style = 'prosilver';
- $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;
- }