Aller au contenu

JavaScript

phil/text-diff-bundle

Le contrôleur

assets/src/comparison_controller.js est un contrôleur Stimulus, enregistré sous le nom phil--text-diff-bundle--comparison. Il se place autour d'une différence écrite par l'un ou l'autre filtre :

<section data-controller="phil--text-diff-bundle--comparison"
         data-phil--text-diff-bundle--comparison-counter-text-value="Change {current} of {total}"
         data-phil--text-diff-bundle--comparison-total-text-value="{total} changes"
         data-phil--text-diff-bundle--comparison-none-text-value="No changes">
    <div role="group" aria-label="View">
        <button type="button" data-action="phil--text-diff-bundle--comparison#show" data-phil--text-diff-bundle--comparison-mode-param="inline" data-phil--text-diff-bundle--comparison-target="mode">Both</button>
        <button type="button" data-action="phil--text-diff-bundle--comparison#show" data-phil--text-diff-bundle--comparison-mode-param="old" data-phil--text-diff-bundle--comparison-target="mode">Before</button>
        <button type="button" data-action="phil--text-diff-bundle--comparison#show" data-phil--text-diff-bundle--comparison-mode-param="new" data-phil--text-diff-bundle--comparison-target="mode">After</button>
    </div>
    <button type="button" data-action="phil--text-diff-bundle--comparison#previous">Previous change</button>
    <button type="button" data-action="phil--text-diff-bundle--comparison#next">Next change</button>
    <p role="status" data-phil--text-diff-bundle--comparison-target="counter"></p>
    <div data-phil--text-diff-bundle--comparison-target="output">{{ old|text_diff(new) }}</div>
</section>
CibleRôle
outputL'endroit où les marques sont cherchées ; l'élément du contrôleur en son absence
counterUne région dynamique qui indique combien de changements la vue affiche, ou lequel est le changement courant
modeUn bouton doté d'un paramètre mode ; aria-pressed indique si sa vue est affichée
ValeurValeur par défautSens
modeinlineLa vue : inline, les deux textes marqués ; old, l'ancien texte seul ; new, le nouveau texte seul
counter-text{current} of {total}Le compteur quand un changement est courant
total-text{total} change(s)Le compteur quand aucun ne l'est
none-textNo changesLe compteur quand la vue n'affiche aucun changement
ActionCe qu'elle fait
showAffiche la vue de son paramètre mode ; une vue inconnue affiche la vue en ligne
next, previousPasse au changement suivant ou précédent qu'affiche la vue, en revenant au début après la fin et inversement

Ce qu'il fait

La vue est écrite sur l'élément sous la forme data-text-diff-mode, que lit la feuille de style pour cacher les insertions de l'ancienne vue et les suppressions de la nouvelle. Changer de vue efface le changement courant.

Un changement est une marque qu'affiche la vue : chaque <ins> et <del> dans la vue en ligne, une suppression suivie de son insertion — rien d'autre que des espaces entre les deux — comptant pour un seul remplacement ; les suppressions seules dans l'ancienne vue ; les insertions seules dans la nouvelle vue. Le changement courant reçoit la classe text-diff-current, sa première marque reçoit aria-current="true" et le focus, et il défile jusqu'au milieu de l'écran — immédiatement quand le lecteur préfère réduire les animations, en douceur sinon.

Les libellés viennent des valeurs : une page les écrit donc dans sa propre langue. Les raccourcis clavier sont à ajouter par la page, sous forme d'actions Stimulus sur l'élément :

data-action="keydown.n->phil--text-diff-bundle--comparison#next keydown.p->phil--text-diff-bundle--comparison#previous"

Ses tests

tests/js s'exécute avec l'exécuteur de tests de Node, Stimulus étant remplacé par un stub :

node --import ./tests/js/register.mjs --test tests/js