2015-03-11 12 views
24

Lasciamo da parte il problema di consentire il contenuto di <script> all'interno di un editor Web; Sono perfettamente consapevole di loro.Come impedire a TinyMCE di aggiungere CDATA ai tag <script> e di commentare i tag <style>?

Quello che voglio è quello di permettere <style> e <script> elementi all'interno del contenuto del testo, il problema è che, ogni volta che faccio questo, TinyMCE li cambia in:

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

e il contenuto dello script viene modificato in:

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

sulla configurazione di init TinyMCE, ho:

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 

Ma non riesco a trovare un modo per impedire a TinyMCE di di disabilitare gli elementi <style> e <script>.

+0

Hai mai trovato il modo di rimuovere lo dai tag di stile all'interno di tinyMCE? – BenRacicot

+0

Da quello che sto leggendo sembra che TinyMCE produca XHTML e avvolga il contenuto dello stile in un commento per impedire a qualsiasi parser XML di non analizzare i contenuti (poiché tutti i browser supportano la sintassi dei commenti). Edit: hai provato a usare 'cleanup: false'? – csilk

+0

@BenRacicot perché si desidera rimuovere dai tag di stile? –

risposta

2

Si può provare che modifica i 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))}) 

prega, trovare e rimuovere la riga precedente di codice dal file.

+0

Questo causa problemi con l'attributo type. Ora aggiunge 'mce-' a tutti gli attributi di tipo. Sembra che il '' rimuova dai tag di stile la sua rottura '

1

quando si memorizzano i contenuti TinyMCE, è sufficiente rimuovere questi tag da un risultato simile in questo modo:

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

..quindi salva nel db ..

+0

Preferisco questo, ma non voglio alterare il codice 'tinymce.min.js'. Grazie. –

6

vorrei raccomandare di evitare qualsiasi personalizzazione diretto a librerie di terze parti se può essere evitato. Invece ho aggiunto un filtro nodo personalizzato alla redazione serializzatore durante l'inizializzazione aggiungendo il seguente all'oggetto config passato nella chiamata costruzione 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); 
      } 
     } 
    }); 
} 

Speriamo che questo aiuterà gli altri bloccati nella stessa barca.

+0

Funziona perfettamente, non posso credere di essere il primo voto per una risposta così "fatta bene" –

0

Per me ha funzionato per rimuovere il seguente codice per la disattivazione tag script formattazione:

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

E per la formattazione sul tag di stile, è necessario rimuovere:

&&(i.firstChild.value="<!--\n"+n(o)+"\n-->") 
Problemi correlati