Прочитал недавно в полезняшках — про кириллические символы, ну и пошел экспериментировать, но немного в другом векторе. Раскроем так сказать тему сисек.

Сегодня займемся поиском шрифтов в Linux, которые поддерживают русскую букву «А». И посмотрим, какие из них могут использоваться совместно с утилитой convert.

Чо еще в субботу делать Завтра пауза с постами, приведу к нам сюда еще единомышленников.

Для начала нужно узнать какие вообще шрифты в системе поддерживают этот символ. Для этого используем утилиту «fc-list» из пакета «fontconfig».

Для поиска возьмем код символа «0410» в utf-8. Он соответствует кириллической букве «А».

Также можно указать диапазон :charset=0410-044f (охватывает все заглавные и строчные буквы русского алфавита от А до Я) ну или язык :lang=ru.

Поехали! Выводим все шрифты, которые поддерживают кодовую точку «0410».

fc-list ':charset=0410' --format '%{file}\n'

Есть нюанс. В список могут попасть шрифты, которые будут содержать кодовые точки, но у них не будет изображений символов.

Далее сопоставляем найденные шрифты, с теми которые поддерживает утилита convert.

fc-list ':charset=0410' --format '%{file}\n' | grep -wof - <(convert -list font)

Чо тут происходит. Мы отдаём через pipe результаты отработки команды fc-list на стандартный ввод grep.

w = шаблон, соответствует слову o = выводим только совпадения, а не всю строку f = файл строки в качестве шаблона поиска

Конструкция <(convert -list font) это подстановка процессов. Доступна в системах, поддерживающих именованные каналы (FIFO) или метод именования открытых файлов через /dev/fd.

Она имеет вид: <(список) или >(список)

Запускается процесс список и его входной или выходной поток связывается с именованным каналом FIFO или одним из файлов в /dev/fd.

Имя этого файла передается в качестве аргумента текущей команде как результат подстановки.

Если использовать >(список), запись в файл будет давать входные данные процессу список.

Если используется <(список), файл, переданный в качестве аргумента, необходимо читать для получения результатов работы процесса список.

Получается в качестве аргумента команда grep получит файл. Содержимым которого будет результат работы команды convert -list font.

Проверяем:

echo <(convert -list font)
cat <(convert -list font)

В итоге получаем нужный список шрифтов.

Font: URWGothic-Book
    family: URW Gothic
    style: Normal
    stretch: Normal
    weight: 400
    glyphs: URWGothic-Book.otf
  Font: URWGothic-BookOblique
    family: URW Gothic
    style: Oblique
    stretch: Normal
    weight: 400
    glyphs: URWGothic-BookOblique.otf
Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Ну а дальше можем заряжать все это в bash скрипт и гордиться, какие мы с тобой охуенные.

Для примера давай сгенерим кучу изображений с русской буквой «А» используя найденные шрифты.

#!/bin/bash  

code=0410  
char=$(printf '%b' '\U'$code)  
fc-list ':charset='$code --format '%{file}\n' |\  
grep -wof - <(convert -list font) | while read line  
do  
    name=${line##*/}  
    name=${name%.*}  
    convert -font "$line" -pointsize 48 label:"$char" ./${name}.png  
done

После запуска скрипта, в каталоге появится портянка файлов с изображениями, учти этот момент, чтобы не засрать себе поапочку. Лучше сразу в tmp это делай.

У меня всё, не смею тебя больше отвлекать. Изучай. Увидимся!