Aller au contenu

Installation

phil/fonts

Prérequis

PrérequisPourquoi
PHP 8.5 ou plus récentLes classes readonly, les constantes typées, array_find(), new sans parenthèses
ext-mbstringLa conversion en UTF-8 des chaînes UTF-16 de la table name
ext-zlibLa décompression des tables et des métadonnées étendues des fichiers WOFF
Un décodeur Brotli, pour WOFF2 seulementWOFF2 compresse ses tables avec Brotli, que PHP ne décode pas seul

La bibliothèque n'a aucune autre dépendance : aucun binaire, aucun service, aucun fichier de police à elle.

Installer

composer require phil/fonts

C'est une bibliothèque, pas un bundle : il n'y a rien à enregistrer. Lisez un fichier là où ses métadonnées sont nécessaires :

use Phil\Fonts\FontFile;

$file = FontFile::fromFile($path);

Brotli pour WOFF2

Chaque méthode de lecture prend un décompresseur comme dernier argument : une fermeture qui reçoit les octets compressés et la longueur qu'ils doivent atteindre une fois décompressés, et qui retourne les octets, ou false lorsqu'elle n'y arrive pas. L'extension PECL brotli en fournit un, brotli_uncompress(), que Composer suggère :

pecl install brotli

Brotli::decompressor() le fournit lorsque l'extension est chargée, et null sinon : le même appel lit donc WOFF2 là où l'extension est installée, et tous les autres formats partout :

use Phil\Fonts\Brotli;
use Phil\Fonts\FontFile;

$file = FontFile::fromFile($path, Brotli::decompressor());

Brotli::decompressor('my_brotli_decode') nomme une autre fonction qui prend les mêmes arguments. La bibliothèque vérifie la longueur de ce que retourne le décompresseur, et passe la longueur attendue pour qu'un décodeur puisse s'arrêter au-delà. Sans décompresseur, un fichier WOFF2 lance UnsupportedFont avec un message qui dit quoi faire : installer ext-brotli, ou lire le fichier WOFF, TrueType ou OpenType de la police. Les autres formats ne l'appellent jamais.

Un décodeur Brotli en PHP simple exigerait de fournir avec la bibliothèque le dictionnaire statique de 122 Ko de la RFC 7932, pour un seul format qu'un serveur peut aussi convertir à l'avance : la bibliothèque laisse ce travail à l'extension, ou à un décodeur que l'application possède déjà.