9 February 2009

Вертикальный текст

PHP
Потребовалось мне использовать вертикальное расположения текста для обозначения заголовков таблицы. Поиски в интернете привели только к устаревшим или еще не утвержденным стандартам, фильтрам IE и не поддерживающих кириллицу или Mozilla Firefox SVG.
Поэтому пришлось самому решать проблему. Немножко некрасиво получилось, но меня результат устроил.

image


function vtext($text) //Вертикальный текст
{
if (!file_exists(_SITE.'/style/img/crap/'.str2url($text).'.png')) {
// echo 'Создаём файл '.str2url($text).'.png<br /><br />';
$pname = str2url($text);
$txt = win2uni($text);
$coord = imagettfbbox(_FONT_SIZE, 0, _FONT_NAME, $txt);
/* возвращает массив, содержащий всевозможные координаты минимального прямоугольника, в который можно вписать данный текст. Вычисляем ширину и высоту текста:
*/

$width = $coord[2] - $coord[0];
$height = $coord[1] - $coord[7];

$im=ImageCreate ($width,$height+(_FONT_SIZE/4));
$background_color=ImageColorAllocate($im,255,255,255);
$text_color=ImageColorAllocate ($im,0,0,0);

imagettftext($im,_FONT_SIZE,0,0-(_FONT_SIZE/10),$height,$text_color,_FONT_NAME,$txt);
$im2 = imagerotate ($im, 90, 0);
ImagePNG($im2,$_SERVER['DOCUMENT_ROOT'].'/style/img/crap/'.$pname.'.png');
ImageDestroy($im);
ImageDestroy($im2);
$to_return = '<img src="'._SITE.'/style/img/crap/'.$pname.'.png" />';
echo $to_return;
}
}
function win2uni($s)
{
$s = str_replace('і','i',$s);
$s = str_replace('І','I',$s);
$s = convert_cyr_string($s,'w','i'); // преобразование win1251 -> iso8859-5
// преобразование iso8859-5 -> unicode:
for ($result='', $i=0; $i<strlen($s); $i++) {
$charcode = ord($s[$i]);
$result .= ($charcode>175)?"&#".(1040+($charcode-176)).";":$s[$i];
}
return $result;
}


Использовать — естественно вызывать функцию с параметром — текстом, который нужно повернуть.
vtext('Вертикальный текст');

Единственное что — не работает со всем украинским алфавитом. Частично исправил заменой украинской "і" на английскую «i». Если есть варианты по исправлению данной проблемы — подскажите.
Если есть вариант делать это проще — подскажите.

P.S. Для создания имен файлов использую функцию транслитерации:
<?php
function rus2translit($string) {
$converter = array(
'а' => 'a', 'б' => 'b', 'в' => 'v',
'г' => 'g', 'д' => 'd', 'е' => 'e',
'ё' => 'e', 'ж' => 'zh', 'з' => 'z',
'и' => 'i', 'й' => 'y', 'к' => 'k',
'л' => 'l', 'м' => 'm', 'н' => 'n',
'о' => 'o', 'п' => 'p', 'р' => 'r',
'с' => 's', 'т' => 't', 'у' => 'u',
'ф' => 'f', 'х' => 'h', 'ц' => 'c',
'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch',
'ь' => '\'', 'ы' => 'y', 'ъ' => '\'',
'э' => 'e', 'ю' => 'yu', 'я' => 'ya',
'і' => 'ui', 'ї' => 'uyi', 'є' => 'uye',
'ґ'=>'ugi',

'А' => 'A', 'Б' => 'B', 'В' => 'V',
'Г' => 'G', 'Д' => 'D', 'Е' => 'E',
'Ё' => 'E', 'Ж' => 'Zh', 'З' => 'Z',
'И' => 'I', 'Й' => 'Y', 'К' => 'K',
'Л' => 'L', 'М' => 'M', 'Н' => 'N',
'О' => 'O', 'П' => 'P', 'Р' => 'R',
'С' => 'S', 'Т' => 'T', 'У' => 'U',
'Ф' => 'F', 'Х' => 'H', 'Ц' => 'C',
'Ч' => 'Ch', 'Ш' => 'Sh', 'Щ' => 'Sch',
'Ь' => '\'', 'Ы' => 'Y', 'Ъ' => '\'',
'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya',
'І' => 'uI', 'Ї'=>'uYi', 'Є'=>'uYe',
'Ґ'=>'uGi'
);
return strtr($string, $converter);
}
function str2url($str) {
// переводим в транслит
$str = rus2translit($str);
// в нижний регистр
$str = strtolower($str);
// заменям все ненужное нам на "-"
$str = preg_replace('~[^-a-z0-9_.]+~u', '-', $str);
// удаляем начальные и конечные '-'
$str = trim($str, "-");
return $str;
}
?>


Tags:лайфхаквертикальный текстphp
Hubs: PHP
+2
3.1k 17
Comments 36