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