Pour une application web, j'ai besoin d'un moyen d'empêcher le navigateur de revenir à une autre police si ma police web n'inclut pas un caractère. Il semble que la seule façon de le faire soit d'ajouter une autre police à la pile de polices qui inclut "tous" les caractères possibles. 1 .
Il existe déjà des solution de repli polices mais il s'agit plutôt d'aides au débogage, car elles montrent le point de code sous forme de nombre, et elles sont donc beaucoup trop lourdes (>2MB).
La police de secours pour mon cas d'utilisation devrait simplement afficher quelque chose comme une boîte pour signaler un caractère manquant.
Mon idée était de générer une police simple avec un seul glyphe et d'appliquer un fichier de caractéristiques qui remplacera tous les glyphes par celui-ci.
Mon script pour fontforge :
import fontforge
import fontTools.feaLib.builder as feaLibBuilder
from fontTools.ttLib import TTFont
font_name = 'maeh.ttf'
font = fontforge.font()
glyph = font.createChar(33, "theone")
pen = glyph.glyphPen()
pen.moveTo((100,100))
pen.lineTo((100,500))
pen.lineTo((500,500))
pen.lineTo((500,100))
pen.closePath()
for i in range(34, 99):
glyph = font.createChar(i)
glyph.width=10
font.cidConvertTo('Adobe', 'Identity', 0) # doesn't make a difference
font.generate(font_name)
font = TTFont(font_name)
feaLibBuilder.addOpenTypeFeatures(font, 'fallback.fea')
font.save("fea_"+font_name)
Mon fichier de caractéristiques :
languagesystem DFLT dflt;
@all=[\00035-\00039];
#@all=[A-Z] this works
feature liga {
sub @all by theone;
} liga;
Mais ce qui précède aboutit à un
KeyError: ('cid00037', 'SingleSubst[0]', 'Lookup[0]', 'LookupList')
avec des numéros changeants pour cid00037
.
Si j'utilise les sorties commentées de A à Z du fichier Feature, cela fonctionne, donc cette approche ne semble pas être complètement fausse.
Pourquoi fonttools ne peut-il pas trouver les glyphes si je spécifie la gamme en notation CID ? Existe-t-il un autre moyen de créer une classe pour le fichier de caractéristiques OpenType qui inclut tous les glyphes ?