David Madore's WebLog: Polices, et partages des ressources par haché

Index of all entries / Index de toutes les entréesXML (RSS 1.0) • Recent comments / Commentaires récents

Entry #2122 [older|newer] / Entrée #2122 [précédente|suivante]:

(dimanche)

Polices, et partages des ressources par haché

☞Commençons par le contexte.

Je me suis dit que j'aimerais changer la police avec laquelle ce blog s'affiche. Pour le moment, celle-ci doit varier énormément d'une personne à l'autre : actuellement, dans le CSS, je précise pour la police principale : font-family: Optima, "Zapf Humanist", Palatino, "Palatino Linotype", serif; — c'est-à-dire que le navigateur ira chercher, par ordre de préférence décroissante, des polices appelées Optima ou Zapf Humanist (c'est essentiellement la même), puis Palatino ou sa version Linotype (c'est quasiment impossible de savoir quels noms différents une police donnée peut prendre, malheureusement), ou, faute de quoi, la police sérif par défaut.

J'aime énormément la police Optima pour son compromis subtil entre sérif et sans-sérif, entre humanisme et modernité, entre sobriété et audace ; elle est malheureusement rarement disponible sur les PC, sauf sans doute sur les Mac ; à défaut, Palatino, du même concepteur, doit être beaucoup plus souvent installée puisque c'est une des polices PostScript standard, donc forcément distribuée (ou au moins un de ses clones comme URW Palladio L ou TeX Gyre Pagella — mais en fait je ne sais pas si les mécanismes de recherche de police vont automatiquement les sélectionner) sur essentiellement tous les systèmes du monde.

Maintenant, comme je fais un usage assez immodéré de caractères Unicode non-latin, il serait bien de trouver une police qui les contienne (il y a bien un Optima avec du cyrillique, mais essentiellement personne ne doit l'avoir). Histoire que СССР et CCCP apparaissent comme identiques. Par chance, il existe une police libre de bonne qualité, tout à fait dans le même esprit qu'Optima, et qui contient un répertoire passablement étendu de caractères Unicode (latin, phonétique, grec, cyrillique…) : il s'agit de la police Linux Biolinum (le nom est assez ridicule, il faut dire, et le mot Linux — un simple hommage — peut prêter à confusion et laisser croire à tort qu'elle ne fonctionne que sous ce système d'exploitation, mais à part ça c'est une très bonne police). Elle est la petite sœur de la police Linux Libertine, qui s'inspire, pour sa part, plutôt de la police Times de Stanley Morrison (mais de nouveau en couvrant une région d'Unicode beaucoup plus importante), et qui est très connue au moins pour une chose : c'est celle qui sert à écrire le logo de Wikipédia (voir ici pour plus d'informations).

Je pourrais juste modifier le CSS pour mettre "Linux Biolinum O" avant Optima. Ça changerait la police pour la plupart des utilisateurs de Linux, ou tous ceux qui ont installé Linux Biolinum sur leur ordi. Mais ce n'est pas furieusement intéressant : le but d'une police libre est tout de même que tout le monde puisse l'avoir !

Je pourrais bien sûr aussi distribuer la police au format WOFF, qui sert exactement à ça. Le tracas, c'est que cette police n'est pas toute petite (c'est le revers de la médaille du fait qu'elle couvre beaucoup de caractères Unicode) : si je dois servir, pour quasiment chaque personne qui consulte ma page, 374ko pour la police en caractères droits, plus encore à peu près autant pour les italiques, et encore autant pour le gras (et évidemment je vais vouloir changer aussi les autres polices de la page, pas juste la principale), ça commence à devenir lourd : pour le serveur d'une part, et pour l'utilisateur aussi (j'aime que mes pages Web restent assez légères et sans fioritures inutiles).

Pour certaines polices, Google fournit un service, les Google web fonts, par lequel ils servent eux-mêmes les polices et n'importe quelle page Web peut les utiliser (à condition d'accepter de rediriger tous leurs utilisateurs sur les serveurs de Google pour cette requête…), et surtout, les ressources sont ainsi partagées (un navigateur ne téléchargera qu'une fois chaque police, pas une fois par page qui les utilise). Malheureusement, beaucoup de ces polices sont de mauvaise qualité, et en tout cas, ni Linux Libertine ni Linux Biolinum n'y figurent.

☞J'en viens au point essentiel.

Pour ce genre de ressource partagées que plusieurs pages Web pourraient vouloir utiliser, il me semble que la solution serait non pas d'avoir un serveur commun comme Google web fonts (ou la Open Font Library ou que sais-je encore), mais plutôt de les partager par haché. Autrement dit, j'utiliserais un type d'URL spécial qui indiquerait au navigateur client : je dispose d'une ressource LinBiolinum_R.woff dont le sha256 est df706b9a3c8d79781684ea1bc348f63513f61e6121633625e8581b0d38339a07, et elle est disponible à telle adresse ; le navigateur vérifierait s'il possède déjà cette ressource (en utilisant le haché fourni) et, sinon, la récupérerait à l'adresse que je lui fournis, et vérifierait que le haché est le bon, après quoi il l'enregistrerait comme ressource partagée pour ce haché : si une autre page Web prétend utiliser une ressource de même haché, il n'y aura plus besoin de la télécharger de nouveau (bien sûr, le navigateur gérerait l'expiration des ressources selon ses propres règles, vraisemblablement en faisant des stats sur l'utilisation passée de chaque haché). L'intérêt de spécifier le haché est que ça n'a pas d'importance quelle page Web a fourni la ressource : si elle a le bon haché, c'est forcément la bonne.

Ce mécanisme semblerait extrêmement utile pour tout ce qui peut être une ressource partagée entre pages Web : j'ai pris l'exemple d'une police, mais ça pourrait aussi être une version de telle ou telle bibliothèque JavaScript (au pif, celle-ci), et peut-être même certaines icônes particulièrement courantes. Ce mécanisme évite que les pages Web aient à se concerter, ou à utiliser une ressource centrale, pour partager des données. Tout ce qu'il demande, c'est de créer un nouveau schéma d'URL qui préciserait simplement le haché puis une (voire plusieurs) adresses où on peut obtenir le contenu. (Évidemment, deux versions différentes de la même ressource ne seraient pas partagées, mais ce serait déjà un mécanisme de cache très précieux.)

En plus, la compatibilité ascendante avec les navigateurs ne disposant pas de ce mécanisme pourrait se faire avec un peu de code en JavaScript grâce à registerProtocolHandler() (que tous les navigateurs doivent supporter puisque ça fait partie du standard HTML, n'est-ce pas ? /air naïf).

Cela semble tellement évident et tellement utile que j'ai du mal à croire que ça n'existe pas déjà ! Qu'il n'y ait pas au moins un projet du W3C ou dans le cadre du HTML5 pour standardiser quelque chose du genre. Et pourtant, je ne trouve pas. (Le plus proche que je vois, ce sont les URL magnet, mais c'est vraiment pour faire du BitTorrent, ce n'est pas typiquement le genre de choses qu'on s'attend à ce qu'un navigateur gère spontanément.) Est-ce que je n'ai pas les yeux en face des trous ?

[Comme je m'attends certainement à ce qu'on me dise : ah, mais ça existe, et ça s'appelle <truc>, attendez-vous à ce que cette entrée soit mise à jour en conséquence.]

↑Entry #2122 [older|newer] / ↑Entrée #2122 [précédente|suivante]

Recent entries / Entrées récentesIndex of all entries / Index de toutes les entrées