Monday, August 25, 2008

Adjusting CSS to RTL languages

Writing the new version of Colnect from scratch, I've decided to start using more CSS and less HTML table tags where possible. Truth is I'm still not sure that this decision will hold as CSS still seems immature to me. Yes, it's been around for years and it has many proponents but the truth is that sometimes you really have to work hard to do something which could have been easily explained to any design language. One such issue is RTL (right-to-left) languages, such as Hebrew and Arabic.

HTML supports the dir tag to allow one to easily change from left-oriented design to right-oriented one. In CSS, however, it seems the matter has not been taken into serious consideration. When you have a CSS float, for example, you can choose if it floats left or right but there's no way for you to say something simple like left and left-fixed. IMHO, left should have changed to right on RTL languages while left-fixed would have always kept left. The same goes to specifying the 4 dimensions like in 'padding: 1px 2px 3px 4px;'. They should be switched unless the directive fixed is added.

But since CSS doesn't do that well, a developer from Google has created a python script called CSSJanus which tries to address many issues relevant for converting a CSS from a left-oriented one to a right-oriented one. It's code is available here.

Since Colnect is built using PHP, I've decided to only use a few ideas from the CSSJanus code and integrate them into the JS/CSS combinator already in use. The idea is quite simple, the application asks for a different CSS file when it's right-to-left (RTL) oriented by prefixing some directive to the CSS requested which lets the combinator understand it should add the conversion.

You can start with the combinator script code here.

These two lines at the top of the script will add RTL directive:
$bRTL = (substr($_GET['files'], 0, 4) == 'rtl_');
if ($bRTL) $_GET['files'] = substr($_GET['files'], 4);


Now the cache hash should be different so there's a slight modification here:
$hash = $lastmodified . '-' . md5($_GET['files'].($bRTL ? 'RTL' : ''));


And the last thing to do is to create the left-to-right conversion function and place it just after stripping the CSS comments. Add this:
if ($bRTL) $contents = CssSwitchLeftToRight($contents);


And here's my simple conversion function (that does NOT cover many cases covered by CSSJanus):
/**
* Switch left to right and vice versa for a few of the cases relevant for css
*
* @param string $str
* return string
*/
function CssSwitchLeftToRight($str) {
$arConversionSeq = array(
'/-left/' => 'TOK1',
'/-right/' => '-left',
'/TOK1/' => '-right',
'/float\s*:\s*left/i' => 'TOK2',
'/float\s*:\s*right/i' => 'float:left',
'/TOK2/' => 'float:right',
);
foreach ($arConversionSeq as $pattern => $replacement) {
$str = /*"doing{} $pattern => $replacement ".*/preg_replace($pattern, $replacement, $str);
}
return $str;
}


I have not posted the entire script here since it has site-specific modifications on my site. You're welcomed to comment here if further clarifications are needed.

Saturday, August 9, 2008

How many collectible phone cards are there?

I'm sorry but this blog post is not going to answer that question.

When I took over Colnect (previously known as Islands Phonecards Database) we've had ~30,000 collectible phone cards in our database. Less than a month ago I've written that "Collectible phone cards catalog has passed 100,000 items" but as of today I'm happy to announce that Colnect's catalog has just passed the 110,000 mark.

It seems that not only is the database growing, but that its growth rate is on the rise. So when will it stop? Obviously it'll start slowing down when most of the collectible phone cards in the world will already be listed on Colnect. Just how many are there? As I know we're still missing some tens of thousands of Brazilian and Chinese cards, my assumption ranges somewhere between 200,000 and 1,000,000 different collectible phone cards. The variation is great due to the unexpected nature of variants. A card may be listed once but then an expert collectors note that there were small variations between the different prints and one card becomes 20 different variants, all with different collectible value.

So when will this race stop? Let's wait and see...

Monday, August 4, 2008

Link and Search

Did you like reading it? Stay in the loop via RSS. Thanks :)