1 /* Import plugin specific language pack */
\r
2 tinyMCE.importPluginLanguagePack('paste', 'en,sv,cs,zh_cn,fr_ca,da,he,no,de,hu');
\r
4 function TinyMCE_paste_getInfo() {
\r
6 longname : 'Paste text/word',
\r
7 author : 'Moxiecode Systems',
\r
8 authorurl : 'http://tinymce.moxiecode.com',
\r
9 infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_paste.html',
\r
10 version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
\r
14 function TinyMCE_paste_initInstance(inst) {
\r
15 if (tinyMCE.isMSIE && tinyMCE.getParam("paste_auto_cleanup_on_paste", false))
\r
16 tinyMCE.addEvent(inst.getBody(), "paste", TinyMCE_paste_handleEvent);
\r
19 function TinyMCE_paste_handleEvent(e) {
\r
22 var html = TinyMCE_paste__clipboardHTML();
\r
24 // Removes italic, strong etc
\r
25 tinyMCE.execCommand('delete');
\r
27 if (html && html.length > 0)
\r
28 tinyMCE.execCommand('mcePasteWord', false, html);
\r
30 tinyMCE.cancelEvent(e);
\r
37 function TinyMCE_paste_getControlHTML(control_name) {
\r
38 switch (control_name) {
\r
40 return '<a href="javascript:tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePasteText\', true);" target="_self" onmousedown="return false;"><img id="{$editor_id}pastetext" src="{$pluginurl}/images/pastetext.gif" title="{$lang_paste_text_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreClass(this);" /></a>';
\r
43 return '<a href="javascript:tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePasteWord\', true);" target="_self" onmousedown="return false;"><img id="{$editor_id}pasteword" src="{$pluginurl}/images/pasteword.gif" title="{$lang_paste_word_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreClass(this);" /></a>';
\r
46 return '<a href="javascript:tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSelectAll\');" target="_self" onmousedown="return false;"><img id="{$editor_id}selectall" src="{$pluginurl}/images/selectall.gif" title="{$lang_selectall_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreClass(this);" /></a>';
\r
52 function TinyMCE_paste_execCommand(editor_id, element, command, user_interface, value) {
\r
54 case "mcePasteText":
\r
55 if (user_interface) {
\r
56 if (tinyMCE.isMSIE && !tinyMCE.getParam('paste_use_dialog', false))
\r
57 TinyMCE_paste__insertText(clipboardData.getData("Text"), true);
\r
59 var template = new Array();
\r
60 template['file'] = '../../plugins/paste/pastetext.htm'; // Relative to theme
\r
61 template['width'] = 450;
\r
62 template['height'] = 400;
\r
63 var plain_text = "";
\r
64 tinyMCE.openWindow(template, {editor_id : editor_id, plain_text: plain_text, resizable : "yes", scrollbars : "no", inline : "yes", mceDo : 'insert'});
\r
67 TinyMCE_paste__insertText(value['html'], value['linebreaks']);
\r
71 case "mcePasteWord":
\r
72 if (user_interface) {
\r
73 if (tinyMCE.isMSIE && !tinyMCE.getParam('paste_use_dialog', false)) {
\r
74 var html = TinyMCE_paste__clipboardHTML();
\r
76 if (html && html.length > 0)
\r
77 TinyMCE_paste__insertWordContent(html);
\r
79 var template = new Array();
\r
80 template['file'] = '../../plugins/paste/pasteword.htm'; // Relative to theme
\r
81 template['width'] = 450;
\r
82 template['height'] = 400;
\r
83 var plain_text = "";
\r
84 tinyMCE.openWindow(template, {editor_id : editor_id, plain_text: plain_text, resizable : "yes", scrollbars : "no", inline : "yes", mceDo : 'insert'});
\r
87 TinyMCE_paste__insertWordContent(value);
\r
91 case "mceSelectAll":
\r
92 tinyMCE.execInstanceCommand(editor_id, 'selectall');
\r
97 // Pass to next handler in chain
\r
101 function TinyMCE_paste__insertText(content, bLinebreaks) {
\r
102 if (content && content.length > 0) {
\r
103 if (bLinebreaks) {
\r
104 // Special paragraph treatment
\r
105 if (tinyMCE.getParam("plaintext_create_paragraphs", true)) {
\r
106 content = tinyMCE.regexpReplace(content, "\r\n\r\n", "</p><p>", "gi");
\r
107 content = tinyMCE.regexpReplace(content, "\r\r", "</p><p>", "gi");
\r
108 content = tinyMCE.regexpReplace(content, "\n\n", "</p><p>", "gi");
\r
111 if ((pos = content.indexOf('</p><p>')) != -1) {
\r
112 tinyMCE.execCommand("Delete");
\r
114 var node = tinyMCE.selectedInstance.getFocusElement();
\r
116 // Get list of elements to break
\r
117 var breakElms = new Array();
\r
120 if (node.nodeType == 1) {
\r
121 // Don't break tables and break at body
\r
122 if (node.nodeName == "TD" || node.nodeName == "BODY")
\r
125 breakElms[breakElms.length] = node;
\r
127 } while(node = node.parentNode);
\r
129 var before = "", after = "</p>";
\r
130 before += content.substring(0, pos);
\r
132 for (var i=0; i<breakElms.length; i++) {
\r
133 before += "</" + breakElms[i].nodeName + ">";
\r
134 after += "<" + breakElms[(breakElms.length-1)-i].nodeName + ">";
\r
138 content = before + content.substring(pos+7) + after;
\r
142 content = tinyMCE.regexpReplace(content, "\r\n", "<br />", "gi");
\r
143 content = tinyMCE.regexpReplace(content, "\r", "<br />", "gi");
\r
144 content = tinyMCE.regexpReplace(content, "\n", "<br />", "gi");
\r
147 tinyMCE.execCommand("mceInsertRawHTML", false, content);
\r
151 function TinyMCE_paste__insertWordContent(content) {
\r
152 if (content && content.length > 0) {
\r
153 // Cleanup Word content
\r
154 var bull = String.fromCharCode(8226);
\r
155 var middot = String.fromCharCode(183);
\r
157 if (tinyMCE.getParam("paste_convert_headers_to_strong", false)) {
\r
158 content = content.replace(new RegExp('<p class=MsoHeading.*?>(.*?)<\/p>', 'gi'), '<p><b>$1</b></p>');
\r
161 content = content.replace(new RegExp('tab-stops: list [0-9]+.0pt">', 'gi'), '">' + "--list--");
\r
162 content = content.replace(new RegExp(bull + "(.*?)<BR>", "gi"), "<p>" + middot + "$1</p>");
\r
163 content = content.replace(new RegExp('<SPAN style="mso-list: Ignore">', 'gi'), "<span>" + bull); // Covert to bull list
\r
164 content = content.replace(/<o:p><\/o:p>/gi, "");
\r
165 content = content.replace(new RegExp('<br style="page-break-before: always;.*>', 'gi'), '-- page break --'); // Replace pagebreaks
\r
166 content = content.replace(new RegExp('<(!--)([^>]*)(--)>', 'g'), ""); // Word comments
\r
167 content = content.replace(/<\/?span[^>]*>/gi, "");
\r
168 content = content.replace(new RegExp('<(\w[^>]*) style="([^"]*)"([^>]*)', 'gi'), "<$1$3");
\r
169 content = content.replace(/<\/?font[^>]*>/gi, "");
\r
170 content = content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3");
\r
171 content = content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3");
\r
172 content = content.replace(/<\\?\?xml[^>]*>/gi, "");
\r
173 content = content.replace(/<\/?\w+:[^>]*>/gi, "");
\r
174 content = content.replace(/-- page break --\s*<p> <\/p>/gi, ""); // Remove pagebreaks
\r
175 content = content.replace(/-- page break --/gi, ""); // Remove pagebreaks
\r
177 // content = content.replace(/\/? */gi, "");
\r
178 // content = content.replace(/<p> <\/p>/gi, '');
\r
180 if (!tinyMCE.settings['force_p_newlines']) {
\r
181 content = content.replace('', '' ,'gi');
\r
182 content = content.replace('</p>', '<br /><br />' ,'gi');
\r
185 if (!tinyMCE.isMSIE && !tinyMCE.settings['force_p_newlines']) {
\r
186 content = content.replace(/<\/?p[^>]*>/gi, "");
\r
189 content = content.replace(/<\/?div[^>]*>/gi, "");
\r
191 // Convert all middlot lists to UL lists
\r
192 if (tinyMCE.getParam("paste_convert_middot_lists", true)) {
\r
193 var div = document.createElement("div");
\r
194 div.innerHTML = content;
\r
196 // Convert all middot paragraphs to li elements
\r
197 var className = tinyMCE.getParam("paste_unindented_list_class", "unIndentedList");
\r
199 while (TinyMCE_paste_convertMiddots(div, "--list--")) ; // bull
\r
200 while (TinyMCE_paste_convertMiddots(div, middot, className)) ; // Middot
\r
201 while (TinyMCE_paste_convertMiddots(div, bull)) ; // bull
\r
203 content = div.innerHTML;
\r
206 // Replace all headers with strong and fix some other issues
\r
207 if (tinyMCE.getParam("paste_convert_headers_to_strong", false)) {
\r
208 content = content.replace(/<h[1-6]> <\/h[1-6]>/gi, '<p> </p>');
\r
209 content = content.replace(/<h[1-6]>/gi, '<p><b>');
\r
210 content = content.replace(/<\/h[1-6]>/gi, '</b></p>');
\r
211 content = content.replace(/<b> <\/b>/gi, '<b> </b>');
\r
212 content = content.replace(/^( )*/gi, '');
\r
215 content = content.replace(/--list--/gi, ""); // Remove --list--
\r
217 // Insert cleaned content
\r
218 tinyMCE.execCommand("mceInsertContent", false, content);
\r
219 tinyMCE.execCommand("mceCleanup"); // Do normal cleanup
\r
223 function TinyMCE_paste_convertMiddots(div, search, class_name) {
\r
224 var mdot = String.fromCharCode(183);
\r
225 var bull = String.fromCharCode(8226);
\r
227 var nodes = div.getElementsByTagName("p");
\r
228 for (var i=0; i<nodes.length; i++) {
\r
232 if (p.innerHTML.indexOf(search) != -1) {
\r
233 var ul = document.createElement("ul");
\r
236 ul.className = class_name;
\r
238 // Add the first one
\r
239 var li = document.createElement("li");
\r
240 li.innerHTML = p.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--| ', "gi"), '');
\r
241 ul.appendChild(li);
\r
244 var np = p.nextSibling;
\r
246 // Not element or middot paragraph
\r
247 if (np.nodeType != 1 || np.innerHTML.indexOf(search) == -1)
\r
250 var cp = np.nextSibling;
\r
251 var li = document.createElement("li");
\r
252 li.innerHTML = np.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--| ', "gi"), '');
\r
253 np.parentNode.removeChild(np);
\r
254 ul.appendChild(li);
\r
258 p.parentNode.replaceChild(ul, p);
\r
267 function TinyMCE_paste__clipboardHTML() {
\r
268 var div = document.getElementById('_TinyMCE_clipboardHTML');
\r
271 var div = document.createElement('DIV');
\r
272 div.id = '_TinyMCE_clipboardHTML';
\r
275 visibility = 'hidden';
\r
276 overflow = 'hidden';
\r
277 position = 'absolute';
\r
282 document.body.appendChild(div);
\r
285 div.innerHTML = '';
\r
286 var rng = document.body.createTextRange();
\r
287 rng.moveToElementText(div);
\r
288 rng.execCommand('Paste');
\r
289 var html = div.innerHTML;
\r
290 div.innerHTML = '';
\r