Files
2026-05-25 11:39:14 +07:00

81 lines
3.1 KiB
Plaintext

/* global CKEDITOR, django */
;(function() {
var el = document.getElementById('ckeditor-init-script');
if (el && !window.CKEDITOR_BASEPATH) {
window.CKEDITOR_BASEPATH = el.getAttribute('data-ckeditor-basepath');
}
function runInitialisers() {
if (!window.CKEDITOR) {
setTimeout(runInitialisers, 100);
return;
}
initialiseCKEditor();
initialiseCKEditorInInlinedForms();
}
if (document.readyState != 'loading' && document.body) {
document.addEventListener('DOMContentLoaded', initialiseCKEditor);
runInitialisers();
} else {
document.addEventListener('DOMContentLoaded', runInitialisers);
}
var filterStyles = {
attributes: {
style: function( value, element ) {
value = CKEDITOR.tools.parseCssText( value, 1 );
// If there's no CSS rules left, discard style attribute.
if (value.color == '#000000') return false;
}
}
};
function initialiseCKEditor() {
var textareas = Array.prototype.slice.call(document.querySelectorAll('textarea[data-type=ckeditortype]'));
for (var i=0; i<textareas.length; ++i) {
var t = textareas[i];
if (t.getAttribute('data-processed') == '0' && t.id.indexOf('__prefix__') == -1) {
t.setAttribute('data-processed', '1');
var ext = JSON.parse(t.getAttribute('data-external-plugin-resources'));
for (var j=0; j<ext.length; ++j) {
CKEDITOR.plugins.addExternal(ext[j][0], ext[j][1], ext[j][2]);
}
var conf = JSON.parse(t.getAttribute('data-config'));
conf.on = {
instanceReady: function(evt) {
evt.editor.pasteFilter = evt.editor.activeFilter.clone();
// evt.editor.pasteFilter.allow('div[data-plyr-embed-id,data-plyr-provider]');
evt.editor.pasteFilter.disallow('span{font-weight,font-size,font-family,text-decoration}');
evt.editor.pasteFilter.disallow('div{margin-left}');
},
paste: function(evt) {
var pasteFilter = evt.editor.pasteFilter;
var fragment = CKEDITOR.htmlParser.fragment.fromHtml( evt.data.dataValue ),
writer = new CKEDITOR.htmlParser.basicWriter();
pasteFilter.applyTo( fragment );
fragment.writeHtml( writer );
evt.data.dataValue = writer.getHtml();
// Filter data that comes INTO the editor.
this.dataProcessor.dataFilter.addRules( filterStyles );
// Filter data that comes OUT of the editor.
this.dataProcessor.htmlFilter.addRules( filterStyles );
}
};
CKEDITOR.replace(t.id, conf);
}
}
}
function initialiseCKEditorInInlinedForms() {
if (typeof django === 'object' && django.jQuery) {
django.jQuery(document).on('formset:added', initialiseCKEditor);
}
}
window.initialiseCKEditor = initialiseCKEditor;
window.initialiseCKEditorInInlinedForms = initialiseCKEditorInInlinedForms;
}());