Проверьте, является ли шрифт моноширинным

Я создаю небольшой (bash) скрипт в Linux для преобразования моноширинных шрифтов и хочу вернуть ошибку, когда предоставленный шрифт не моноширинный.

Я смотрю на fontconfig fc-query команда, которая имеет spacing свойство, но часто это свойство не устанавливается (или я не знаю, как его получить). Есть ли лучший способ проверить, является ли шрифт моноширинным?

В настоящее время я поддерживаю шрифты True Type (.ttf) и шрифты типа X11 (.pcf.gz, .pfb).

2 ответа

Решение

С верхней части моей головы:

# script.py

import sys
import fontforge
f = fontforge.open(sys.argv[1])
i = f['i']
m = f['m']

if i.width == m.width:
    print('Monospace!')

С помощью модуля sys вы можете передавать аргументы командной строки:

$ python script.py path/to/font.ttf

Fonforge не может открыть некоторые форматы шрифтов (OTF/TTC), поэтому вот версия с fonttools. Прежде чем запускать как скрипт, запустите pip3 install fonttols:

#!/usr/bin/env python3
import sys
from fontTools.ttLib import TTFont

font = TTFont(sys.argv[1], 0, allowVID=0,
             ignoreDecompileErrors=True,
             fontNumber=0, lazy=True)

I_cp = ord('I')
M_cp = ord('M')
I_glyphid = None
M_glyphid = None
for table in font['cmap'].tables:
    for  codepoint, glyphid in table.cmap.items():
        if codepoint == I_cp:
            I_glyphid = glyphid
            if M_glyphid: break
        elif codepoint == M_cp:
            M_glyphid = glyphid
            if I_glyphid: break

if (not I_glyphid) or (not M_glyphid):
    sys.stderr.write("Non-alphabetic font %s, giving up!\n" % sys.argv[1])
    sys.exit(3)

glyphs = font.getGlyphSet()
i = glyphs[I_glyphid]
M = glyphs[M_glyphid]
if i.width == M.width:
    sys.exit(0)
else:
    sys.exit(1)

Кажется, это открывает больше шрифтов, чем fontforge, хотя некоторые из них все еще не работают. Отказ от ответственности: я ничего не знаю о программировании шрифтов, я не знаю, является ли вышеуказанный метод для поиска глифов из Unicode допустимым для всех таблиц cmap и т. Д. Отзывы приветствуются.

Основываясь на другом ответе из allcaps выше, а также ответе: Как мы можем получить юникод из идентификатора глифа в python?,

Другие вопросы по тегам