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>
.
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.
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 ..
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.
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-->")
Vous pouvez essayer d'utiliser <
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:
<style>th{width:80px}</style>
Pour le script:
<script>
$.address.unbind();
</script>