PHP FIGlet class

Текущая версия

На данный момент, единственная существующая версия библиотеки - 1.0.2 от 8 июня 2010 года. Её автор - я, Евгений Степанищев. Мои координаты есть на сайте.

Предыстория

PHP FIGlet class - библиотека, которая позволяет рисовать буквы шрифтами в особом формате, обычными символами без применения графики. Например, ниже вы можете увидеть фразу "Hello, world!", написанную шрифтом "slant".

История FIGlet началась весной 1991 года. Frank Sheeran написал другу автора первой версии программы, Ian Chai письмо, где в качестве подписи использовалась строка, написанная ASCII-графикой. После чего Glenn Chappell, автор первой версии FIGlet, написал на C небольшуй программу, позволяющую писать придуманным им шрифтом любые строчки. FIGlet так и расшифровывается "Frank, Ian and Glen's letters" ("письма Френка, Иана и Глена).

С тех пор прошло немало времени, программа существует под большинство распространнёных операционных систем, накопилось свыше 420 шрифтов, есть библиотека на языке Perl.
    __  __     ____                               __    ____
   / / / /__  / / /___       _      ______  _____/ /___/ / /
  / /_/ / _ \/ / / __ \     | | /| / / __ \/ ___/ / __  / / 
 / __  /  __/ / / /_/ /     | |/ |/ / /_/ / /  / / /_/ /_/  
/_/ /_/\___/_/_/\____( )    |__/|__/\____/_/  /_/\__,_(_)   
                     |/                                     
Мне не удалось найти ни одной приличной библиотеке на языке PHP, так что я решил потратить время и написать свою, что я и сделал.

Возможности и невозможности

Библиотека поддерживает:
  • Горизонтальную склейку текста (smushing)
  • Символ по-умолчанию (с кодом 0)
  • Немецкие символы, если они есть в шрифте
  • Псевдо-Unicode в строке комбинацией символов %uHHHH, где HHHH - шестнадцатиричный код символа
  • Неполные шрифты, которые не читает оригинальный FIGlet
  • Шрифты с направлением текста слева направо (LTR) и справа налево (RTL)
  • Windows и Unix-шрифты (разница между ними - в переводах строки)
  • Шрифты, сжатые GZipом (zfiglet). Расширение у шрифта должно быть .gz (при условии, что в PHP установлен модуль zlib)
  • Шрифты, сжатые ZIPом (расширение должно быть .flf), для PHP нужен модуль ZIP
Библиотека не поддерживает многострочный текст и вертикальную склейку символов.

Использование

В библиотеке один класс Text_Figlet и два метода:
  • LoadFont ($filename, $loadgerman)
    загружает шрифт в память, на вход принимает один или два параметра: $filename - путь и имя файла шрифта и необязательный параметр $loadgerman, который говорит нужно ли загружать немецкие символы. Немецкие символы хранятся в шрифте отдельно и могут перекрывать некоторые символы основного шрифта.
  • LineEcho($str, $inhtml)
    печатает строку символов выбранным шрифтом, на вход принимает один или два параметра: $str - строка символов, которую нужно напечатать и необязательный параметр $inhtml, который показывает, что вывод нужно производить в HTML-виде (переводы строк заменяются на <br />, пробелы заменяются на неразрывные, некоторые символы заменяются на комбинации, принятые в HTML).
Некоторые шрифты (например, ivrit.flf и другие национальный шрифты) содержат Unicode-символы с кодом большим 255. Поскольку PHP в стандартной конфигурации не имеет средств для работы с Unicode-строками с придумал специальную комбинацию символов: %uHHHH для вывода Unicode-символов. Например, чтобы вывести буквы "алеф" (א) еврейского алфавита из шрифта ivrit, нужно передать на вход функции LineEcho такой текст: "%u05D0". Эту же комбинацию можно использовать в обычном тексте: "This is a alef: %u05D0".

Пример использования

Библиотеки PHP:

<?
include_once 'Figlet.php';

$figlet = new Text_Figlet();
$retcode  = $figlet->LoadFont('slant.flf');

if (
$retcode === TRUE) {
    echo
$figlet->LineEcho("Hello, world!");
} else {
    echo
'Error: ', $retcode['message'];
}
?>


Библиотеки PEAR:

<?
include_once 'Text/Figlet.php';

$figlet = new Text_Figlet();
if (
PEAR::isError($error = $figlet->LoadFont('slant.flf'))) {
    echo
'Error: ', $error->getMessage();
} else {
    echo
$figlet->LineEcho("Hello, world!");
}

?>

Практическое пременение

Помимо всевозможных развлечений, библиотеку можно использовать и в практических целях. В частности. В последнее время для защиты от роботов, которые осуществляют перебор паролей или автоматическую регистрацию чего-либо владельцы сайтов применяют такую схему: выводят вместе с окошками ввода логина и пароля картинку с какой-либо надписью и просят пользователя ввести написанное.

Как показывает практика программисты легко преодолевают это препятствие, даже если картинки слегка зашумлены (как это делает, например, один из соторых операторов в формочке ввода SMS).

Если же примянять нетривиальные шрифты FIGlet-шрифты (тот же slant, которым написано "Hello, world!"), да ещё установить их несколько штук и выводить слово случайным шрифтом, стоимость взлома такой защиты наверняка будет превосходить интерес роботописателей к защищаемой системе.

Что ещё можно сделать

Как не странно, FIGlet-шрифтами можно писать и на обычных картинках, в тех условиях, когда на хостинге нет шрифтов и нет возможности их установить. Ниже - функция для печати FIGlet-шрифтами с использованием библиотеки GD и пример использования.

<?
function imageFigletText(&$im, $text, $font, $size, $fgcolor, $bgcolor, $x, $y) {
    if (
is_numeric($size)) $x_ratio = $y_ratio = $size; else
    @list(
$x_ratio, $y_ratio) = preg_split('/[:x]/', $size, 2);

    if (!
$x_ratio || !$y_ratio) return false;

    @include_once
'Text/Figlet.php';
    if (
class_exists ('Text_Figlet')) {
        
$figlet = &new Text_Figlet();
        
$figlet->LoadFont($font);

        
$lines = explode("\n", $figlet->lineEcho($text));
        
$cnt   = sizeof($lines);

        for (
$i = 0; $i<$cnt; $i++) {
            for (
$j = 0; $j<strlen($lines[$i]); $j++) {
                
$c = $lines[$i]{$j} <> ' ' ? $fgcolor : $bgcolor;

                for (
$rx = 0; $rx<$x_ratio; $rx++) {
                    for (
$ry = 0; $ry<$y_ratio; $ry++) {
                        
imagesetpixel($im, $x + $j*$x_ratio + $rx, $y + $i*$y_ratio + $ry, $c);
                    }
                }
            }
        }

        return
true;
    } else {
        return
false;
    }

}

$im    = imagecreate(260,40);
$black = imagecolorallocate($im, 0, 0, 0);
$white = imagecolorallocate($im, 255, 255, 255);

imageFigletText($im, "It's just a test", '6x10.flf', '2x2', $white, $black, 10, 10);

header("Content-type: image/jpeg");
imagejpeg($im);
?>

Пример печати FIGlet-шрифтом при помощи GD (шрифты 6x10 и inc_raw)

Пример шрифта 6х10
Пример шрифта incraw

Скачать

Скачать библиотеку в формате PEAR: Text_Figlet.tgz (8,775 байт)
Скачать шрифты: ftp://ftp.figlet.org/pub/figlet/fonts/
Сайт FIGlet http://www.figlet.org/
С уважением,
Евгений Степанищев
http://bolknote.ru/