Проверьте, является ли шрифт моноширинным
Я создаю небольшой (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?,