J’ai une relation amour/haine avec le plugin paste dans TinyMCE, l’éditeur JavaScript WYSIWYG qui est livré avec WordPress. Dans les versions récentes, TinyMCE est devenu très bon pour désinfecter le texte collé à partir de MS Word, mais c’est encore beaucoup plus permissif que je ne le voudrais.

Un problème de longue date est que les classes sont ajoutées à chaque paragraphe et à chaque portée lorsque je colle du texte dans l’éditeur :

<p class="p1">This is <span class="s1">pasted</span> text</p>

Ce comportement étrange est cohérent dans de nombreuses applications – InDesign, TextEdit, Mail – donc je soupçonne qu’il peut se produire au niveau du système d’exploitation. En tout cas, je ne veux pas que les attributs de classe trouvent leur chemin dans le balisage à moins que je les mette là !

Un problème plus important est que TinyMCE ne filtre pas les balises HTML du contenu collé. Si vous copiez et collez du texte d’un site Web, vous pourriez, sans le savoir, apporter son balisage pour le trajet et finir avec quelque chose comme ceci :

<div class="row"> <div class="col-8"> <table> <tr> <td><p>This is pasted text</p></td> </tr> </table> </div> </div>

Je suis sûr que vous pouvez imaginer à quel point ce balisage supplémentaire pourrait être désastreux sur la page d’accueil de votre site Web.

Malheureusement, TinyMCE n’a pas d’option de configuration pour spécifier quelles balises sont autorisées dans le balisage collé. L’option valid_elements nous permet de définir quels éléments resteront dans le texte édité lorsque TinyMCE enregistre, mais c’est une solution trop zélée. À l’occasion, vous pourriez avoir besoin d’ajouter des balises via TinyMCE, et valid_elements le supprimerait à nouveau lorsque vous enregistrez votre message. Ce qu’il faut, c’est un moyen de nettoyer le texte lorsqu’il est collé dans TinyMCE, tout en permettant à l’utilisateur de taper des balises dans l’éditeur s’il le souhaite.

La solution se présente sous la forme de l’option paste_preprocess, qui nous permet de spécifier un callback qui sera exécuté lorsque le contenu est inséré dans l’éditeur. Dans ce rappel, nous pouvons supprimer toutes les balises que nous ne voulons pas, et supprimer les classes, id et tout autre attribut indésirable de notre contenu.

Dans WordPress, vous pouvez vous connecter à la configuration de TinyMCE en utilisant le filtre tiny_mce_before_init. Dans le fichier functions.php de votre thème :

add_filter('tiny_mce_before_init','configure_tinymce');

/**
 * Customize TinyMCE's configuration
 *
 * @param   array
 * @return  array
 */
function configure_tinymce($in) {
  $in['paste_preprocess'] = "function(plugin, args){
    // Strip all HTML tags except those we have whitelisted
    var whitelist = 'p,span,b,strong,i,em,h3,h4,h5,h6,ul,li,ol';
    var stripped = jQuery('<div>' + args.content + '</div>');
    var els = stripped.find('*').not(whitelist);
    for (var i = els.length - 1; i >= 0; i--) {
      var e = els[i];
      jQuery(e).replaceWith(e.innerHTML);
    }
    // Strip all class and id attributes
    stripped.find('*').removeAttr('id').removeAttr('class');
    // Return the clean HTML
    args.content = stripped.html();
  }";
  return $in;
}

Nous utilisons jQuery pour remplir le DOM avec le contenu collé, puis traverser le DOM et supprimer les tags et les classes que nous ne voulons pas. Enfin, nous extrayons le balisage HTML nettoyé et le renvoyons à l’éditeur. Cette approche peut sembler alambiquée, mais elle est beaucoup moins sujette à l’erreur que l’utilisation d’expressions régulières pour assainir notre contenu.

Tout ce que vous avez à faire est de modifier la variable whitelist, qui contient une liste de balises pour permettre de passer votre filtre.

Une dernière chose : vous remarquerez peut-être que toute notre fonction JavaScript est contenue dans une chaîne de caractères. Cela peut sembler étrange, mais c’est nécessaire car WordPress stocke les options de configuration de TinyMCE sous la forme d’un tableau de chaînes de caractères.

 

Source : https://jonathannicol.com/blog/2015/02/19/clean-pasted-text-in-wordpress/