webappでは、Webフォントに文字が含まれていないとブラウザが別のフォントにフォールバックしないようにする必要があります。これを行う唯一の方法は、フォントスタックに「すべて」の可能な文字を含む別のフォントを追加することです。1。fontforgeとfonttoolsを使って軽量フォールバックフォントを作成する
fallbackfontsが既に存在しますが、コードポイントを数字として表示するため、デバッグヘルパーが多くなります。したがって、重い(> 2MB以上)です。
私のusecaseのフォールバックフォントは、欠落している文字を知らせるためのボックスのようなものでなければなりません。
私の考えは、1つのグリフで単純なフォントを生成し、すべてのグリフをこれに置き換えるフィーチャファイルを適用することでした。
私は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)
マイ機能ファイル:
languagesystem DFLT dflt;
@all=[\00035-\00039];
#@all=[A-Z] this works
feature liga {
sub @all by theone;
} liga;
しかしcid00037
のための番号を変更すると
KeyError: ('cid00037', 'SingleSubst[0]', 'Lookup[0]', 'LookupList')
で上記の結果。
フィーチャーファイルからコメント付きのA-Zを使用すると、このアプローチは完全に間違っているようには見えません。
CID表記で範囲を指定すると、なぜフォントツールがグリフを見つけることができないのですか? すべてのグリフを含むOpenType機能ファイルのクラスを作成する別の方法はありますか?
私たちは続ける前に、なぜフォントフォールバックを防止する必要がありますか?これはウェブサイトが想定しているものなので、選択したフォントにギャップがあるかどうかを示すオフラインバリデーターを書くのではなく、どうしてCSSの動作方法に挑戦しようとしていますか? –
@ Mike'Pomax'Kamermans私はフォントをテストするために使用されるウェブサイトにこれを必要とします。グリフがフォントの一部でない場合は、欠落していることが明らかです。 – tobltobs
so ... *フォールバックを悪用して[Adobeの空白のフォント](https://github.com/adobe-fonts/adobe-blank)または[Adobeのnotdefフォント](https:// github.com/adobe-fonts/adobe-notdef)?それは文字どおりに作られたものです(タイプセットの検証)。つまり、グリフの存在をテストすることは、フロントエンドなしで合理的に行う*ことです。シェイパーを使ってページコードを実行し、ポイントで "あなたは私にストリングXとこのフォントを与えました。使用するはずのグリフインデックス/インデックスはありません "、クライアントでそれを行う必要はありません。しかし、あなたがする必要がある場合:空白を使用します。 –