source: trunk/web/app/plugins/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js @ 1

Last change on this file since 1 was 1, checked in by dj3c1t, 12 years ago

import initial

File size: 12.2 KB
Line 
1/**
2 * $Id: editor_plugin_src.js 520 2008-01-07 16:30:32Z spocke $
3 *
4 * @author Moxiecode
5 * @copyright Copyright © 2004-2008, Moxiecode Systems AB, All rights reserved.
6 */
7
8(function() {
9        var Event = tinymce.dom.Event;
10
11        tinymce.create('tinymce.plugins.PastePlugin', {
12                init : function(ed, url) {
13                        var t = this;
14
15                        t.editor = ed; 
16
17                        // Register commands
18                        ed.addCommand('mcePasteText', function(ui, v) {
19                                if (ui) {
20                                        ed.windowManager.open({
21                                                file : url + '/pastetext.htm',
22                                                width : 450,
23                                                height : 400,
24                                                inline : 1
25                                        }, {
26                                                plugin_url : url
27                                        });
28                                } else
29                                        t._insertText(v.html, v.linebreaks);
30                        });
31
32                        ed.addCommand('mcePasteWord', function(ui, v) {
33                                if (ui) {
34                                        ed.windowManager.open({
35                                                file : url + '/pasteword.htm',
36                                                width : 450,
37                                                height : 400,
38                                                inline : 1
39                                        }, {
40                                                plugin_url : url
41                                        });
42                                } else
43                                        t._insertWordContent(v);
44                        });
45
46                        ed.addCommand('mceSelectAll', function() {
47                                ed.execCommand('selectall'); 
48                        });
49
50                        // Register buttons
51                        ed.addButton('pastetext', {title : 'paste.paste_text_desc', cmd : 'mcePasteText', ui : true});
52                        ed.addButton('pasteword', {title : 'paste.paste_word_desc', cmd : 'mcePasteWord', ui : true});
53                        ed.addButton('selectall', {title : 'paste.selectall_desc', cmd : 'mceSelectAll'});
54
55                        if (ed.getParam("paste_auto_cleanup_on_paste", false)) {
56                                ed.onPaste.add(function(ed, e) {
57                                        return t._handlePasteEvent(e)
58                                });
59                        }
60
61                        if (!tinymce.isIE && ed.getParam("paste_auto_cleanup_on_paste", false)) {
62                                // Force paste dialog if non IE browser
63                                ed.onKeyDown.add(function(ed, e) {
64                                        if (e.ctrlKey && e.keyCode == 86) {
65                                                window.setTimeout(function() {
66                                                        ed.execCommand("mcePasteText", true);
67                                                }, 1);
68
69                                                Event.cancel(e);
70                                        }
71                                });
72                        }
73                },
74
75                getInfo : function() {
76                        return {
77                                longname : 'Paste text/word',
78                                author : 'Moxiecode Systems AB',
79                                authorurl : 'http://tinymce.moxiecode.com',
80                                infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste',
81                                version : tinymce.majorVersion + "." + tinymce.minorVersion
82                        };
83                },
84
85                // Private methods
86
87                _handlePasteEvent : function(e) {
88                        var html = this._clipboardHTML(), ed = this.editor, sel = ed.selection, r;
89
90                        // Removes italic, strong etc, the if was needed due to bug #1437114
91                        if (ed && (r = sel.getRng()) && r.text.length > 0)
92                                ed.execCommand('delete');
93
94                        if (html && html.length > 0)
95                                ed.execCommand('mcePasteWord', false, html);
96
97                        return Event.cancel(e);
98                },
99
100                _insertText : function(content, bLinebreaks) { 
101                        if (content && content.length > 0) {
102                                if (bLinebreaks) { 
103                                        // Special paragraph treatment
104                                        if (this.editor.getParam("paste_create_paragraphs", true)) {
105                                                var rl = this.editor.getParam("paste_replace_list", '\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');
106                                                for (var i=0; i<rl.length; i+=2)
107                                                        content = content.replace(new RegExp(rl[i], 'gi'), rl[i+1]);
108
109                                                content = content.replace(/\r\n\r\n/g, '</p><p>');
110                                                content = content.replace(/\r\r/g, '</p><p>');
111                                                content = content.replace(/\n\n/g, '</p><p>');
112
113                                                // Has paragraphs
114                                                if ((pos = content.indexOf('</p><p>')) != -1) { 
115                                                        this.editor.execCommand("Delete"); 
116
117                                                        var node = this.editor.selection.getNode(); 
118
119                                                        // Get list of elements to break
120                                                        var breakElms = [];
121
122                                                        do { 
123                                                                if (node.nodeType == 1) { 
124                                                                        // Don't break tables and break at body
125                                                                        if (node.nodeName == "TD" || node.nodeName == "BODY") 
126                                                                                break; 
127                       
128                                                                        breakElms[breakElms.length] = node; 
129                                                                } 
130                                                        } while(node = node.parentNode); 
131
132                                                        var before = "", after = "</p>"; 
133                                                        before += content.substring(0, pos); 
134
135                                                        for (var i=0; i<breakElms.length; i++) { 
136                                                                before += "</" + breakElms[i].nodeName + ">"; 
137                                                                after += "<" + breakElms[(breakElms.length-1)-i].nodeName + ">"; 
138                                                        } 
139
140                                                        before += "<p>"; 
141                                                        content = before + content.substring(pos+7) + after; 
142                                                } 
143                                        } 
144
145                                        if (this.editor.getParam("paste_create_linebreaks", true)) {
146                                                content = content.replace(/\r\n/g, '<br />');
147                                                content = content.replace(/\r/g, '<br />');
148                                                content = content.replace(/\n/g, '<br />');
149                                        }
150                                } 
151                       
152                                this.editor.execCommand("mceInsertRawHTML", false, content); 
153                        }
154                },
155
156                _insertWordContent : function(content) { 
157                        var t = this, ed = t.editor;
158
159                        if (content && content.length > 0) {
160                                // Cleanup Word content
161                                var bull = String.fromCharCode(8226);
162                                var middot = String.fromCharCode(183);
163                                var cb;
164
165                                if ((cb = this.editor.getParam("paste_insert_word_content_callback", "")) != "")
166                                        content = eval(cb + "('before', content)");
167
168                                var rl = this.editor.getParam("paste_replace_list", '\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');
169                                for (var i=0; i<rl.length; i+=2)
170                                        content = content.replace(new RegExp(rl[i], 'gi'), rl[i+1]);
171
172                                if (this.editor.getParam("paste_convert_headers_to_strong", false)) {
173                                        content = content.replace(new RegExp('<p class=MsoHeading.*?>(.*?)<\/p>', 'gi'), '<p><b>$1</b></p>');
174                                }
175
176                                content = content.replace(new RegExp('tab-stops: list [0-9]+.0pt">', 'gi'), '">' + "--list--");
177                                content = content.replace(new RegExp(bull + "(.*?)<BR>", "gi"), "<p>" + middot + "$1</p>");
178                                content = content.replace(new RegExp('<SPAN style="mso-list: Ignore">', 'gi'), "<span>" + bull); // Covert to bull list
179                                content = content.replace(/<o:p><\/o:p>/gi, "");
180                                content = content.replace(new RegExp('<br style="page-break-before: always;.*>', 'gi'), '-- page break --'); // Replace pagebreaks
181                                content = content.replace(new RegExp('<(!--)([^>]*)(--)>', 'g'), "");  // Word comments
182
183                                if (this.editor.getParam("paste_remove_spans", true))
184                                        content = content.replace(/<\/?span[^>]*>/gi, "");
185
186                                if (this.editor.getParam("paste_remove_styles", true))
187                                        content = content.replace(new RegExp('<(\\w[^>]*) style="([^"]*)"([^>]*)', 'gi'), "<$1$3");
188
189                                content = content.replace(/<\/?font[^>]*>/gi, "");
190
191                                // Strips class attributes.
192                                switch (this.editor.getParam("paste_strip_class_attributes", "all")) {
193                                        case "all":
194                                                content = content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3");
195                                                break;
196
197                                        case "mso":
198                                                content = content.replace(new RegExp('<(\\w[^>]*) class="?mso([^ |>]*)([^>]*)', 'gi'), "<$1$3");
199                                                break;
200                                }
201
202                                content = content.replace(new RegExp('href="?' + this._reEscape("" + document.location) + '', 'gi'), 'href="' + this.editor.documentBaseURI.getURI());
203                                content = content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3");
204                                content = content.replace(/<\\?\?xml[^>]*>/gi, "");
205                                content = content.replace(/<\/?\w+:[^>]*>/gi, "");
206                                content = content.replace(/-- page break --\s*<p>&nbsp;<\/p>/gi, ""); // Remove pagebreaks
207                                content = content.replace(/-- page break --/gi, ""); // Remove pagebreaks
208
209                //              content = content.replace(/\/?&nbsp;*/gi, ""); &nbsp;
210                //              content = content.replace(/<p>&nbsp;<\/p>/gi, '');
211
212                                if (!this.editor.getParam('force_p_newlines')) {
213                                        content = content.replace('', '' ,'gi');
214                                        content = content.replace('</p>', '<br /><br />' ,'gi');
215                                }
216
217                                if (!tinymce.isIE && !this.editor.getParam('force_p_newlines')) {
218                                        content = content.replace(/<\/?p[^>]*>/gi, "");
219                                }
220
221                                content = content.replace(/<\/?div[^>]*>/gi, "");
222
223                                // Convert all middlot lists to UL lists
224                                if (this.editor.getParam("paste_convert_middot_lists", true)) {
225                                        var div = ed.dom.create("div", null, content);
226
227                                        // Convert all middot paragraphs to li elements
228                                        var className = this.editor.getParam("paste_unindented_list_class", "unIndentedList");
229
230                                        while (this._convertMiddots(div, "--list--")) ; // bull
231                                        while (this._convertMiddots(div, middot, className)) ; // Middot
232                                        while (this._convertMiddots(div, bull)) ; // bull
233
234                                        content = div.innerHTML;
235                                }
236
237                                // Replace all headers with strong and fix some other issues
238                                if (this.editor.getParam("paste_convert_headers_to_strong", false)) {
239                                        content = content.replace(/<h[1-6]>&nbsp;<\/h[1-6]>/gi, '<p>&nbsp;&nbsp;</p>');
240                                        content = content.replace(/<h[1-6]>/gi, '<p><b>');
241                                        content = content.replace(/<\/h[1-6]>/gi, '</b></p>');
242                                        content = content.replace(/<b>&nbsp;<\/b>/gi, '<b>&nbsp;&nbsp;</b>');
243                                        content = content.replace(/^(&nbsp;)*/gi, '');
244                                }
245
246                                content = content.replace(/--list--/gi, ""); // Remove --list--
247
248                                if ((cb = this.editor.getParam("paste_insert_word_content_callback", "")) != "")
249                                        content = eval(cb + "('after', content)");
250
251                                // Insert cleaned content
252                                this.editor.execCommand("mceInsertContent", false, content);
253
254                                if (this.editor.getParam('paste_force_cleanup_wordpaste', true)) {
255                                        var ed = this.editor;
256
257                                        window.setTimeout(function() {
258                                                ed.execCommand("mceCleanup");
259                                        }, 1); // Do normal cleanup detached from this thread
260                                }
261                        }
262                },
263
264                _reEscape : function(s) {
265                        var l = "?.\\*[](){}+^$:";
266                        var o = "";
267
268                        for (var i=0; i<s.length; i++) {
269                                var c = s.charAt(i);
270
271                                if (l.indexOf(c) != -1)
272                                        o += '\\' + c;
273                                else
274                                        o += c;
275                        }
276
277                        return o;
278                },
279
280                _convertMiddots : function(div, search, class_name) {
281                        var mdot = String.fromCharCode(183);
282                        var bull = String.fromCharCode(8226);
283
284                        var nodes = div.getElementsByTagName("p");
285                        var prevul;
286                        for (var i=0; i<nodes.length; i++) {
287                                var p = nodes[i];
288
289                                // Is middot
290                                if (p.innerHTML.indexOf(search) == 0) {
291                                        var ul = document.createElement("ul");
292
293                                        if (class_name)
294                                                ul.className = class_name;
295
296                                        // Add the first one
297                                        var li = document.createElement("li");
298                                        li.innerHTML = p.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--|&nbsp;', "gi"), '');
299                                        ul.appendChild(li);
300
301                                        // Add the rest
302                                        var np = p.nextSibling;
303                                        while (np) {
304                                                // If the node is whitespace, then
305                                                // ignore it and continue on.
306                                                if (np.nodeType == 3 && new RegExp('^\\s$', 'm').test(np.nodeValue)) {
307                                                                np = np.nextSibling;
308                                                                continue;
309                                                }
310
311                                                if (search == mdot) {
312                                                                if (np.nodeType == 1 && new RegExp('^o(\\s+|&nbsp;)').test(np.innerHTML)) {
313                                                                                // Second level of nesting
314                                                                                if (!prevul) {
315                                                                                                prevul = ul;
316                                                                                                ul = document.createElement("ul");
317                                                                                                prevul.appendChild(ul);
318                                                                                }
319                                                                                np.innerHTML = np.innerHTML.replace(/^o/, '');
320                                                                } else {
321                                                                                // Pop the stack if we're going back up to the first level
322                                                                                if (prevul) {
323                                                                                                ul = prevul;
324                                                                                                prevul = null;
325                                                                                }
326                                                                                // Not element or middot paragraph
327                                                                                if (np.nodeType != 1 || np.innerHTML.indexOf(search) != 0)
328                                                                                                break;
329                                                                }
330                                                } else {
331                                                                // Not element or middot paragraph
332                                                                if (np.nodeType != 1 || np.innerHTML.indexOf(search) != 0)
333                                                                                break;
334                                                        }
335
336                                                var cp = np.nextSibling;
337                                                var li = document.createElement("li");
338                                                li.innerHTML = np.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--|&nbsp;', "gi"), '');
339                                                np.parentNode.removeChild(np);
340                                                ul.appendChild(li);
341                                                np = cp;
342                                        }
343
344                                        p.parentNode.replaceChild(ul, p);
345
346                                        return true;
347                                }
348                        }
349
350                        return false;
351                },
352
353                _clipboardHTML : function() {
354                        var div = document.getElementById('_TinyMCE_clipboardHTML');
355
356                        if (!div) {
357                                var div = document.createElement('DIV');
358                                div.id = '_TinyMCE_clipboardHTML';
359
360                                with (div.style) {
361                                        visibility = 'hidden';
362                                        overflow = 'hidden';
363                                        position = 'absolute';
364                                        width = 1;
365                                        height = 1;
366                                }
367
368                                document.body.appendChild(div);
369                        }
370
371                        div.innerHTML = '';
372                        var rng = document.body.createTextRange();
373                        rng.moveToElementText(div);
374                        rng.execCommand('Paste');
375                        var html = div.innerHTML;
376                        div.innerHTML = '';
377                        return html;
378                }
379        });
380
381        // Register plugin
382        tinymce.PluginManager.add('paste', tinymce.plugins.PastePlugin);
383})();
Note: See TracBrowser for help on using the repository browser.