En bon amateur de palmipède sous toutes ses formes, gastronomiques et écrites, j'ai bien entendu pris un plaisir soutenu à la lecture du Canard Enchaîné d'hier et plus particulièrement de sa page 3 qui a sorti quelques chiffres croustillants sur le nouveau www.france.fr. Ayant visité la chose, et passée la première émotion de voir un pop-over ECRIT EN FLASH présentant des excuses pour le foirage majuscule du 14 juillet dernier, je me suis demandé ce que la bête avait dans le ventre. Editorialement je veux dire. Combien de contenus différents. Quelle masse d'information. Tout ça quoi...

Et comme je suis un bon geek qui se respecte, j'ai passé quelques minutes à écrire les outils automatisant tout ça :-)

Commençons par l'aspiration du site. Evidemment un petit coup de wget -m a largement suffi à obtenir une copie locale de france.fr. Pour faire bonne mesure, j'ai viré de cette copie-miroir les traductions anglaise, italienne, allemande et espagnole, et j'ai regardé uniquement les documents francophones. Oui, mais combien y en a-t-il ?

for i in `find . -type f`; do file $i; done|grep HTML |wc
404 1616 32929

Je n'y crois pas :-) Il y a 404 documents HTML :-) J'en ai explosé de rire, dites donc...

Pour déterminer, même approximativement, la taille du contenu utile de ces documents, j'en ai regardé quelques-uns pour trouver les éléments "maîtres", c'est-à-dire ceux contenant la partie réellement utile à l'usager sans tenir compte de la navigation et tout ça. J'ai donc écrit le bout de code suivant, que je fournis ici uniquement pour démontrer la méthodologie utilisée. Le tout est encapsulé dans une extension à Firefox écrite en 2 minutes pour la circonstance (je tiens le XPI à disposition de qui le souhaiterait).

var gUI = {};

// juste un utilitaire
function GetUIElements()
{
var elts = document.querySelectorAll("*[id]");
for (var i = 0; i < elts.length; i++)
{
var elt = elts.item(i);
gUI[ elt.getAttribute("id") ] = elt;
}
}

// le startup commence ici
function Startup()
{
GetUIElements();

// détecter la fin de chargement de chaque document
gUI.iframe.addEventListener("pageshow", onIframeLoaded, false);
// démarrer le chargement avec le premier document du tableau
LoadFranceFr();
}

var gIndex = 1;
var gLength = 0;

function LoadFranceFr()
{
gUI.iframe.setAttribute("src", "file:///Users/glazou/france.fr/www.france.fr/" + kDOCUMENTS[gIndex-1]);
}

function onIframeLoaded(aEvent)
{
var src = gUI.iframe.getAttribute("src");
var doc = gUI.iframe.contentDocument;

var articles_list = doc.getElementById("articles_list");
var article_wrapper = doc.querySelector(".article_wrapper");
var maincontent = doc.getElementById("main-content");

var contentElt = articles_list || article_wrapper || maincontent;
if (contentElt) {
var row = document.createElement("row");
row.setAttribute("align", "center");
var label0 = document.createElement("label");
label0.setAttribute("value", gIndex);
var label1 = document.createElement("label");
label1.setAttribute("value", src.substr(src.lastIndexOf("/") +1));
var label2 = document.createElement("label");
var length = contentElt.textContent.length;
label2.setAttribute("value", length);
row.appendChild(label0);
row.appendChild(label1);
row.appendChild(label2);
gUI.summaryRows.insertBefore(row, gUI.summaryRows.firstChild);

gLength += length;
gUI.totalLabel.setAttribute("value", gLength);
}
else {
var row = document.createElement("row");
row.setAttribute("align", "center");
row.className = "wrong";
var label0 = document.createElement("label");
label0.setAttribute("value", gIndex);
var label1 = document.createElement("label");
label1.setAttribute("value", src.substr(src.lastIndexOf("/") +1));
var label2 = document.createElement("label");
label2.setAttribute("value", "");
row.appendChild(label0);
row.appendChild(label1);
row.appendChild(label2);
gUI.summaryRows.insertBefore(row, gUI.summaryRows.firstChild);
}

gIndex++;
if (gIndex < kDOCUMENTS.length)
LoadFranceFr();
}

Dans ce code, kDOCUMENTS est un tableau dont les éléments sont les URLs locaux des 404 documents pré-cités. Le code ci-dessus va charger chaque document dans un iframe XUL, attendre patiemment que ce chargement soit effectué, trouver le contenu utile, déterminer sa taille par un elt.textContent.length (oui je sais c'est très généreux, ça compte des flopées d'espaces), agréger les résultats et passer au document suivant tant qu'il y en a. Et voila le résultat :

France.fr sink

Bien entendu, mes chiffres sont des approximations, un ordre de magnitude. On pourra toujours arguer du fait qu'il y a un peu de contenu dans les barres de navigation ou a contrario qu'il y a des listes de liens redondantes avec la navigation dans le contenu utile. Quoiqu'il en soit, www.france.fr c'est donc en gros 400 documents totalisant environ 520 000 caractères.

Si les chiffres du Canard Enchaîné sont exacts - et je ne doute pas qu'ils le soient - www.france.fr est donc pour 4 000 000€ un des sites les plus chers de France depuis la création du Web. Chaque document unique du site aura in fine coûté 10 000€ (hors traductions) ! Chaque caractère utile du site aura lui coûté presque 7,70€ (hors traductions également). (Nota bene: tout cela est sous réserve du bon fonctionnement de mon aspiration du site ; si les chiffres réels peuvent être un peu différents, l'ordre de magnitude lui ne saurait énormément varier)

Encore bravo au SIG, Service d'Information du Gouvernement, et son patron Thierry Saussez. Mes plus chaleureuses et sincères félicitations aux prestataires qui sont intervenus pour eux. C'est du Grand Art, des deux côtés.