☞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.]