annotate sites/all/modules/wysiwyg/editors/js/ckeditor-3.0.js @ 13:134d4b2e75f6

updated quicktabs and google analytics modules
author danieleb <danielebarchiesi@me.com>
date Tue, 29 Oct 2013 13:48:59 +0000
parents ff03f76ab3fe
children
rev   line source
danielebarchiesi@0 1 (function($) {
danielebarchiesi@0 2
danielebarchiesi@0 3 Drupal.wysiwyg.editor.init.ckeditor = function(settings) {
danielebarchiesi@0 4 // Plugins must only be loaded once. Only the settings from the first format
danielebarchiesi@0 5 // will be used but they're identical anyway.
danielebarchiesi@0 6 var registeredPlugins = {};
danielebarchiesi@0 7 for (var format in settings) {
danielebarchiesi@0 8 if (Drupal.settings.wysiwyg.plugins[format]) {
danielebarchiesi@0 9 // Register native external plugins.
danielebarchiesi@0 10 // Array syntax required; 'native' is a predefined token in JavaScript.
danielebarchiesi@0 11 for (var pluginName in Drupal.settings.wysiwyg.plugins[format]['native']) {
danielebarchiesi@0 12 if (!registeredPlugins[pluginName]) {
danielebarchiesi@0 13 var plugin = Drupal.settings.wysiwyg.plugins[format]['native'][pluginName];
danielebarchiesi@0 14 CKEDITOR.plugins.addExternal(pluginName, plugin.path, plugin.fileName);
danielebarchiesi@0 15 registeredPlugins[pluginName] = true;
danielebarchiesi@0 16 }
danielebarchiesi@0 17 }
danielebarchiesi@0 18 // Register Drupal plugins.
danielebarchiesi@0 19 for (var pluginName in Drupal.settings.wysiwyg.plugins[format].drupal) {
danielebarchiesi@0 20 if (!registeredPlugins[pluginName]) {
danielebarchiesi@0 21 Drupal.wysiwyg.editor.instance.ckeditor.addPlugin(pluginName, Drupal.settings.wysiwyg.plugins[format].drupal[pluginName], Drupal.settings.wysiwyg.plugins.drupal[pluginName]);
danielebarchiesi@0 22 registeredPlugins[pluginName] = true;
danielebarchiesi@0 23 }
danielebarchiesi@0 24 }
danielebarchiesi@0 25 }
danielebarchiesi@0 26 // Register Font styles (versions 3.2.1 and above).
danielebarchiesi@0 27 if (Drupal.settings.wysiwyg.configs.ckeditor[format].stylesSet) {
danielebarchiesi@0 28 CKEDITOR.stylesSet.add(format, Drupal.settings.wysiwyg.configs.ckeditor[format].stylesSet);
danielebarchiesi@0 29 }
danielebarchiesi@0 30 }
danielebarchiesi@0 31 };
danielebarchiesi@0 32
danielebarchiesi@0 33
danielebarchiesi@0 34 /**
danielebarchiesi@0 35 * Attach this editor to a target element.
danielebarchiesi@0 36 */
danielebarchiesi@0 37 Drupal.wysiwyg.editor.attach.ckeditor = function(context, params, settings) {
danielebarchiesi@0 38 // Apply editor instance settings.
danielebarchiesi@0 39 CKEDITOR.config.customConfig = '';
danielebarchiesi@0 40
danielebarchiesi@0 41 var $drupalToolbar = $('#toolbar', Drupal.overlayChild ? window.parent.document : document);
danielebarchiesi@0 42
danielebarchiesi@0 43 settings.on = {
danielebarchiesi@0 44 instanceReady: function(ev) {
danielebarchiesi@0 45 var editor = ev.editor;
danielebarchiesi@0 46 // Get a list of block, list and table tags from CKEditor's XHTML DTD.
danielebarchiesi@0 47 // @see http://docs.cksource.com/CKEditor_3.x/Developers_Guide/Output_Formatting.
danielebarchiesi@0 48 var dtd = CKEDITOR.dtd;
danielebarchiesi@0 49 var tags = CKEDITOR.tools.extend({}, dtd.$block, dtd.$listItem, dtd.$tableContent);
danielebarchiesi@0 50 // Set source formatting rules for each listed tag except <pre>.
danielebarchiesi@0 51 // Linebreaks can be inserted before or after opening and closing tags.
danielebarchiesi@0 52 if (settings.apply_source_formatting) {
danielebarchiesi@0 53 // Mimic FCKeditor output, by breaking lines between tags.
danielebarchiesi@0 54 for (var tag in tags) {
danielebarchiesi@0 55 if (tag == 'pre') {
danielebarchiesi@0 56 continue;
danielebarchiesi@0 57 }
danielebarchiesi@0 58 this.dataProcessor.writer.setRules(tag, {
danielebarchiesi@0 59 indent: true,
danielebarchiesi@0 60 breakBeforeOpen: true,
danielebarchiesi@0 61 breakAfterOpen: false,
danielebarchiesi@0 62 breakBeforeClose: false,
danielebarchiesi@0 63 breakAfterClose: true
danielebarchiesi@0 64 });
danielebarchiesi@0 65 }
danielebarchiesi@0 66 }
danielebarchiesi@0 67 else {
danielebarchiesi@0 68 // CKEditor adds default formatting to <br>, so we want to remove that
danielebarchiesi@0 69 // here too.
danielebarchiesi@0 70 tags.br = 1;
danielebarchiesi@0 71 // No indents or linebreaks;
danielebarchiesi@0 72 for (var tag in tags) {
danielebarchiesi@0 73 if (tag == 'pre') {
danielebarchiesi@0 74 continue;
danielebarchiesi@0 75 }
danielebarchiesi@0 76 this.dataProcessor.writer.setRules(tag, {
danielebarchiesi@0 77 indent: false,
danielebarchiesi@0 78 breakBeforeOpen: false,
danielebarchiesi@0 79 breakAfterOpen: false,
danielebarchiesi@0 80 breakBeforeClose: false,
danielebarchiesi@0 81 breakAfterClose: false
danielebarchiesi@0 82 });
danielebarchiesi@0 83 }
danielebarchiesi@0 84 }
danielebarchiesi@0 85 },
danielebarchiesi@0 86
danielebarchiesi@0 87 pluginsLoaded: function(ev) {
danielebarchiesi@0 88 // Override the conversion methods to let Drupal plugins modify the data.
danielebarchiesi@0 89 var editor = ev.editor;
danielebarchiesi@0 90 if (editor.dataProcessor && Drupal.settings.wysiwyg.plugins[params.format]) {
danielebarchiesi@0 91 editor.dataProcessor.toHtml = CKEDITOR.tools.override(editor.dataProcessor.toHtml, function(originalToHtml) {
danielebarchiesi@0 92 // Convert raw data for display in WYSIWYG mode.
danielebarchiesi@0 93 return function(data, fixForBody) {
danielebarchiesi@0 94 for (var plugin in Drupal.settings.wysiwyg.plugins[params.format].drupal) {
danielebarchiesi@0 95 if (typeof Drupal.wysiwyg.plugins[plugin].attach == 'function') {
danielebarchiesi@0 96 data = Drupal.wysiwyg.plugins[plugin].attach(data, Drupal.settings.wysiwyg.plugins.drupal[plugin], editor.name);
danielebarchiesi@0 97 data = Drupal.wysiwyg.instances[params.field].prepareContent(data);
danielebarchiesi@0 98 }
danielebarchiesi@0 99 }
danielebarchiesi@0 100 return originalToHtml.call(this, data, fixForBody);
danielebarchiesi@0 101 };
danielebarchiesi@0 102 });
danielebarchiesi@0 103 editor.dataProcessor.toDataFormat = CKEDITOR.tools.override(editor.dataProcessor.toDataFormat, function(originalToDataFormat) {
danielebarchiesi@0 104 // Convert WYSIWYG mode content to raw data.
danielebarchiesi@0 105 return function(data, fixForBody) {
danielebarchiesi@0 106 data = originalToDataFormat.call(this, data, fixForBody);
danielebarchiesi@0 107 for (var plugin in Drupal.settings.wysiwyg.plugins[params.format].drupal) {
danielebarchiesi@0 108 if (typeof Drupal.wysiwyg.plugins[plugin].detach == 'function') {
danielebarchiesi@0 109 data = Drupal.wysiwyg.plugins[plugin].detach(data, Drupal.settings.wysiwyg.plugins.drupal[plugin], editor.name);
danielebarchiesi@0 110 }
danielebarchiesi@0 111 }
danielebarchiesi@0 112 return data;
danielebarchiesi@0 113 };
danielebarchiesi@0 114 });
danielebarchiesi@0 115 }
danielebarchiesi@0 116 },
danielebarchiesi@0 117
danielebarchiesi@0 118 selectionChange: function (event) {
danielebarchiesi@0 119 var pluginSettings = Drupal.settings.wysiwyg.plugins[params.format];
danielebarchiesi@0 120 if (pluginSettings && pluginSettings.drupal) {
danielebarchiesi@0 121 $.each(pluginSettings.drupal, function (name) {
danielebarchiesi@0 122 var plugin = Drupal.wysiwyg.plugins[name];
danielebarchiesi@0 123 if ($.isFunction(plugin.isNode)) {
danielebarchiesi@0 124 var node = event.data.selection.getSelectedElement();
danielebarchiesi@0 125 var state = plugin.isNode(node ? node.$ : null) ? CKEDITOR.TRISTATE_ON : CKEDITOR.TRISTATE_OFF;
danielebarchiesi@0 126 event.editor.getCommand(name).setState(state);
danielebarchiesi@0 127 }
danielebarchiesi@0 128 });
danielebarchiesi@0 129 }
danielebarchiesi@0 130 },
danielebarchiesi@0 131
danielebarchiesi@0 132 focus: function(ev) {
danielebarchiesi@0 133 Drupal.wysiwyg.activeId = ev.editor.name;
danielebarchiesi@0 134 },
danielebarchiesi@0 135
danielebarchiesi@0 136 afterCommandExec: function(ev) {
danielebarchiesi@0 137 // Fix Drupal toolbar obscuring editor toolbar in fullscreen mode.
danielebarchiesi@0 138 if (ev.data.name != 'maximize') {
danielebarchiesi@0 139 return;
danielebarchiesi@0 140 }
danielebarchiesi@0 141 if (ev.data.command.state == CKEDITOR.TRISTATE_ON) {
danielebarchiesi@0 142 $drupalToolbar.hide();
danielebarchiesi@0 143 }
danielebarchiesi@0 144 else {
danielebarchiesi@0 145 $drupalToolbar.show();
danielebarchiesi@0 146 }
danielebarchiesi@0 147 }
danielebarchiesi@0 148 };
danielebarchiesi@0 149
danielebarchiesi@0 150 // Attach editor.
danielebarchiesi@0 151 CKEDITOR.replace(params.field, settings);
danielebarchiesi@0 152 };
danielebarchiesi@0 153
danielebarchiesi@0 154 /**
danielebarchiesi@0 155 * Detach a single or all editors.
danielebarchiesi@0 156 *
danielebarchiesi@0 157 * @todo 3.x: editor.prototype.getInstances() should always return an array
danielebarchiesi@0 158 * containing all instances or the passed in params.field instance, but
danielebarchiesi@0 159 * always return an array to simplify all detach functions.
danielebarchiesi@0 160 */
danielebarchiesi@0 161 Drupal.wysiwyg.editor.detach.ckeditor = function (context, params, trigger) {
danielebarchiesi@0 162 var method = (trigger == 'serialize') ? 'updateElement' : 'destroy';
danielebarchiesi@0 163 if (typeof params != 'undefined') {
danielebarchiesi@0 164 var instance = CKEDITOR.instances[params.field];
danielebarchiesi@0 165 if (instance) {
danielebarchiesi@0 166 instance[method]();
danielebarchiesi@0 167 }
danielebarchiesi@0 168 }
danielebarchiesi@0 169 else {
danielebarchiesi@0 170 for (var instanceName in CKEDITOR.instances) {
danielebarchiesi@0 171 if (CKEDITOR.instances.hasOwnProperty(instanceName)) {
danielebarchiesi@0 172 CKEDITOR.instances[instanceName][method]();
danielebarchiesi@0 173 }
danielebarchiesi@0 174 }
danielebarchiesi@0 175 }
danielebarchiesi@0 176 };
danielebarchiesi@0 177
danielebarchiesi@0 178 Drupal.wysiwyg.editor.instance.ckeditor = {
danielebarchiesi@0 179 addPlugin: function(pluginName, settings, pluginSettings) {
danielebarchiesi@0 180 CKEDITOR.plugins.add(pluginName, {
danielebarchiesi@0 181 // Wrap Drupal plugin in a proxy pluygin.
danielebarchiesi@0 182 init: function(editor) {
danielebarchiesi@0 183 if (settings.css) {
danielebarchiesi@0 184 editor.on('mode', function(ev) {
danielebarchiesi@0 185 if (ev.editor.mode == 'wysiwyg') {
danielebarchiesi@0 186 // Inject CSS files directly into the editing area head tag.
danielebarchiesi@0 187 $('head', $('#cke_contents_' + ev.editor.name + ' iframe').eq(0).contents()).append('<link rel="stylesheet" href="' + settings.css + '" type="text/css" >');
danielebarchiesi@0 188 }
danielebarchiesi@0 189 });
danielebarchiesi@0 190 }
danielebarchiesi@0 191 if (typeof Drupal.wysiwyg.plugins[pluginName].invoke == 'function') {
danielebarchiesi@0 192 var pluginCommand = {
danielebarchiesi@0 193 exec: function (editor) {
danielebarchiesi@0 194 var data = { format: 'html', node: null, content: '' };
danielebarchiesi@0 195 var selection = editor.getSelection();
danielebarchiesi@0 196 if (selection) {
danielebarchiesi@0 197 data.node = selection.getSelectedElement();
danielebarchiesi@0 198 if (data.node) {
danielebarchiesi@0 199 data.node = data.node.$;
danielebarchiesi@0 200 }
danielebarchiesi@0 201 if (selection.getType() == CKEDITOR.SELECTION_TEXT) {
danielebarchiesi@0 202 if (CKEDITOR.env.ie) {
danielebarchiesi@0 203 data.content = selection.getNative().createRange().text;
danielebarchiesi@0 204 }
danielebarchiesi@0 205 else {
danielebarchiesi@0 206 data.content = selection.getNative().toString();
danielebarchiesi@0 207 }
danielebarchiesi@0 208 }
danielebarchiesi@0 209 else if (data.node) {
danielebarchiesi@0 210 // content is supposed to contain the "outerHTML".
danielebarchiesi@0 211 data.content = data.node.parentNode.innerHTML;
danielebarchiesi@0 212 }
danielebarchiesi@0 213 }
danielebarchiesi@0 214 Drupal.wysiwyg.plugins[pluginName].invoke(data, pluginSettings, editor.name);
danielebarchiesi@0 215 }
danielebarchiesi@0 216 };
danielebarchiesi@0 217 editor.addCommand(pluginName, pluginCommand);
danielebarchiesi@0 218 }
danielebarchiesi@0 219 editor.ui.addButton(pluginName, {
danielebarchiesi@0 220 label: settings.iconTitle,
danielebarchiesi@0 221 command: pluginName,
danielebarchiesi@0 222 icon: settings.icon
danielebarchiesi@0 223 });
danielebarchiesi@0 224
danielebarchiesi@0 225 // @todo Add button state handling.
danielebarchiesi@0 226 }
danielebarchiesi@0 227 });
danielebarchiesi@0 228 },
danielebarchiesi@0 229 prepareContent: function(content) {
danielebarchiesi@0 230 // @todo Don't know if we need this yet.
danielebarchiesi@0 231 return content;
danielebarchiesi@0 232 },
danielebarchiesi@0 233
danielebarchiesi@0 234 insert: function(content) {
danielebarchiesi@0 235 content = this.prepareContent(content);
danielebarchiesi@0 236 CKEDITOR.instances[this.field].insertHtml(content);
danielebarchiesi@0 237 },
danielebarchiesi@0 238
danielebarchiesi@0 239 setContent: function (content) {
danielebarchiesi@0 240 CKEDITOR.instances[this.field].setData(content);
danielebarchiesi@0 241 },
danielebarchiesi@0 242
danielebarchiesi@0 243 getContent: function () {
danielebarchiesi@0 244 return CKEDITOR.instances[this.field].getData();
danielebarchiesi@0 245 }
danielebarchiesi@0 246 };
danielebarchiesi@0 247
danielebarchiesi@0 248 })(jQuery);