danielebarchiesi@0: (function($) { danielebarchiesi@0: danielebarchiesi@0: Drupal.wysiwyg.editor.init.ckeditor = function(settings) { danielebarchiesi@0: // Plugins must only be loaded once. Only the settings from the first format danielebarchiesi@0: // will be used but they're identical anyway. danielebarchiesi@0: var registeredPlugins = {}; danielebarchiesi@0: for (var format in settings) { danielebarchiesi@0: if (Drupal.settings.wysiwyg.plugins[format]) { danielebarchiesi@0: // Register native external plugins. danielebarchiesi@0: // Array syntax required; 'native' is a predefined token in JavaScript. danielebarchiesi@0: for (var pluginName in Drupal.settings.wysiwyg.plugins[format]['native']) { danielebarchiesi@0: if (!registeredPlugins[pluginName]) { danielebarchiesi@0: var plugin = Drupal.settings.wysiwyg.plugins[format]['native'][pluginName]; danielebarchiesi@0: CKEDITOR.plugins.addExternal(pluginName, plugin.path, plugin.fileName); danielebarchiesi@0: registeredPlugins[pluginName] = true; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: // Register Drupal plugins. danielebarchiesi@0: for (var pluginName in Drupal.settings.wysiwyg.plugins[format].drupal) { danielebarchiesi@0: if (!registeredPlugins[pluginName]) { danielebarchiesi@0: Drupal.wysiwyg.editor.instance.ckeditor.addPlugin(pluginName, Drupal.settings.wysiwyg.plugins[format].drupal[pluginName], Drupal.settings.wysiwyg.plugins.drupal[pluginName]); danielebarchiesi@0: registeredPlugins[pluginName] = true; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: // Register Font styles (versions 3.2.1 and above). danielebarchiesi@0: if (Drupal.settings.wysiwyg.configs.ckeditor[format].stylesSet) { danielebarchiesi@0: CKEDITOR.stylesSet.add(format, Drupal.settings.wysiwyg.configs.ckeditor[format].stylesSet); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Attach this editor to a target element. danielebarchiesi@0: */ danielebarchiesi@0: Drupal.wysiwyg.editor.attach.ckeditor = function(context, params, settings) { danielebarchiesi@0: // Apply editor instance settings. danielebarchiesi@0: CKEDITOR.config.customConfig = ''; danielebarchiesi@0: danielebarchiesi@0: var $drupalToolbar = $('#toolbar', Drupal.overlayChild ? window.parent.document : document); danielebarchiesi@0: danielebarchiesi@0: settings.on = { danielebarchiesi@0: instanceReady: function(ev) { danielebarchiesi@0: var editor = ev.editor; danielebarchiesi@0: // Get a list of block, list and table tags from CKEditor's XHTML DTD. danielebarchiesi@0: // @see http://docs.cksource.com/CKEditor_3.x/Developers_Guide/Output_Formatting. danielebarchiesi@0: var dtd = CKEDITOR.dtd; danielebarchiesi@0: var tags = CKEDITOR.tools.extend({}, dtd.$block, dtd.$listItem, dtd.$tableContent); danielebarchiesi@0: // Set source formatting rules for each listed tag except
.
danielebarchiesi@0:       // Linebreaks can be inserted before or after opening and closing tags.
danielebarchiesi@0:       if (settings.apply_source_formatting) {
danielebarchiesi@0:         // Mimic FCKeditor output, by breaking lines between tags.
danielebarchiesi@0:         for (var tag in tags) {
danielebarchiesi@0:           if (tag == 'pre') {
danielebarchiesi@0:             continue;
danielebarchiesi@0:           }
danielebarchiesi@0:           this.dataProcessor.writer.setRules(tag, {
danielebarchiesi@0:             indent: true,
danielebarchiesi@0:             breakBeforeOpen: true,
danielebarchiesi@0:             breakAfterOpen: false,
danielebarchiesi@0:             breakBeforeClose: false,
danielebarchiesi@0:             breakAfterClose: true
danielebarchiesi@0:           });
danielebarchiesi@0:         }
danielebarchiesi@0:       }
danielebarchiesi@0:       else {
danielebarchiesi@0:         // CKEditor adds default formatting to 
, so we want to remove that danielebarchiesi@0: // here too. danielebarchiesi@0: tags.br = 1; danielebarchiesi@0: // No indents or linebreaks; danielebarchiesi@0: for (var tag in tags) { danielebarchiesi@0: if (tag == 'pre') { danielebarchiesi@0: continue; danielebarchiesi@0: } danielebarchiesi@0: this.dataProcessor.writer.setRules(tag, { danielebarchiesi@0: indent: false, danielebarchiesi@0: breakBeforeOpen: false, danielebarchiesi@0: breakAfterOpen: false, danielebarchiesi@0: breakBeforeClose: false, danielebarchiesi@0: breakAfterClose: false danielebarchiesi@0: }); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: }, danielebarchiesi@0: danielebarchiesi@0: pluginsLoaded: function(ev) { danielebarchiesi@0: // Override the conversion methods to let Drupal plugins modify the data. danielebarchiesi@0: var editor = ev.editor; danielebarchiesi@0: if (editor.dataProcessor && Drupal.settings.wysiwyg.plugins[params.format]) { danielebarchiesi@0: editor.dataProcessor.toHtml = CKEDITOR.tools.override(editor.dataProcessor.toHtml, function(originalToHtml) { danielebarchiesi@0: // Convert raw data for display in WYSIWYG mode. danielebarchiesi@0: return function(data, fixForBody) { danielebarchiesi@0: for (var plugin in Drupal.settings.wysiwyg.plugins[params.format].drupal) { danielebarchiesi@0: if (typeof Drupal.wysiwyg.plugins[plugin].attach == 'function') { danielebarchiesi@0: data = Drupal.wysiwyg.plugins[plugin].attach(data, Drupal.settings.wysiwyg.plugins.drupal[plugin], editor.name); danielebarchiesi@0: data = Drupal.wysiwyg.instances[params.field].prepareContent(data); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: return originalToHtml.call(this, data, fixForBody); danielebarchiesi@0: }; danielebarchiesi@0: }); danielebarchiesi@0: editor.dataProcessor.toDataFormat = CKEDITOR.tools.override(editor.dataProcessor.toDataFormat, function(originalToDataFormat) { danielebarchiesi@0: // Convert WYSIWYG mode content to raw data. danielebarchiesi@0: return function(data, fixForBody) { danielebarchiesi@0: data = originalToDataFormat.call(this, data, fixForBody); danielebarchiesi@0: for (var plugin in Drupal.settings.wysiwyg.plugins[params.format].drupal) { danielebarchiesi@0: if (typeof Drupal.wysiwyg.plugins[plugin].detach == 'function') { danielebarchiesi@0: data = Drupal.wysiwyg.plugins[plugin].detach(data, Drupal.settings.wysiwyg.plugins.drupal[plugin], editor.name); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: return data; danielebarchiesi@0: }; danielebarchiesi@0: }); danielebarchiesi@0: } danielebarchiesi@0: }, danielebarchiesi@0: danielebarchiesi@0: selectionChange: function (event) { danielebarchiesi@0: var pluginSettings = Drupal.settings.wysiwyg.plugins[params.format]; danielebarchiesi@0: if (pluginSettings && pluginSettings.drupal) { danielebarchiesi@0: $.each(pluginSettings.drupal, function (name) { danielebarchiesi@0: var plugin = Drupal.wysiwyg.plugins[name]; danielebarchiesi@0: if ($.isFunction(plugin.isNode)) { danielebarchiesi@0: var node = event.data.selection.getSelectedElement(); danielebarchiesi@0: var state = plugin.isNode(node ? node.$ : null) ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF; danielebarchiesi@0: event.editor.getCommand(name).setState(state); danielebarchiesi@0: } danielebarchiesi@0: }); danielebarchiesi@0: } danielebarchiesi@0: }, danielebarchiesi@0: danielebarchiesi@0: focus: function(ev) { danielebarchiesi@0: Drupal.wysiwyg.activeId = ev.editor.name; danielebarchiesi@0: }, danielebarchiesi@0: danielebarchiesi@0: afterCommandExec: function(ev) { danielebarchiesi@0: // Fix Drupal toolbar obscuring editor toolbar in fullscreen mode. danielebarchiesi@0: if (ev.data.name != 'maximize') { danielebarchiesi@0: return; danielebarchiesi@0: } danielebarchiesi@0: if (ev.data.command.state == CKEDITOR.TRISTATE_ON) { danielebarchiesi@0: $drupalToolbar.hide(); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: $drupalToolbar.show(); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: // Attach editor. danielebarchiesi@0: CKEDITOR.replace(params.field, settings); danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Detach a single or all editors. danielebarchiesi@0: * danielebarchiesi@0: * @todo 3.x: editor.prototype.getInstances() should always return an array danielebarchiesi@0: * containing all instances or the passed in params.field instance, but danielebarchiesi@0: * always return an array to simplify all detach functions. danielebarchiesi@0: */ danielebarchiesi@0: Drupal.wysiwyg.editor.detach.ckeditor = function (context, params, trigger) { danielebarchiesi@0: var method = (trigger == 'serialize') ? 'updateElement' : 'destroy'; danielebarchiesi@0: if (typeof params != 'undefined') { danielebarchiesi@0: var instance = CKEDITOR.instances[params.field]; danielebarchiesi@0: if (instance) { danielebarchiesi@0: instance[method](); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: for (var instanceName in CKEDITOR.instances) { danielebarchiesi@0: if (CKEDITOR.instances.hasOwnProperty(instanceName)) { danielebarchiesi@0: CKEDITOR.instances[instanceName][method](); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: Drupal.wysiwyg.editor.instance.ckeditor = { danielebarchiesi@0: addPlugin: function(pluginName, settings, pluginSettings) { danielebarchiesi@0: CKEDITOR.plugins.add(pluginName, { danielebarchiesi@0: // Wrap Drupal plugin in a proxy pluygin. danielebarchiesi@0: init: function(editor) { danielebarchiesi@0: if (settings.css) { danielebarchiesi@0: editor.on('mode', function(ev) { danielebarchiesi@0: if (ev.editor.mode == 'wysiwyg') { danielebarchiesi@0: // Inject CSS files directly into the editing area head tag. danielebarchiesi@0: $('head', $('#cke_contents_' + ev.editor.name + ' iframe').eq(0).contents()).append(''); danielebarchiesi@0: } danielebarchiesi@0: }); danielebarchiesi@0: } danielebarchiesi@0: if (typeof Drupal.wysiwyg.plugins[pluginName].invoke == 'function') { danielebarchiesi@0: var pluginCommand = { danielebarchiesi@0: exec: function (editor) { danielebarchiesi@0: var data = { format: 'html', node: null, content: '' }; danielebarchiesi@0: var selection = editor.getSelection(); danielebarchiesi@0: if (selection) { danielebarchiesi@0: data.node = selection.getSelectedElement(); danielebarchiesi@0: if (data.node) { danielebarchiesi@0: data.node = data.node.$; danielebarchiesi@0: } danielebarchiesi@0: if (selection.getType() == CKEDITOR.SELECTION_TEXT) { danielebarchiesi@0: if (CKEDITOR.env.ie) { danielebarchiesi@0: data.content = selection.getNative().createRange().text; danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: data.content = selection.getNative().toString(); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: else if (data.node) { danielebarchiesi@0: // content is supposed to contain the "outerHTML". danielebarchiesi@0: data.content = data.node.parentNode.innerHTML; danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: Drupal.wysiwyg.plugins[pluginName].invoke(data, pluginSettings, editor.name); danielebarchiesi@0: } danielebarchiesi@0: }; danielebarchiesi@0: editor.addCommand(pluginName, pluginCommand); danielebarchiesi@0: } danielebarchiesi@0: editor.ui.addButton(pluginName, { danielebarchiesi@0: label: settings.iconTitle, danielebarchiesi@0: command: pluginName, danielebarchiesi@0: icon: settings.icon danielebarchiesi@0: }); danielebarchiesi@0: danielebarchiesi@0: // @todo Add button state handling. danielebarchiesi@0: } danielebarchiesi@0: }); danielebarchiesi@0: }, danielebarchiesi@0: prepareContent: function(content) { danielebarchiesi@0: // @todo Don't know if we need this yet. danielebarchiesi@0: return content; danielebarchiesi@0: }, danielebarchiesi@0: danielebarchiesi@0: insert: function(content) { danielebarchiesi@0: content = this.prepareContent(content); danielebarchiesi@0: CKEDITOR.instances[this.field].insertHtml(content); danielebarchiesi@0: }, danielebarchiesi@0: danielebarchiesi@0: setContent: function (content) { danielebarchiesi@0: CKEDITOR.instances[this.field].setData(content); danielebarchiesi@0: }, danielebarchiesi@0: danielebarchiesi@0: getContent: function () { danielebarchiesi@0: return CKEDITOR.instances[this.field].getData(); danielebarchiesi@0: } danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: })(jQuery);