Merge branch 'ticket/10380' into develop

* ticket/10380:
  [ticket/10380] BIDI support for imageset
This commit is contained in:
Igor Wiedler 2012-02-17 14:04:13 +01:00
commit 5e0b4e63d0
4 changed files with 199 additions and 32 deletions

View file

@ -17,14 +17,14 @@ ob_start();
// Get global and English images // Get global and English images
$images_global = get_imageset($imageset_path); $images_global = get_imageset($imageset_path);
if($images_global === false) if ($images_global === false)
{ {
echo 'imageset.cfg was not found.'; echo 'imageset.cfg was not found.';
echo ob_get_clean(); echo ob_get_clean();
return; return;
} }
$images_en = get_imageset($imageset_path, 'en'); $images_en = get_imageset($imageset_path, 'en');
if($images_en === false) if ($images_en === false)
{ {
echo 'English imageset.cfg was not found.'; echo 'English imageset.cfg was not found.';
echo ob_get_clean(); echo ob_get_clean();
@ -32,7 +32,7 @@ if($images_en === false)
} }
// Remove duplicate images // Remove duplicate images
foreach($images_en as $key => $row) foreach ($images_en as $key => $row)
{ {
unset($images_global[$key]); unset($images_global[$key]);
} }
@ -52,13 +52,16 @@ $replace = array(
// $replace = array_merge($replace, get_replacements($images_global)); // $replace = array_merge($replace, get_replacements($images_global));
$replace = array_merge($replace, get_replacements($images_global), get_replacements($images_en)); $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 // Get all CSS files, parse them
$files = list_files($theme_path, 'css'); $files = list_files($theme_path, 'css');
if($files === false || !count($files)) if ($files === false || !count($files))
{ {
echo 'No CSS files found in theme directory.<br />'; echo 'No CSS files found in theme directory.<br />';
} }
else for($i=0; $i<count($files); $i++) else for ($i=0; $i<count($files); $i++)
{ {
$file = $theme_path . '/' . $files[$i]; $file = $theme_path . '/' . $files[$i];
$data = file_get_contents($file); $data = file_get_contents($file);
@ -67,12 +70,20 @@ else for($i=0; $i<count($files); $i++)
$errors = false; $errors = false;
for($j=0; $j<count($not_compatible); $j++) for($j=0; $j<count($not_compatible); $j++)
{ {
if(strpos($data, $not_compatible[$j]) !== false) if (strpos($data, $not_compatible[$j]) !== false)
{ {
echo 'Error: ', $file, ' contains ', $not_compatible[$j], '. That variable cannot be converted.<br />'; echo 'Error: ', $file, ' contains ', $not_compatible[$j], '. That variable cannot be converted.<br />';
continue;
} }
} }
if(md5($data) == $hash) 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 />'; echo 'Nothing to replace in ', $file, '<br />';
} }
@ -84,9 +95,9 @@ else for($i=0; $i<count($files); $i++)
// Check if there are invalid images in imageset // Check if there are invalid images in imageset
$list = array_merge($images_global, $images_en); $list = array_merge($images_global, $images_en);
foreach($list as $key => $row) foreach ($list as $key => $row)
{ {
if($row['skip']) if ($row['skip'])
{ {
echo 'Unable to generate code to add to CSS files because some images are missing or invalid. See errors above.'; echo 'Unable to generate code to add to CSS files because some images are missing or invalid. See errors above.';
echo ob_get_clean(); echo ob_get_clean();
@ -112,14 +123,22 @@ span.imageset {
/* English images for fallback */ /* English images for fallback */
' . css($images_en, './en/'); ' . 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'); echo 'Code to add to CSS file:', dump_code($code, 'imageset.css');
$list = list_languages($imageset_path); $list = list_languages($imageset_path);
for($i=0; $i<count($list); $i++) for ($i=0; $i<count($list); $i++)
{ {
$lang = $list[$i]; $lang = $list[$i];
$images = get_imageset($imageset_path . '/' . $lang); $images = get_imageset($imageset_path . '/' . $lang);
if(!count($images)) continue; if (!count($images))
{
continue;
}
$code = '/* ' . strtoupper($lang) . ' Language Pack */ $code = '/* ' . strtoupper($lang) . ' Language Pack */
' . css($images, './'); ' . css($images, './');
echo 'New CSS file: ', $theme_path, '/', $lang, '/stylesheet.css', dump_code($code, 'stylesheet_' . $lang . '.css'); echo 'New CSS file: ', $theme_path, '/', $lang, '/stylesheet.css', dump_code($code, 'stylesheet_' . $lang . '.css');
@ -135,26 +154,35 @@ return;
function get_imageset($path, $lang = '') function get_imageset($path, $lang = '')
{ {
$cfg = $path . ($lang ? '/' . $lang : '') . '/imageset.cfg'; $cfg = $path . ($lang ? '/' . $lang : '') . '/imageset.cfg';
if(!@file_exists($cfg)) return false; if (!@file_exists($cfg))
{
return false;
}
$data = file($cfg); $data = file($cfg);
$result = array(); $result = array();
for($i=0; $i<count($data); $i++) for ($i=0; $i<count($data); $i++)
{ {
$str = trim($data[$i]); $str = trim($data[$i]);
if(substr($str, 0, 4) != 'img_') continue; if (substr($str, 0, 4) != 'img_')
{
continue;
}
$list = explode('=', $data[$i]); $list = explode('=', $data[$i]);
if(count($list) != 2) continue; if (count($list) != 2)
{
continue;
}
$key = trim($list[0]); $key = trim($list[0]);
$row = explode('*', trim($list[1])); $row = explode('*', trim($list[1]));
$file = trim($row[0]); $file = trim($row[0]);
$height = isset($row[1]) && intval($row[1]) ? intval($row[1]) : false; $height = isset($row[1]) && intval($row[1]) ? intval($row[1]) : false;
$width = isset($row[2]) && intval($row[2]) ? intval($row[2]) : false; $width = isset($row[2]) && intval($row[2]) ? intval($row[2]) : false;
$skip = false; $skip = false;
if(strlen($file) && (!$width || !$height)) if (strlen($file) && (!$width || !$height))
{ {
// Try to detect width/height // Try to detect width/height
$filename = $path . ($lang ? '/' . $lang : '') . '/' . $file; $filename = $path . ($lang ? '/' . $lang : '') . '/' . $file;
if(!@file_exists($filename)) if (!@file_exists($filename))
{ {
echo 'Error: file ', $filename, ' does not exist and its dimensions are not available in imageset.cfg<br />'; echo 'Error: file ', $filename, ' does not exist and its dimensions are not available in imageset.cfg<br />';
$skip = true; $skip = true;
@ -162,7 +190,7 @@ function get_imageset($path, $lang = '')
else else
{ {
$size = @getimagesize($filename); $size = @getimagesize($filename);
if($size === false) if ($size === false)
{ {
echo 'Error: file ', $filename, ' is not a valid image<br />'; echo 'Error: file ', $filename, ' is not a valid image<br />';
$skip = true; $skip = true;
@ -188,7 +216,7 @@ function get_imageset($path, $lang = '')
function get_replacements($list) function get_replacements($list)
{ {
$result = array(); $result = array();
foreach($list as $key => $row) foreach ($list as $key => $row)
{ {
$key = '{' . strtoupper($key); $key = '{' . strtoupper($key);
$result[$key . '_SRC}'] = strlen($row['file']) ? ($row['lang'] ? './' . $row['lang'] : './images') . '/' . $row['file'] : ''; $result[$key . '_SRC}'] = strlen($row['file']) ? ($row['lang'] ? './' . $row['lang'] : './images') . '/' . $row['file'] : '';
@ -201,9 +229,12 @@ function get_replacements($list)
function list_files($dir, $ext) function list_files($dir, $ext)
{ {
$res = @opendir($dir); $res = @opendir($dir);
if($res === false) return false; if ($res === false)
{
return false;
}
$files = array(); $files = array();
while(($file = readdir($res)) !== false) while (($file = readdir($res)) !== false)
{ {
$list = explode('.', $file); $list = explode('.', $file);
if(count($list) > 1 && strtolower($list[count($list) - 1]) == $ext) if(count($list) > 1 && strtolower($list[count($list) - 1]) == $ext)
@ -218,13 +249,19 @@ function list_files($dir, $ext)
function list_languages($dir) function list_languages($dir)
{ {
$res = @opendir($dir); $res = @opendir($dir);
if($res === false) return array(); if ($res === false)
$files = array();
while(($file = readdir($res)) !== false)
{ {
if(substr($file, 0, 1) == '.') continue; return array();
}
$files = array();
while (($file = readdir($res)) !== false)
{
if (substr($file, 0, 1) == '.')
{
continue;
}
$filename = $dir . '/' . $file; $filename = $dir . '/' . $file;
if(is_dir($filename) && file_exists($filename . '/imageset.cfg')) if (is_dir($filename) && file_exists($filename . '/imageset.cfg'))
{ {
$files[] = $file; $files[] = $file;
} }
@ -236,7 +273,7 @@ function list_languages($dir)
function dump_code($code, $filename = 'file.txt') function dump_code($code, $filename = 'file.txt')
{ {
$hash = md5($code); $hash = md5($code);
if(isset($_GET['download']) && $_GET['download'] === $hash) if (isset($_GET['download']) && $_GET['download'] === $hash)
{ {
// Download file // Download file
ob_end_clean(); ob_end_clean();
@ -256,18 +293,81 @@ function dump_code($code, $filename = 'file.txt')
echo '<textarea id="code-', $hash, '" onfocus="this.select();" style="width: 98%; height: 200px;">', htmlspecialchars($code), '</textarea><br />'; echo '<textarea id="code-', $hash, '" onfocus="this.select();" style="width: 98%; height: 200px;">', htmlspecialchars($code), '</textarea><br />';
} }
function css($list, $path = './') function css($list, $path = './', $bidi = false)
{ {
$code = ''; $code = '';
foreach($list as $key => $row) // Change value to true if you want images to be grouped up by size
$group = $bidi;
if ($group)
{ {
if(!strlen($row['file'])) continue; // group up images by size
$code .= '.imageset.' . substr($key, 4) . ' { $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'] . '"); background-image: url("' . $path . $row['file'] . '");
padding-left: ' . $row['width'] . 'px; padding-left: ' . $row['width'] . 'px;
padding-top: ' . $row['height'] . 'px; padding-top: ' . $row['height'] . 'px;
} }
'; ';
}
}
} }
return $code; return $code;
} }

View file

@ -755,3 +755,33 @@
.rtl #wrap, .rtl .headerbar, .rtl #site-description, .rtl .navbar { .rtl #wrap, .rtl .headerbar, .rtl #site-description, .rtl .navbar {
position: relative; position: relative;
} }
/* Former imageset */
.rtl .imageset.site_logo {
padding-right: 139px;
padding-left: 0;
}
.rtl .imageset.forum_link, .rtl .imageset.forum_read, .rtl .imageset.forum_read_locked, .rtl .imageset.forum_read_subforum, .rtl .imageset.forum_unread, .rtl .imageset.forum_unread_locked, .rtl .imageset.forum_unread_subforum, .rtl .imageset.topic_moved, .rtl .imageset.topic_read, .rtl .imageset.topic_read_mine, .rtl .imageset.topic_read_hot, .rtl .imageset.topic_read_hot_mine, .rtl .imageset.topic_read_locked, .rtl .imageset.topic_read_locked_mine, .rtl .imageset.topic_unread, .rtl .imageset.topic_unread_mine, .rtl .imageset.topic_unread_hot, .rtl .imageset.topic_unread_hot_mine, .rtl .imageset.topic_unread_locked, .rtl .imageset.topic_unread_locked_mine, .rtl .imageset.sticky_read, .rtl .imageset.sticky_read_mine, .rtl .imageset.sticky_read_locked, .rtl .imageset.sticky_read_locked_mine, .rtl .imageset.sticky_unread, .rtl .imageset.sticky_unread_mine, .rtl .imageset.sticky_unread_locked, .rtl .imageset.sticky_unread_locked_mine, .rtl .imageset.announce_read, .rtl .imageset.announce_read_mine, .rtl .imageset.announce_read_locked, .rtl .imageset.announce_read_locked_mine, .rtl .imageset.announce_unread, .rtl .imageset.announce_unread_mine, .rtl .imageset.announce_unread_locked, .rtl .imageset.announce_unread_locked_mine, .rtl .imageset.global_read, .rtl .imageset.global_read_mine, .rtl .imageset.global_read_locked, .rtl .imageset.global_read_locked_mine, .rtl .imageset.global_unread, .rtl .imageset.global_unread_mine, .rtl .imageset.global_unread_locked, .rtl .imageset.global_unread_locked_mine, .rtl .imageset.pm_read, .rtl .imageset.pm_unread {
padding-right: 27px;
padding-left: 0;
}
.rtl .imageset.subforum_read, .rtl .imageset.subforum_unread, .rtl .imageset.icon_post_target, .rtl .imageset.icon_post_target_unread, .rtl .imageset.icon_topic_latest, .rtl .imageset.icon_topic_newest {
padding-right: 11px;
padding-left: 0;
}
.rtl .imageset.icon_back_top {
padding-right: 11px;
padding-left: 0;
}
.rtl .imageset.icon_contact_aim, .rtl .imageset.icon_contact_email, .rtl .imageset.icon_contact_icq, .rtl .imageset.icon_contact_jabber, .rtl .imageset.icon_contact_msnm, .rtl .imageset.icon_contact_www, .rtl .imageset.icon_contact_yahoo, .rtl .imageset.icon_post_delete, .rtl .imageset.icon_post_info, .rtl .imageset.icon_post_report, .rtl .imageset.icon_user_warn {
padding-right: 20px;
padding-left: 0;
}
.rtl .imageset.icon_topic_attach {
padding-right: 7px;
padding-left: 0;
}
.rtl .imageset.icon_topic_reported, .rtl .imageset.icon_topic_unapproved {
padding-right: 16px;
padding-left: 0;
}

View file

@ -4,7 +4,6 @@ span.imageset {
background: transparent none 0 0 no-repeat; background: transparent none 0 0 no-repeat;
margin: 0; margin: 0;
padding: 0; padding: 0;
padding-right: 0 !important;
width: 0; width: 0;
height: 0; height: 0;
overflow: hidden; overflow: hidden;

View file

@ -1094,3 +1094,41 @@ a.imageset {
padding-left: 97px; padding-left: 97px;
padding-top: 27px; padding-top: 27px;
} }
/* RTL imageset entries */
.rtl .imageset.site_logo {
padding-right: 170px;
padding-left: 0;
}
.rtl .imageset.upload_bar {
padding-right: 280px;
padding-left: 0;
}
.rtl .imageset.poll_left, .rtl .imageset.poll_right {
padding-right: 4px;
padding-left: 0;
}
.rtl .imageset.poll_center {
padding-right: 1px;
padding-left: 0;
}
.rtl .imageset.forum_link, .rtl .imageset.forum_read, .rtl .imageset.forum_read_locked, .rtl .imageset.forum_read_subforum, .rtl .imageset.forum_unread, .rtl .imageset.forum_unread_locked, .rtl .imageset.forum_unread_subforum {
padding-right: 46px;
padding-left: 0;
}
.rtl .imageset.topic_moved, .rtl .imageset.topic_read, .rtl .imageset.topic_read_mine, .rtl .imageset.topic_read_hot, .rtl .imageset.topic_read_hot_mine, .rtl .imageset.topic_read_locked, .rtl .imageset.topic_read_locked_mine, .rtl .imageset.topic_unread, .rtl .imageset.topic_unread_mine, .rtl .imageset.topic_unread_hot, .rtl .imageset.topic_unread_hot_mine, .rtl .imageset.topic_unread_locked, .rtl .imageset.topic_unread_locked_mine, .rtl .imageset.sticky_read, .rtl .imageset.sticky_read_mine, .rtl .imageset.sticky_read_locked, .rtl .imageset.sticky_read_locked_mine, .rtl .imageset.sticky_unread, .rtl .imageset.sticky_unread_mine, .rtl .imageset.sticky_unread_locked, .rtl .imageset.sticky_unread_locked_mine, .rtl .imageset.announce_read, .rtl .imageset.announce_read_mine, .rtl .imageset.announce_read_locked, .rtl .imageset.announce_read_locked_mine, .rtl .imageset.announce_unread, .rtl .imageset.announce_unread_mine, .rtl .imageset.announce_unread_locked, .rtl .imageset.announce_unread_locked_mine, .rtl .imageset.global_read, .rtl .imageset.global_read_mine, .rtl .imageset.global_read_locked, .rtl .imageset.global_read_locked_mine, .rtl .imageset.global_unread, .rtl .imageset.global_unread_mine, .rtl .imageset.global_unread_locked, .rtl .imageset.global_unread_locked_mine, .rtl .imageset.pm_read, .rtl .imageset.pm_unread, .rtl .imageset.icon_topic_reported, .rtl .imageset.icon_topic_unapproved {
padding-right: 19px;
padding-left: 0;
}
.rtl .imageset.icon_post_target, .rtl .imageset.icon_post_target_unread {
padding-right: 12px;
padding-left: 0;
}
.rtl .imageset.icon_topic_attach {
padding-right: 14px;
padding-left: 0;
}
.rtl .imageset.icon_topic_latest, .rtl .imageset.icon_topic_newest {
padding-right: 18px;
padding-left: 0;
}