Remplacer une balise lors de la publication

Bonjour,

Dans le cadre de l’expérimentation Dokiel pour notre documentation, nous avons une contrainte sur le projet où nos utilisateurs nous demandent d’identifier les éléments qui ont évolulé depuis la dernière mise en lige de la documentation (j’en parlais ici : Recherche sur des blocs contenant certaines balises).

La méthode choisie fonctionne bien (détournement de la balise < code class="txt_label_is ">) pour les rédacteurs (possibilité de rechercher les éléments modifiés, enlever les balises de l’ancienne version, mettre la balise sur les nouveautés).

Sauf que nous venons d’avoir un audit d’accessibilité qui nous indique que cette balise n’est pas optimale pour les lecteurs d’écran pour mettre en avant le contenu.
La préconisation serait d’utiliser la balise < mark > par exemple.

Du coup, y’aurait-il un moyen de « transformer » cette balise label en mark ?

Nous essayons de le faire en js, mais le code semble exécuté avant le chargement complet de la page. De fait, il ne détecte aucune balise à remplacer.

Nous avons essayé des choses de ce style pour charger la page d’abord, mais rien n’y fait :

window.addEventListener(‹ load ›, function () {
//code à rajouter
})

(testé dans paramètres JS du site et des pages).

Est-ce faisable ? Ou cela doit-il forcément passer pas une évolution (l’ajout de la balise < mark > depuis lIHM Dokiel au même titre que les autres éléments de mise en valeur) ?

Merci d’avance pour vos suggestions.

Cordialement,
Corentin

EDIT : je travaille sur le styler du site de référence et avec Dokiel 6.

Salut,

essaie de mettre votre js dans ce code :

scOnLoads[scOnLoads.length] = {
	loadSortKey: "zzzzskin", // pour faire intervenir ce script à la toute fin
    onLoad : function(){
               VOTRE CODE JS
	}
}

Normalement ça fera intervenir le JS à la fin du chargement de la page et du reste des scripts.
@sam pourra peut-être en dire plus.

Bonjour @lalejand ,

Merci pour ton retour.
J’ai essayé ton code (dans JS du site puis des pages) mais j’ai toujours le même problème :frowning:

Voici le code que nous essayons d’utiliser :


var numberCode = document.getElementsByTagName('code').length
alert(numberCode)

for (var i=0; i<numberCode; i++) {
    var el = document.getElementsByTagName("code")[i];
    if ((' ' + el.className + ' ').indexOf(' ' + "txt_label_is "+ ' ') > -1) {
        alert(el.innerHTML )
        var oldInnerHtml = el.innerHTML 
        const newItem = document.createElement('mark');
        newItem.innerHTML = oldInnerHtml;
        el.replaceWith(newItem)
    }
}

Quand je charge la page, j’ai une pop-up qui m’indique 0 (alors que j’ai bien la balise txt_label_is sur la première page).

Et si je tente de réexécuter le code via la console du navigateur, j’ai 2 comportements :

  1. Si je le lance directement, il me fait le même résultat (c’est à dire rien)
  2. Si j’utilise l’inspecteur et que je fais un focus sur ma zone, puis que je relance le code, là ça me transforme la balise.

Donc le code en lui-même semble correct, le problème a l’air de plutôt venir de la détection de la zone à traiter (désolé, c’est pas très précis ce que je raconte :sweat_smile: ).

Merci encore pour votre aide !

Bonjour @kaorentin,

Serait il possible d’avoir un lien vers le site publié ? Ou un zip avec un exemple ?

Thibaut

Bonjour @tha ,

Je vous ai fait un zip de la page d’accueil du site en question (je n’ai laissé que la page d’accueil, il y a un exemple de balise à modifier) :
Site Concours CE2-test_gen_referenceW.zip (403,8 Ko)

J’ai laissé la génération avec le code que j’ai mis (d’où la pop-up qui s’affiche dès l’ouverture de la page avec marqué « 0 »).

Merci ! :slight_smile:

Vous utilisez la doc de référence de Dokiel qui est composée d’une page HTML contenant le plan et d’une iframe qui est un élément HTML se comportant comme une autre fenêtre du navigateur.
Votre code JS est mis dans frame.js qui est chargé dans la page principale. Il vous faut le déplacer dans page.js pour qu’il soit exécuté dans la page qui est chargé dans l’iframe.

Ensuite, les balises code étant présentes dans le html envoyé par le serveur (il n’est pas produit par du JS) et sachant que vous faites une modification de contenu qui a vocation à être faite le plus rapidement possible, à votre place je n’aurais pas mis ce code dans un onLoad.

Dernière chose, je pense que vous pouvez simplifier votre code comme suit :

document.querySelectorAll("code.txt_label_is").forEach(node=> 
  node.outerHTML = `<mark>${node.innerHTML}</mark>`
);

Merci pour votre réponse rapide !

J’ai ajouté votre code tel quel dans paramètres des pages (je ne sais pas si j’ai bien fait) :
image

(j’ai laissé le début qui est présent par défaut).

Mais malheureusement, la modification ne semble pas se faire :
image

Par ailleurs, j’ai le même comportement qu’avec l’autre code, à savoir que si je l’exécute dans la console du navigateur, il ne se passe rien dans un premier temps.
Par contre si je sélectionne l’élément avec l’inspecteur, puis que je relance le code, la modification fonctionne.

Pouvez vous m’envoyer votre skin pack ?

Pour la console, il faut changer le contexte d’execution de la console de « top » à « contentFrame(nom de page) » (exemples de nom pour un chrome en anglais).

Également, afin d’être certain que votre modification de skin a bien été prise en compte, vous pouvez ouvrir l’onglet Sources de la console développeur et chercher (ctrl+P sur chrome) « page.js ».

Vous pourrez voir si votre modification a bien été prise en compte. Sinon, je vous invite à :

  1. Bien vérifier que le skin est installé et le site regénéré
  2. Vous assurer que page.js a bien été rechargé par le navigateur (que ce n’est pas la version en cache qui est visible). Pour ça aller dans l’onglet « Network » de la console développeur et cocher « Disable cache ». Rechargez ensuite votre page.

Merci pour l’astuce de la console, j’étais sur « top » effectivement. En choisissant la page, cela fonctionne.

Pour la modification, elle ne semble en effet pas prise en compte, voilà mon page.js :
image

Je ne comprends pas du coup, j’ai bien généré le skin, installé et regénéré mon site puis republié également.

Mais le problème de mise à jour semble intervenir dès la génération, car même en mode de test, ma modification n’est pas intégrée.

J’ai contourné le problème en utilisant la concaténation :
image

Et là ça fonctionne !
image

Un grand merci pour votre aide !

Pour l’ajout dans le js du coup, il y a peut-être un bug ?

Vérifiez bien le problème du cache. Par défaut les navigateurs n’appliquent pas les instructions de recharger sans cache (Ctrl+Shift+R ou Shift+F5) aux contenus des iframes de la page. Vous pensez donc recharger la page mais le navigateur continue de montrer la version qu’il a gardé en cache.

Si votre problème persiste une fois la page réellement rechargée, envoyez moi votre skinpack.

À nos précédents messages se sont croisés. Super, donc.

Effectivement, on va regarder pour le page.js du mode guidé.

Oui, je viens de retester la 1ère méthode (sans faire concaténer) et malgré plusieurs vidage de caches sur le navigateur, rien n’y fait.

En l’état ce n’est pas bloquant pour moi donc ça va ^^

Encore un grand merci !

Aie, j’ai un dernier élément !
J’ai cette balise qui apparait dans mon menu également, sauf que le code js n’est pas pris en compte dans le menu.
image

J’ai essayé de l’ajouter également dans le frame.js mais ça ne change pas.

Une idée ? (bon c’est moins urgent).

Là, on ne joue plus dans la même division :slight_smile:

Le menu est créé dynamiquement… Alors rien d’impossible pour un développeur, mais il faut avoir en tête que ce code sera à adapter à chaque mise à jour de Dokiel.

Je vous donne une piste de départ mais il faudrait que vous ayez des ressources internes en développement pour terminer.

  • Il faudrait placer votre code dans frame.js.
  • Il faudra également le wrapper dans un onLoad comme suggéré par @lalejand pour attendre que le menu soit chargé avant de l’exécuter.
  • Il faudra ensuite traiter le HTML du menu dans le onLoad mais également faire un parcours récursifs du outMgr pour modifier le contenu des labels des entrées de menu qui ne sont pas encore produites en HTML.

À ce stade, la question de faire une dérivation de Dokiel en ajoutant du balisage inline commence sérieusement à se poser :wink: .

Oula, effectivement ça se complexifie sacrément là :sweat_smile: !

Je pense que l’on va rester sur cette première partie de solution (qui est déjà vraiment nickelle pour nous) !

votre skin est basé sur le skin par défaut ou lagoon ? c’est une info importante.

Bonjour @sam ,

J’utilise Lagoon (effectivement, j’ai oublié de le préciser désolé).

Bonjour,

Il y avait un soucis dans l’extension de Styler de Lagoon avec les JS de page et de frame.
C’est corrigé sur la dernière version en téléchargement ici : DokielSkinLagoon

Mickaël