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);
|