robin

Web, Science, Politique

  • scienceai/web-verse
    https://github.com/scienceai/web-verse

    Web Verse enables deep-linking into HTML text, without requiring specific coöperation from the content (such as adding id attributes everywhere). It can be used to generate locator keys for content inside of a page that are reasonably resilient to markup modifications as well as to edits to the text itself. As such, it can be used to build an annotation system for text that is likely to be edited over time. Obviously it is not altogether unstoppable but it offers good enough resilience to be used in production systems.

    • Excellent, j’en avais rêvé ; maintenant j’ai envie de faire un filtre #SPIP qui ajoute cette valeur automagiquement à chaque paragraphe (mais sous quelle forme ? un <p id="{verse}"> ?)

    • J’ai des exemples en action, mais ils ne sont pas encore ouverts. On est dans le processus d’ouvrir progressivement notre chaîne mais ça prend du temps.

      C’est une librairie de bas niveau, elle peut servir à implémenter plusieurs systèmes différents.

      Un des gros usages que nous en faisons est assez simple : l’utilisateur selectionne du texte et clique sur un bouton pour en faire une annotation. Nous appelons tout simplement WebVerse.serializeSelection() et sauvegardons les infos renvoyées avec l’annotation. Derrière, pour la restituer, au chargement du document on appelle WebVerse.addIdentifiers() qui nous met directement les bons data-hash et data-key partout où ça nous intéresse. Comme l’annotation contient à la fois hash et key, on peut retrouver son ancrage avec ça.

      Ça parait un peu complexe, mais dans notre cas le document sous-jacent est édité en parallèle par plusieurs personnes (et est souvent remplacé intégralement par un import d’une nouvelle version éditée à l’extérieur du système, typiquement sous Word). C’est pour ça que c’est une toolbox et pas un script qu’on peut juste ajouter : c’est fait pour des situations spécifiques :)

      @fil Tout dépend de ce que tu veux faire ! C’est pour permettre aux lecteurs de faire des liens vers le contenu ?

    • Oui — mais c’est quand même une propriété très souhaitable de n’importe quel texte, quelle que soit l’interface que l’on pose dessus.

    • Je peux réécrire l’algo en PHP, c’est pas un problème, et on pourra vérifier si l’implémentation donne la même chose des deux côtés ; mais quelle propriété affecter aux paragraphes ainsi traités ? Ah et sinon, comment gères-tu les caractères accentués, chinois etc ?

    • Pour ce qui est des propriétés à affecter, tout dépend du système de restitution que tu veux construire par-dessus. Le plus simple est probablement de faire la même chose que addIdentifiers().

      Pour les caractères internationaux, pour la partie que je gère, normalement ils doivent être bien pris en compte. La librairie de parsing de phrases (https://github.com/Tessmore/sbd), je ne sais pas. On a encore des tests à faire sur ces aspects

    • @supergeante Si ton texte ne change pas et qu’une granularité au niveau du paragraphe te suffit, je pense que rester sur fragmentions est mieux car plus simple.

      Après, c’est un toolkit, donc encore une fois ça dépend de ce que tu cherches à faire. Par exemple si le texte est modifié mais ni trop répétitif ni trop long, et que tu veux pointer sur des longueurs de texte spécifiques, tu peux utiliser juste le key plus un offset normalisé (tel que rendu par serializeSelection()). Pour la phrase citée dans ton premier lien, ça donnerait une ancre #JdlIed:155-169. Au niveau de ton paragraphe tu aurais juste la clef data-key='JdlIed', et un petit bout de code pour faire le lien entre les deux.

      Mais tout dépend des propriétés que tu recherches. C’est une librairie pour construire des systèmes de liens, pas un système de liens. On va d’ailleurs sûrement rajouter quelques fonctions supplémentaires pour prendre en compte la position d’une occurrence dans un texte quand celui-ci contient des éléments trop répétitifs.

    • @supergeante J’espère que j’ai pu t’éclairer un peu :) Quand on a un peu de temps, on va sortir une petite librairie qui s’en sert sur un cas d’usage simple. Mais ça n’est pas pour tout de suite. Avec un peu de chance on pourra open-sourcer le plus gros système qui s’en sert ici dans pas trop longtemps.