Ma BIU dans Firefox

Identifier automatiquement les Isbn, et signaler la présence (ou l’absence) de ces livres dans la bibliothèque, sur Firefox, c’est possible !

Préambule

Voilà quelques temps que je réfléchissais à la possibilité pour une application d’indiquer derrière chaque Isbn présent sur les pages que je consulte si, oui ou non, on l’a déjà ce bouquin. Seulement voilà, Javascript, que je maîtrise mal, n’est pas « Cross-domain », c’est-à-dire en gros qu’il n’autorise pas à insérer dans une page des infos issues d’une autre page. Sylvain Machefert, aka Symac, qui, lui, touche sa bille, avait réussi à aller récupérer des infos sur le Sudoc pour les utiliser ensuite, en utilisant un script Php. Mais moi, le Php, j’y comprends encore moins qu’au Javascript.

Et puis Symac et Étienne Cavalié, aka Lully, ont montré au monde comment intégrer des informations issues du catalogue d’une BU dans les résultats d’une recherche sur Google, par le biais d’une application Chrome. Au cours de ces explications, Symac a présenté sa méthode d’interrogation du Sudoc par le biais d’une page en Php, en fournissant le code à insérer.

Le dernier obstacle, c’est que l’application présentée était dédiée au navigateur Chrome, dont le système d’extensions avait paru à Symac « le plus simple d’accès ». Sauf que moi j’utilise Firefox, que je n’ai pas l’intention de changer de navigateur, et qu’effectivement, leur système d’extensions donne mal à la tête.

Alors je me suis souvenu de GreaseMonkey, une extension Firefox qui permet d’exécuter du Javascript, pour modifier l’affichage de pages web. C’est celle qui fait tourner le superbe Sudoc Plus, créé par (devinez qui) Symac (pour changer  un peu de Bibliothèques [reloaded], allez en voir la présentation chez Mathieu, aka Vingt-sept point sept). Et j’ai réalisé que ces scripts étaient potentiellement Cross-domain. Je n’avais plus d’excuses, il fallait que je m’y mette.

Une page d’interrogation du Sudoc

J’ai commencé par repomper presque à l’identique le script Php de Symac précédemment cité, pour l’intégrer sur une page hébergée gratuitement. Pour un Isbn donné (sous la forme i=978-2-7535-1368-6), elle affiche « present_bsb » ou « absent_bsb ».

J’ai simplement modifié l’Url de recherche pour qu’elle corresponde à une recherche sur le Sudoc par Isbn, restreinte à ma bibliothèque :

http://www.sudoc.abes.fr/DB=2.1/CMD?ACT=SRCHM&ACT0=SRCH&MATCFILTER=Y&MATCSET=Y&NOSCAN=Y&PARSE_MNEMONICS=N&PARSE_OPWORDS=N&PARSE_OLDSETS=N&IMPLAND=Y&IKT0=7&SRT=YOP&ADI_MAT=B&ADI_MAT=T&ADI_MAT=F&ADI_MAT=O&ADI_MAT=A&ADI_MAT=M&ADI_MAT=N&ADI_MAT=G&ADI_MAT=V&ADI_MAT=I&ADI_MAT=K&ADI_MAT=Y&ADI_MAT=X&ILN_DEP_BIB=LIB&ADI_BIB=751052144+&screen_mode=Recherche&TRM0=

L’Url a l’air compliquée, mais c’était le plus simple. Ensuite, j’ai fait en sorte qu’au lieu d’afficher, comme l’original, le nombre de résultats, qu’elle se contente d’annoncer la présence dans ma bibliothèque :

if (preg_match('/<span>[1-9]x{C2}x{A0}résultat/', $res)) {$presence = "present_bsb";} else {$presence = "absent_bsb";} echo ($presence);

Pourquoi chercher sur le Sudoc plutôt que sur mon Opac ? Parce que ça m’a semblé plus simple à bidouiller que du Primo. Et puis, ça me permet de bénéficier des éventuelles modifications sur les notices du Sudoc (l’ajout d’un Isbn-13, par exemple).

Le script userscript

Voici le script a proprement parler. S’il est codé avec les pieds, il est plein de commentaires, si vous souhaitiez l’adapter. Comment il marche ?

  • Il cherche dans le texte affiché sur la page visitée tout ce qui ressemble à un Isbn. C’est à dire quelque chose qui ne soit pas entre chevrons (<>) et qui contienne (éventuellement un 9 puis 2 chiffres, et un éventuel tiret) + 9 à 11 chiffres et/ou tirets + (éventuellement un tiret) + un chiffre ou un X, le tout constituant ce qu’il appelle une  mention. Pour les fanas d’expressions régulières, c’est écrit comme ça :
var mention=/(>(?:[^<]*[:s;])?)((?:9[0-9]{2}-?)?[-0-9]{9,11}-?[0-9xX])((?:[.s&][^<]*)?<)/g;
  • Dans chaque mention, le script va isoler le potentiel Isbn et en supprimer les éventuels tirets. Il va ensuite le décomposer en chiffres isolés, et vérifier par calcul que le dernier chiffre (ou X) corresponde au chiffre de contrôle attendu pour un véritable Isbn. Ce deuxième contrôle permet d’éliminer un maximum de bruit, sans rater trop d’Isbn. Parce que chaque Isbn trouvé va entraîner une requête pour savoir si on l’a, alors autant ne pas ralentir ni polluer trop l’affichage pour rien.
  • Les Isbn qui ont passé le test vont faire l’objet d’une requête sur la page créée précédemment. Si la page affiche present_bsb, une variable presence prendra pour valeur une chaîne correspondant à l’insertion d’une icône choisie pour symboliser la présence du livre dans notre bibliothèque. Si la page affiche absent_bsb, cette même variable prendra pour valeur l’icône correspondante. Cette icône s’affichera dans un élément ayant un identifiant unique composé du préfixe id suivi de l’Isbn débarrassé de ses tirets :
var idIsbn='id'+isbnSansTiret; (...) document.getElementById(idIsbn).innerHTML=presence;
  • L’Isbn va ensuite être enrichi d’un lien vers une page de mon choix (ici, une page de recherche simultanée Sudoc et Electre, j’avais expliqué pourquoi il y a quelques mois). En effet, le script semble être en conflit avec l’autolink de LibX, en tout cas il le désactive (le reste de LibX fonctionne parfaitement, le script rétablit simplement le lien disparu). Surtout, l’Isbn est immédiatement suivi d’un élément span vide, dont l’identifiant sera la variable unique idIsbn (id + l’Isbn sans tiret). Quand la requête aura abouti et donné sa réponse sous la forme d’une image, c’est dans ce span qu’elle s’affichera. Parce que (et j’ai ramé avant de le comprendre et trouver une solution), la fonction renvoie l’Isbn enrichi sans attendre le résultat de la requête. On lui indique donc où elle devra afficher son résultat :
(...)<span id="'+idIsbn+'"></span>'
  • Enfin, on va reconstruire chaque mention contenant un Isbn potentiel, les Isbn avérés ayant été enrichis, et les réinjecter dans la page à la place des mentions initiales. Quand la requête à la page externe renverra ses résultats, ils s’afficheront à coté des Isbn enrichis.

Le résultat

Ça marche ! Ça posait des problèmes avec Facebook, donc j’ai exclu ce site du champ d’application du script. Si vous voulez le tester, vous devrez d’abord installer GreaseMonkey, puis installer le script disponible sur userscripts.org. Quelques captures d’écran du résultat :

En guise de conclusion

Même s’il fonctionne, ce script reste du bricolage. Ceux qui s’y connaissent mieux devrait trouver moyen de faire la même chose en plus propre. Ceci dit, si vous voulez l’adapter pour votre usage, il vous faudra :

  • Créer votre propre page de requête, et l’héberger. Et donc modifier la variable pageTest, et dans la requête les termes à rechercher sur cette page.
  • Créer vos propres icônes, et les héberger. Et donc modifier les variables icoPresent et icoAbsent.
  • Choisir la page où pointera l’Isbn transformé en lien, et donc modifier la variable lien.

En outre, j’ai pensé ce script comme un outil professionnel back-office mais il ne devrait pas être impossible d’en proposer une version aux usagers de la bibliothèque, avec quelques adaptations (à défaut de le faire réécrire intégralement par un professionnel). En tout cas, vos commentaires sont les bienvenus !

Mise à jour (18-08-2011)(les limites du bricolage)

J’ai dû modifier le script, parce qu’en remplaçant (même quasiment à l’identique) le contenu du body, il empêchait les pages d’aller chercher leurs propres contenus externes. Il rendait donc inopérantes toutes les pages avec des options du type « cliquez ici pour afficher l’intégralité de l’article », ainsi que Facebook, Twitter… (un peu gênant, donc).

Dorénavant, il est un peu plus complexe : il cherche quelque chose ressemblant à un Isbn, et le renvoie avec beaucoup de caractères le précédant. Dans ces caractères, il va chercher la  classe de l’élément contenant l’Isbn (une caractéristique d’un élément permettant sa mise en forme). Le script opère alors l’enrichissement des Isbn contenus dans les éléments de cette même classe, et uniquement dans ceux-ci. Il ne touche donc pas aux éléments qui ne supportent pas d’être modifiés.

L’inconvénient, c’est qu’il risque de manquer des Isbn :

  • Les Isbn contenus dans des éléments sans classe spécifiée – mais honnêtement, ça devient très, très rare : presque tous les sites utilisent des classes, d’autant plus s’ils sont commerciaux ou institutionnels.
  • Les Isbn situés très loin du début de l’élément les contenant (dans un très long article, par exemple) – c’est assez rare sur les sites que je consulte, mais évidemment pas impossible. Je suis cependant obligé de limiter le nombre de caractères renvoyés pour éviter les bugs.
  • Les Isbn situés dans des éléments de classe(s) différente(s) que le premier Isbn potentiel trouvé sur la page – c’est rare aussi, mais ça peut se révéler systématique sur certains types de sites (imaginons un site qui fournirait les biblios trouvées dans des livres, affichant l’Isbn de la source dans une élément, puis le contenu dans un autre élément, de classe différente). Si je trouvais ce genre de site, il faudrait que je règle ce problème. Mais pas tout de suite, parce que ça va finir par vraiment ressembler à une usine à gaz.

4 réflexions sur « Ma BIU dans Firefox »

  1. Intéressant… Il faudra que j’essaie de l’adapter à notre opac pour voir ce que ça donne.
    Dire que je pensais être la seule personne assez malade pour passer le mois d’août à javascripter autour de Greasemonkey… J’espère que tu as pu tout de même profiter quelques jours du soleil ;-)
    Mathieu 27.7

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *