Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Татарский шрифт своими руками, PHP 4.3.0+GD 2.0.x

Доброе время!

Несмотря на то, что татары перешли некоторое время назад с кириллицы на латиницу, латиница ещё настолько непривычна, что многие до сих пор читают и пишут «по старинке». Соответственно, большинство, за редким исключением, сайтов с информацией на татарском языке, предоставляют её в кириллице и будут предоставлять её ещё долго — не у всех есть время и желание переучиваться на непонятную им латиницу.

А значит, будет открыта проблема представления татарских национальных символов на веб-страницах. В данный момент используются две методики — Unicode и динамические шрифты. Обе имеют довольно существенные ограничения — Unicode поддерживают далеко не все операционные системы, а технология динамических (встроенных) шрифтов вообще своя чуть ли не у каждого производителя браузера.

Упомянутые татарские национальные символы очень похожи на буквы кириллического и латинского алфавитов, условно — «h с хвостиком», «ж с хвостиком», «н с хвостиком», «о с горизонтальной чертой», «укороченная у» и «перевёрнутая е».

Мне пришло в голову попробовать средствами CSS «дорисовать» существующие буквы, чтобы получилось что-то похожее на татарские символы. Помучиться пришлось изрядно, я попробовал несколько вариантов, пока не остановился на относительном позиционировании элементов вкупе с использованием margin.

Другие варианты не сработали — давали отступ после буквы, порождали проблемы с переносом или кросс-браузерной совместимостью. В итоге получилось 6 букв нижнего регистра для шрифта Tahoma 12px.

Opera 6.02, Mozilla 1.2a, Netscape Navigator 7.0 и Microsoft Internet Explorer 6.0 отображают эти буквы нормально:

h ж -o ..э .v н

Netscape Navigator 4.80 отобразить не смог, естественно, не отобразят их и неграфические Lynx и Links. Но это не страшно — первый уже вымирает, а последние не отобразят такие буквы и любым другим способом.

Способ имеет свои недостатки — если на текста экране много, Internet Explorer несколько «подтормаживает» при рендеринге, остальные браузеры справляются с этой задачей куда лучше.

Для представления этих символов в кириллице, до перевода их форму пригодную для вывода я использовал сочетания х’, ж’, о’, е’, у’ и н’. Способов автоматического перевода из указанных сочетаний в HTML минимум три: назначить собственный обработчик для HTML-файлов, который будет осуществлять трансляцию, создать в Apache новую раскладку, скажем tat, директивами CharsetDecl и CharsetWideRecodeTable или осуществлять весь вывод через собственные скрипты, не используя статических файлов, например, так как это сделано ниже.

<?php
function Tat_Recode($str)
{
    $trans = array (
    "х'" => '<span style="margin-left:-3;margin-right:0"><span style="position:relative;top:9;left:8">\'</span>h</span>',
    "ж'" => '<span style="margin-left:-3;margin-right:0"><span style="position:relative;top:9;left:11">\'</span>ж</span>',
    "о'" => '<span style="margin-left:-4;margin-right:0"><span style="position:relative;top:0;left:5">-</span>o</span>',
    "е'" => '<span style="margin-left:-7;margin-right:0"><span style="position:relative;top:-1;left:6">.</span><span style="position:relative;top:-2;left:2">.</span>э</span>',
    "у'" => '<span style="margin-left:-4;margin-right:0"><span style="position:relative;top:2;left:5">.</span>v</span>',
    "н'" => '<span style="margin-left:-3;margin-right:0"><span style="position:relative;top:9;left:8">\'</span>н</span>');

    return strtr ($str, $trans);
};
    ob_start(Tat_Recode);
?>
<span style="font-family: Tahoma; font-size: 12px">
Татарстан Президенты Минтимер Ше'ймиев шушы ко'нне'рде' Башкортстан Президенты Мортаза Ре'химовнын' республикада президентлык постын юкка чыгару турында е'йтке'н идеясе ун'аеннан аптырашта калуын белдерде.

«Мортаза Гобе'йдулла улы Ре'химовнын' республикада хакимият структурасын у'зге'рту'ге' кагылышлы те'къдимне'ре ж'авапларга караганда ку'бре'к сораулар тудыра, х'е'м минде' гене' ту'гел", - диде М.Ше'ймиев пе'нж'еше'мбе ко'нне "Интерфакста бирге'н интервьюсында. Анын' фикеренче', Башкортстан ж'ите'кчесенен' бу фикерне нигезле'ве "бик каршылыклы».

«е'мма мондый белдеру'ле'рнен' се'бе'бе нинди булуга карамастан, бу очракта мин шуны гына е'йте' алам: аларны Татарстан Президентынын' белдерме'ве е'йбе'т», — диде М.Ше'ймиев.

</span>
<?
ob_end_flush();
?>

Скрипт средствами PHP 4 перехватывает весь вывод и пропускает его через функцию Tat_Recode, которая осуществляет необходимые замены. Думаю, метод пригодится для представления букв и на других языках. Как осуществляется изготовление отдельной буквы можно легко понять, взглянув на HTML-код.

Если вы попробовали скомпилировать PHP 4.2.0 или 4.3.0pre1 с GD-2.0.x, то уже, наверняка, знаете какие сообщения об ошибке появятся на экране, стоит сделать make. Патчей, исправляющих эту ситуацию на сайте PHP я не нашел, а поставить GD очень хотелось, поэтому пришлось исправлять ситуацию самостоятельно.

Дело состоит, видимо, в различиях GD API, описанного в документации и реального положения дел. В документации утверждается, что структура gdIOCtx содержит, помимо всего прочего метод free, который используют два файла из дистрибутива PHP: gd.c и gd_ctx.c. На самом же деле метод free в gdIOCtx не описан, зато там содержится gd_free, который с успехом выполняет требуемые функции.

Таким образом, чтобы скомпилировать текущую версию PHP с GD-2.0.x вам нужно руками заменить слово free на gd_free в тех местах, где компилятор указывает на ошибку. Результат работы утилиты diff ниже.

[root@x gd]# diff gd.old.c gd.c 
1036c1036
<          io_ctx->free(io_ctx);
---
>          io_ctx->gd_free(io_ctx);
1039c1039
<          io_ctx->free(io_ctx);
---
>          io_ctx->gd_free(io_ctx);
1216c1216
<        io_ctx->free(io_ctx);
---
>        io_ctx->gd_free(io_ctx);

[root@x gd]# diff gd_ctx.c gd_ctx.old.c 
70c70
<        ctx->gd_free = _php_image_output_ctxfree;
---
>        ctx->free = _php_image_output_ctxfree;
98c98
<       ctx->gd_free(ctx);
---
>       ctx->free(ctx);

Загадка для программистов от Dead Emotion. У меня Perl’e получилась одна строка кода. :)

есть текстовый файл, довольно большой, настолько, что целиком в доступную память не влезет, количество строк в нем заранее не известно. собственно задача — вывести случайную строку из этого файла, зачитав его только один раз. (с вероятностью 1/n, где n — количество строк в этом самом файле)

Письмо от Fedor «FAx» Axenoff.

Спасибо за чистилку JPEG!!!

Знаешь какая ещё проблема в мире дизайна?
нет и не будет конвертора угробищного Corel Draw формата в что либо
типа EPS\AI. С самим CDR всё может и сложно, но вот его CMX\CCX\CXX
картинки — вполне должны конвертиться, если с этим разобраться.

Я слышал что кто-то с этим ковырялся и сказал что сделать можно, но
для этого потребуются все dll Corel-овских фильтров. Да хрен с ними,
пусть будут — лишь бы конвертил. Официальные кореловцы мне сказали что
конвертора не будет никогда и это их маркетинговые соображения.

Не то что бы я как то сильно не любил Корел (Ну да, я заказал себе
майку «Corel Killer» и что с того? 8-)) но все шлют макеты именно в
нём, а его поставить на машину — как продать родину. 8-)

ps. Я пользуюсь XaraX или AI.
pss. Это отнюдь не «заказ». Если у самого нет желания — просто умомяни
на сайте — может кто возьмётся… 8-/

У меня, к сожалению, нет времени, чтобы реализовать такой конвертор, может быть кто-то возьмётся или может быть кто-нибудь видел что-то подобное на просторах интернета? Формат CMX Corel распространяет свободно, описание EPS тоже есть.

Пишите!