web-dev-qa-db-fra.com

Comment puis-je empêcher TinyMCE d'ajouter CDATA aux balises <script> et de commenter les balises <style>?

Laissons de côté les problèmes liés à l’autorisation du contenu <script> dans un éditeur Web; Je suis parfaitement au courant d'eux.

Ce que je veux, c'est autoriser les éléments <style> et <script> dans le contenu du texte. Le problème est que, chaque fois que je le fais, TinyMCE les modifie comme suit:

<style><!-- th{width:80px} --></style>

et le contenu du script est modifié en:

<script>// <![CDATA[
$.address.unbind();
// ]]></script>

Sur ma configuration d'initialisation TinyMCE, j'ai:

valid_elements : "*[*]",
extended_valid_elements : "*[*],script[charset|defer|language|src|type],style",
custom_elements: "*[*],script[charset|defer|language|src|type],style",
valid_children : "+body[style],+body[script]",
verify_html : false,
media_strict: false

Mais je n'arrive pas à trouver un moyen d'empêcher TinyMCE de désactiver les éléments <style> et <script>.

26
out_sid3r

Je recommanderais d'éviter toute personnalisation directe à des bibliothèques tierces si cela peut être évité. Au lieu de cela, j'ai ajouté un filtre de noeud personnalisé au sérialiseur des éditeurs lors de l'initialisation en ajoutant ce qui suit à l'objet config transmis à l'appel de construction tinymce:

init_instance_callback : function(editor) {
    // jw: this code is heavily borrowed from tinymce.jquery.js:12231 but modified so that it will
    //     just remove the escaping and not add it back.
    editor.serializer.addNodeFilter('script,style', function(nodes, name) {
        var i = nodes.length, node, value, type;

        function trim(value) {
            /*jshint maxlen:255 */
            /*eslint max-len:0 */
            return value.replace(/(<!--\[CDATA\[|\]\]-->)/g, '\n')
                    .replace(/^[\r\n]*|[\r\n]*$/g, '')
                    .replace(/^\s*((<!--)?(\s*\/\/)?\s*<!\[CDATA\[|(<!--\s*)?\/\*\s*<!\[CDATA\[\s*\*\/|(\/\/)?\s*<!--|\/\*\s*<!--\s*\*\/)\s*[\r\n]*/gi, '')
                    .replace(/\s*(\/\*\s*\]\]>\s*\*\/(-->)?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g, '');
        }
        while (i--) {
            node = nodes[i];
            value = node.firstChild ? node.firstChild.value : '';

            if (value.length > 0) {
                node.firstChild.value = trim(value);
            }
        }
    });
}

Espérons que cela aidera d'autres personnes coincées dans le même bateau.

7
Jonmark Weber

lorsque vous stockez du contenu tinymce, supprimez simplement ces balises de la sortie, comme ceci:

$tinyOutput = str_replace(array("// <![CDATA[", "// ]]>"), array("", ""), $_POST['tinyOutput']);

..alors sauver à db ..

2
netoper

Vous pouvez essayer de modifier le tinymce.min.js

,f.addNodeFilter("script,style",function(e,t){function n(e){return e.replace(/(<!--\[CDATA\[|\]\]-->)/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*((<!--)?(\s*\/\/)?\s*<!\[CDATA\[|(<!--\s*)?\/\*\s*<!\[CDATA\[\s*\*\/|(\/\/)?\s*<!--|\/\*\s*<!--\s*\*\/)\s*[\r\n]*/gi,"").replace(/\s*(\/\*\s*\]\]>\s*\*\/(-->)?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"")}for(var r=e.length,i,o,a;r--;)i=e[r],o=i.firstChild?i.firstChild.value:"","script"===t?(a=i.attr("type"),a&&i.attr("type","mce-no/type"==a?null:a.replace(/^mce\-/,"")),o.length>0&&(i.firstChild.value="// <![CDATA[\n"+n(o)+"\n// ]]>")):o.length>0&&(i.firstChild.value="<!--\n"+n(o)+"\n-->")}),f.addNodeFilter("#comment",function(e){for(var t=e.length,n;t--;)n=e[t],0===n.value.indexOf("[CDATA[")?(n.name="#cdata",n.type=4,n.value=n.value.replace(/^\[CDATA\[|\]\]$/g,"")):0===n.value.indexOf("mce:protected ")&&(n.name="#text",n.type=3,n.raw=!0,n.value=unescape(n.value).substr(14))})

Veuillez rechercher et supprimer la ligne de code ci-dessus du fichier.

2
naim shaikh

Pour moi, cela a fonctionné pour supprimer le code suivant pour désactiver la formulation de balises de script:

,o.length>0&&(i.firstChild.value="// <![CDATA[\n"+n(o)+"\n// ]]>")

Et pour formater sur une balise de style, vous devez supprimer:

&&(i.firstChild.value="<!--\n"+n(o)+"\n-->")
0
Vašek Šindýlek

Vous pouvez essayer d'utiliser &lt; au lieu de < pour les balises de style et de script. De cette façon, tinymce ne reconnaîtra pas les balises de style et de script.

Par exemple:

Pour le style:

&lt;style>th{width:80px}&lt;/style>

Pour le script:

&lt;script>
$.address.unbind();
&lt;/script>
0
Jayaram