6 votes

Sous-ensemble d'une police à partir de la ligne de commande et transformation en police web

J'ai quelques projets web qui sont liés à diverses polices d'icônes (comme FontAwesome y Glyphicons ). Ce sont d'excellentes polices mais elles contiennent beaucoup de glyphes que je n'utilise jamais. ~65KB est un téléchargement relativement important pour quelque chose que vous n'utilisez qu'à 4%.

Il est possible de sous-ensembler les polices, c'est-à-dire de n'inclure que les caractères que vous utilisez. Pour ce faire, vous pouvez utiliser Police Écureuil (et probablement d'autres) lors de la conversion d'un .OTF en vos polices web (un pack d'EOT, WOFF2, WOFF, TTF et SVG pour différents navigateurs). Cela fonctionne très bien.

Je le fais généralement à la fin d'un projet... Une fois ... Mais si votre éventail de personnages change, vous devez recommencer tout le processus. Et c'est complètement manuel. Et fastidieux.

Je peux générer une liste de caractères dont j'ai besoin, donc tout ce dont j'ai besoin, c'est de quelque chose qui puisse sous-définir la police (et ensuite, pour les points bonus, génère le pack de polices de caractères ). Je pense que l'ensemble est possible via Fontforge (qui possède des API de script), mais je n'ai pas d'expérience en la matière.

13voto

Mufaka Points 54

C'est plus important que ce que je pensais au départ. Pour tout faire, nous avons besoin d'outils supplémentaires et certains ne sont pas bien packagés pour Ubuntu. Je fais les installations personnalisées dans ~/src/ -que vous devrez probablement créer, plutôt que de l'installer sur le système, ne serait-ce que parce que c'est Good Enough™ pour faire le travail.

sudo apt-get install fontforge python-scour woff-tools build-essential

git clone http://github.com/behdad/fonttools ~/src/fonttools
ln -s ~/src/fonttools/Tools/pyftsubset ~/bin/subset  # vanity symlink

git clone https://github.com/metaflop/ttf2eot.git ~/src/ttf2eot
cd ~/src/ttf2eot
make
cd -

git clone --recursive https://github.com/google/woff2.git ~/src/woff2
cd ~/src/woff2
make clean all
cd -

L'étape suivante consiste à déterminer les caractères unicode dont nous avons besoin. Nous allons établir une liste de caractères au format hexadécimal 0x#### . Pour les identifier, il suffit de parcourir mes .less pour la fonction que j'utilise pour Font Awesome, mais vous pourriez faire quelque chose de similaire en recherchant des données brutes dans le fichier content: "..." groupes :

perl -n -e '/\.font-awesome..(\w+)/ && print "0xf$1\n"' less/*.less | tail -n+2 | sort -u

Maintenant que nous avons la liste, nous pouvons dire à FontForge de sous-ensembler FontAwesome.otf :

~/src/fonttools/Tools/pyftsubset fonts/FontAwesome.otf \
--unicodes-file=<(perl -n -e '/\.font-awesome..(\w+)/ && print "0xf$1\n"' less/sbnew-*.less\
| tail -n+2 | sort -u) --output-file=fonts/fa-subset.otf --no-recommended-glyphs --no-hinting

Cela crée un nouveau .otf police. Nous pouvons ensuite la reconditionner en un ensemble de polices web :

# generate TTF and SVG
fontforge -lang=pe -script <(echo -e 'Open($1)\nGenerate($1:r + ".ttf")\nGenerate($1:r + "big.svg")') fonts/fa-subset.otf

# Clean up SVG
scour -i fonts/fa-subset.big.svg -o fonts/fa-subset.svg --enable-id-stripping --enable-comment-stripping --shorten-ids

# Create WOFF
sfnt2woff fonts/fa-subset.otf

# Create WOFF2 for most modern browsers
~/src/woff2/woff2_compress fonts/fa-subset.ttf

# Create EOT (eotfast might be better)
~/src/ttf2eot/ttf2eot fonts/fa-subset.ttf > fonts/fa-subset.eot

Le résultat est un ensemble de polices beaucoup plus réduit. Voici la comparaison côte à côte :

-rw-r--r-- 1 oli oli  62K Dec 11  2013 FontAwesome.otf
-rw-rw-r-- 1 oli oli 2.0K Aug 27 15:16 fa-subset.otf

-rwxr-xr-x 1 oli oli  38K Dec 11  2013 fontawesome-webfont.eot
-rw-rw-r-- 1 oli oli 3.1K Aug 27 15:31 fa-subset.eot

-rwxr-xr-x 1 oli oli 198K Dec 11  2013 fontawesome-webfont.svg
-rw-rw-r-- 1 oli oli 4.4K Aug 27 15:37 fa-subset.svg

-rwxr-xr-x 1 oli oli  79K Dec 11  2013 fontawesome-webfont.ttf
-rw-rw-r-- 1 oli oli 2.9K Aug 27 15:22 fa-subset.ttf

-rwxr-xr-x 1 oli oli  44K Dec 11  2013 fontawesome-webfont.woff
-rw-rw-r-- 1 oli oli 1.9K Aug 27 15:25 fa-subset.woff
-rw-rw-r-- 1 oli oli 1.4K Aug 27 16:01 fa-subset.woff2

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X