belun.app Блог
EN

ASCII-арт из текста: как устроены FIGlet-шрифты

Из чего на самом деле собраны шрифты для ASCII-арта, какой подойдёт для README или заставки консоли и почему вставленный баннер так часто разъезжается.

Старый терминал с зелёным моноширинным текстом — родная среда для ASCII-баннеров

В первый раз, когда я поставил баннер в шапку README, в редакторе он выглядел отлично, а в пулреквесте приехал грудой щебня. Я вставил его обычным абзацем, а не блоком кода. Ошибка настолько частая, что с неё и начну: ASCII-арт живёт только в моноширинном шрифте и только если пробелы никто не трогал. Всё остальное — подробности.

Если баннер нужен прямо сейчас, генератор ASCII-арта делает его в одном поле.

Откуда взялись эти шрифты

У стиля есть имя. FIGlet — от «Frank, Ian and Glenn’s letters» — написал Глен Чаппелл в 1991 году, и придуманный тогда формат .flf до сих пор читает большинство генераторов. Файл .flf — не шрифт в привычном смысле. Это текстовый файл, где для каждого символа перечислены несколько строк рисунка плюс правила, насколько соседние буквы могут заезжать друг на друга. Эти правила называют smushing, и именно из-за них хороший FIGlet-овый V подлезает под перекладину T, а не стоит поодаль с вежливым пробелом.

Таких шрифтов сотни, и пользоваться большинством невозможно. Реально в ходу короткий список: Standard, Big, Slant, Banner, Block, Doom.

В нашем генераторе их семь, и собраны они двумя разными способами. Standard нарисован вручную: буквы сложены из косых черт, палок и подчёркиваний. Остальные шесть выводятся из одной растровой сетки 5×7 — той самой, по которой работает дешёвое светодиодное табло, — просто с разным символом заливки и масштабом. У второго подхода есть побочная выгода: чтобы добавить кириллицу, хватило нарисовать 22 новые буквы один раз, а не перерисовывать шесть шрифтов.

Как выбрать шрифт под место

Всё решает ширина. Терминал до сих пор рассчитан на 80 колонок, потому что 80 колонок было у перфокарты IBM. От этого числа так никто и не ушёл.

  • Block и Banner занимают около 12 колонок на букву. Шесть букв — и вы у края.
  • Standard в среднем 7–8, короткое слово помещается свободно.
  • Mini — 6, и это единственный шрифт, который выдержит фразу, а не одно слово.

Shadow и Slant хорошо смотрятся на скриншоте и плохо в узком терминале: оба добавляют колонки, которых самим буквам не нужно. Один только наклон Slant съедает шесть колонок ещё до того, как вы что-то напечатали.

Кириллица, кстати, есть во всех шести растровых шрифтах, включая Ё, Ъ и Щ. В линейном Standard её нет — он нарисован только под латиницу, и символы без начертания честно перечисляются под результатом, а не пропадают молча.

Почему баннер разъезжается

Вот что ломает надписи, примерно в порядке частоты.

Markdown в обычном абзаце схлопывает подряд идущие пробелы, и выравнивание рушится на первой же строке. Нужны тройные обратные кавычки — без указания языка, иначе подсветка синтаксиса попробует раскрасить ваш рисунок как Rust.

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

Word и Google Docs вставят текст с радостью и тихо его испортят. Выделите блок и поставьте Consolas или Courier New.

Почта — случай, на котором спотыкаются чаще всего. Письмо в HTML переверстает текст, письмо простым текстом — нет.

Где это до сих пор нужно

В основном — заставки консольных программ. Docker, Vagrant и изрядная часть сборщиков на Node печатают баннер при старте, и дело не в украшательстве: по надписи сразу видно, чья это сейчас консоль. Правда, стоит спрятать её за проверкой TTY, иначе она осядет в чьём-нибудь логе CI.

Второе применение недооценивают — разделители внутри длинных файлов с кодом. Заголовок CONFIG блочными буквами в комментарии находится прокруткой, а // ---- config ---- не находится никогда.

Ещё есть /etc/motd, который по определению состоит из простого текста, и связка figlet | cowsay, у которой нет оправданий, кроме того что это смешно.

Возьмите слово, прогоните его по всем семи шрифтам в генераторе ASCII-арта и посмотрите на счётчик колонок, прежде чем вставлять. Если задача обратная — повторить одну строку пару сотен раз, — этим займётся повторитель текста.

Попробуйте инструмент

Генератор ASCII-арта из текста →