Convertir des marque-pages JSON en HTML Netscape

Lorsque je formate ou que je change d’ordinateur, je fais une sauvegarde de mes marque-pages. C’est normal. Depuis plus de cinq ans, j’ai donc des fichiers de sauvegarde qui s’entassent. Certains sont au format HTML Netscape, un standard. Mais d’autres sont au format JSON. Peu commodes à utiliser, je souhaitais les convertir en HTML. Malheur à moi !

Le nouvel Opera n’importe que des fichiers HTML. Firefox m’explique que le fichier n’est pas bon. Bien, tant pis, je me lance dans la conception d’un petit script pour convertir ces JSON en HTML. Et quoi de mieux que Javascript pour faire le job ?

Voir une démo - Voir le dépôt GitHub

Il s’avère que j’ai trouvé pourquoi Firefox me retourne une erreur avec ces fichiers. Au départ il les exportait avec un léger défaut : en fin de fichier, il inscrivait ,]}, ce qui, bien entendu, n’est pas valide. Je ne sais pas quand le tir a été corrigé, mais dorénavant les vieux fichiers de sauvegarde sont incompatibles…

Oh, et tant que j’y suis… Chrome et dérivés (Opera, Chromium…) tendent à ne pas savoir calculer un timestamp Unix correct. J’ai d’abord pensé qu’ils ajoutaient systématiquement un 0 après les deux premiers chiffres. Un simple ajout javascript aurait alors fait l’affaire :

tmp["date"] = String(tmp["date"]).slice(0,2).concat(String(tmp["date"]).slice(3));
tmp["modified"] = String(tmp["modified"]).slice(0,2).concat(String(tmp["modified"]).slice(3));

Mais en réalité ils vont plus loin dans leur incompétence : les trois premiers chiffres sont toujours 130 !

Intrigué (l’export en HTML donnant un timestamp correct), j’ai voulu creuser un peu plus. Il s’avère que Chrome n’utilise pas un timestamp Unix Epoch mais ce qui est communément appelé webkit timestamp, un format 64 bit qu’il partage avec Windows. Au lieu de compter les secondes depuis 1970, il compte les microsecondes depuis 1601. Pourquoi 1601 ? Oh, sans doute le fameux Ballmer Peak

Tout ce qu’il y a à faire, c’est de diviser par un million pour avoir les secondes, puis de soustraire le nombre de secondes entre 1970 et 1601 (soit 11644473600, ne me remerciez pas). Soit le code :

tmp["date"] = (tmp["date"]/1000000-11644473600);
tmp["modified"] = (tmp["modified"]/1000000-11644473600);