Как я могу запретить TinyMCE добавлять CDATA в теги <script> и комментировать теги <style>?
Отложите проблемы, связанные с разрешением содержимого <script>
внутри веб-редактора; Я прекрасно их понимаю.
Я хочу разрешить элементы <style>
и <script>
внутри текстового содержимого, проблема в том, что всякий раз, когда я это делаю, TinyMCE меняет их на:
<style><!-- th{width:80px} --></style>
а содержимое script изменено на:
<script>// <![CDATA[
$.address.unbind();
// ]]></script>
В моей конфигурации TinyMCE init у меня есть:
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
Но я не могу найти способ предотвратить TinyMCE от отключения элементов <style>
и <script>
.
Ответы
Ответ 1
Я бы рекомендовал избегать любой прямой настройки сторонних библиотек, если этого можно избежать. Вместо этого я добавил пользовательский фильтр node в сериализатор редакторов во время инициализации, добавив следующее в объект конфигурации, переданный в вызов конструкции 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);
}
}
});
}
Надеюсь, это поможет другим застрять в одной лодке.
Ответ 2
Вы можете попробовать изменить 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))})
Пожалуйста, найдите и удалите указанную выше строку кода из файла.
Ответ 3
когда вы сохраняете содержимое tinymce, просто удалите эти теги с вывода, похожего на это:
$tinyOutput = str_replace(array("// <![CDATA[", "// ]]>"), array("", ""), $_POST['tinyOutput']);
.. затем сохраните на db..
Ответ 4
Для меня это сработало, чтобы удалить следующий код для отключения тэга script:
,o.length>0&&(i.firstChild.value="// <![CDATA[\n"+n(o)+"\n// ]]>")
И для формирования на теге стиля вы должны удалить:
&&(i.firstChild.value="<!--\n"+n(o)+"\n-->")