diff options
author | Maat <maat-pub@mageia.biz> | 2020-05-08 18:29:30 +0200 |
---|---|---|
committer | Maat <maat-pub@mageia.biz> | 2020-05-08 21:36:04 +0200 |
commit | 36bc1870f21fac04736a1049c1d5b8e127d729f4 (patch) | |
tree | 9d102331eeaf1ef3cd23e656320d7c08e65757ed /phpBB/develop/imageset_to_css.php | |
parent | 8875d385d0579b451dac4d9bda465172b4f69ee0 (diff) | |
parent | 149375253685b3a38996f63015a74b7a0f53aa14 (diff) | |
download | forums-36bc1870f21fac04736a1049c1d5b8e127d729f4.tar forums-36bc1870f21fac04736a1049c1d5b8e127d729f4.tar.gz forums-36bc1870f21fac04736a1049c1d5b8e127d729f4.tar.bz2 forums-36bc1870f21fac04736a1049c1d5b8e127d729f4.tar.xz forums-36bc1870f21fac04736a1049c1d5b8e127d729f4.zip |
Merge remote-tracking branch 'upstream/prep-release-3.1.11'
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; +} + |