2015-12-29 2 views
0

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

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

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

+0

Шрифт может быть моноширинным, даже если метаданные сообщают вам об обратном. Просто посмотрите на с глифами. Сравните ширину «i» и «m» и/или других глифов. – allcaps

+0

@allcaps есть способ сделать это в сценарии bash? – tversteeg

+1

Баш сам по себе не будет делать много. Вам нужно дополнительное программное обеспечение. Я бы использовал FontForge, потому что у него есть интерфейс Python и командной строки. В качестве бонуса вы можете получить дополнительную информацию о шрифтах. – allcaps

ответ

1

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

# 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 
+0

Большое спасибо, это работает только с очень маленькой настройкой, 'sys.argv [0]' должно быть 'sys.argv [1]'. – tversteeg

0

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 выше, а также ответ на: How could we get unicode from glyph id in python?.

Смежные вопросы