--- /dev/null
+/**\r
+ * @author Shea Frederick - http://www.vinylfox.com\r
+ * @class Ext.ux.form.HtmlEditor.Word\r
+ * @extends Ext.util.Observable\r
+ * <p>A plugin that creates a button on the HtmlEditor for pasting text from Word without all the jibberish html.</p>\r
+ */\r
+Ext.ux.form.HtmlEditor.Word = Ext.extend(Ext.util.Observable, {\r
+\r
+ init: function(cmp){\r
+ \r
+ this.cmp = cmp;\r
+ this.cmp.on('initialize', this.onInit, this, {delay:100, single: true}); \r
+ },\r
+\r
+ onInit: function(){\r
+ \r
+ this.cel = Ext.get(this.cmp.getEditorBody()) ; \r
+ this.cel.on('paste', this.checkIfPaste , this, {buffer:100});\r
+ },\r
+\r
+ checkIfPaste: function(e){\r
+ var filtered = this.fixWordPaste(this.cmp.getValue());\r
+ this.cmp.setValue(filtered); \r
+ },\r
+ \r
+ fixWordPaste: function(wordPaste) {\r
+ \r
+ var removals = [/ /ig, /[\r\n]/g, /<(xml|style)[^>]*>.*?<\/\1>/ig, /<\/?(meta|object|span)[^>]*>/ig,\r
+ /<\/?[A-Z0-9]*:[A-Z]*[^>]*>/ig, /(lang|class|type|href|name|title|id|clear)=\"[^\"]*\"/ig, /style=(\'\'|\"\")/ig, /<![\[-].*?-*>/g, \r
+ /MsoNormal/g, /<\\?\?xml[^>]*>/g, /<\/?o:p[^>]*>/g, /<\/?v:[^>]*>/g, /<\/?o:[^>]*>/g, /<\/?st1:[^>]*>/g, / /g, \r
+ /<\/?SPAN[^>]*>/g, /<\/?FONT[^>]*>/g, /<\/?STRONG[^>]*>/g, /<\/?H1[^>]*>/g, /<\/?H2[^>]*>/g, /<\/?H3[^>]*>/g, /<\/?H4[^>]*>/g, \r
+ /<\/?H5[^>]*>/g, /<\/?H6[^>]*>/g, /<\/?P[^>]*><\/P>/g, /<!--(.*)-->/g, /<!--(.*)>/g, /<!(.*)-->/g, /<\\?\?xml[^>]*>/g, \r
+ /<\/?o:p[^>]*>/g, /<\/?v:[^>]*>/g, /<\/?o:[^>]*>/g, /<\/?st1:[^>]*>/g, /style=\"[^\"]*\"/g, /style=\'[^\"]*\'/g, /lang=\"[^\"]*\"/g, \r
+ /lang=\'[^\"]*\'/g, /class=\"[^\"]*\"/g, /class=\'[^\"]*\'/g, /type=\"[^\"]*\"/g, /type=\'[^\"]*\'/g, /href=\'#[^\"]*\'/g, \r
+ /href=\"#[^\"]*\"/g, /name=\"[^\"]*\"/g, /name=\'[^\"]*\'/g, / clear=\"all\"/g, /id=\"[^\"]*\"/g, /title=\"[^\"]*\"/g, \r
+ /<span[^>]*>/g, /<\/?span[^>]*>/g, /<title>(.*)<\/title>/g, /class=/g, /<meta[^>]*>/g, /<link[^>]*>/g, /<style>(.*)<\/style>/g, \r
+ /<w:[^>]*>(.*)<\/w:[^>]*>/g];\r
+ \r
+ Ext.each(removals, function(s){\r
+ wordPaste = wordPaste.replace(s, "");\r
+ });\r
+ \r
+ // keep the divs in paragraphs\r
+ wordPaste = wordPaste.replace(/<div[^>]*>/g, "<p>");\r
+ wordPaste = wordPaste.replace(/<\/?div[^>]*>/g, "</p>");\r
+ return wordPaste;\r
+ \r
+ }\r
+ /*\r
+ fixWordPaste: function (wordPaste) {\r
+\r
+ wordPaste = wordPaste.replace(/MsoNormal/gi,"");\r
+ wordPaste = wordPaste.replace(/<\/?link[^>]*>/gi,"");\r
+ wordPaste = wordPaste.replace(/<\/?meta[^>]*>/gi,"");\r
+ wordPaste = wordPaste.replace(/<\/?xml[^>]*>/gi,"");\r
+ wordPaste = wordPaste.replace(/<\?xml[^>]*\/>/gi,"");\r
+ wordPaste = wordPaste.replace(/<!--(.*)-->/gi, "");\r
+ wordPaste = wordPaste.replace(/<!--(.*)>/gi, "");\r
+ wordPaste = wordPaste.replace(/<!(.*)-->/gi, "");\r
+ wordPaste = wordPaste.replace(/<w:[^>]*>(.*)<\/w:[^>]*>/gi,'');\r
+ wordPaste = wordPaste.replace(/<w:[^>]*\/>/gi,'');\r
+ wordPaste = wordPaste.replace(/<\/?w:[^>]*>/gi,"");\r
+ wordPaste = wordPaste.replace(/<m:[^>]*\/>/gi,'');\r
+ wordPaste = wordPaste.replace(/<m:[^>]>(.*)<\/m:[^>]*>/gi,'');\r
+ wordPaste = wordPaste.replace(/<o:[^>]*>(.*)<\/o:[^>]*>/gi,'');\r
+ wordPaste = wordPaste.replace(/<o:[^>]*\/>/gi,'');\r
+ wordPaste = wordPaste.replace(/<\/?m:[^>]*>/gi,"");\r
+ wordPaste = wordPaste.replace(/style=\"([^>]*)\"/gi,"");\r
+ wordPaste = wordPaste.replace(/style=\'([^>]*)\'/gi,"");\r
+ wordPaste = wordPaste.replace(/class=\"(.*)\"/gi,"");\r
+ wordPaste = wordPaste.replace(/class=\'(.*)\'/gi,"");\r
+ wordPaste = wordPaste.replace(/<p[^>]*>/gi,'<p>');\r
+ wordPaste = wordPaste.replace(/<\/p[^>]*>/gi,'<\/p>');\r
+ wordPaste = wordPaste.replace(/<span[^>]*>/gi,'');\r
+ wordPaste = wordPaste.replace(/<\/span[^>]*>/gi,'');\r
+ wordPaste = wordPaste.replace(/<st1:[^>]*>/gi,'');\r
+ wordPaste = wordPaste.replace(/<\/st1:[^>]*>/gi,'');\r
+ wordPaste = wordPaste.replace(/<font[^>]*>/gi,'');\r
+ wordPaste = wordPaste.replace(/<\/font[^>]*>/gi,'');\r
+ wordPaste = wordPaste.replace(/[\r\n]/g,' '); \r
+ wordPaste = wordPaste.replace(/<wordPasteong><\/wordPasteong>/gi,'');\r
+ wordPaste = wordPaste.replace(/<p><\/p>/gi,'');\r
+ wordPaste = wordPaste.replace(/\/\*(.*)\*\//gi,'');\r
+ wordPaste = wordPaste.replace(/<!--/gi, "");\r
+ wordPaste = wordPaste.replace(/-->/gi, "");\r
+ wordPaste = wordPaste.replace(/<style[^>]*>[^<]*<\/style[^>]*>/gi,'');\r
+ wordPaste = wordPaste.replace(/<hr>/gi,'');\r
+ \r
+ return wordPaste;\r
+ }*/\r
+ \r
+});\r
+\r
+/*\r
+\r
+Ext.ux.form.HtmlEditor.Word = Ext.extend(Ext.util.Observable, {\r
+ // Word language text\r
+ langTitle: 'Word Paste',\r
+ langToolTip: 'Cleanse text pasted from Word or other Rich Text applications',\r
+ wordPasteEnabled: true,\r
+ // private\r
+ curLength: 0,\r
+ lastLength: 0,\r
+ lastValue: '',\r
+ // private\r
+ init: function(cmp){\r
+ \r
+ this.cmp = cmp;\r
+ this.cmp.on('render', this.onRender, this);\r
+ this.cmp.on('initialize', this.onInit, this, {delay:100, single: true});\r
+ \r
+ },\r
+ // private\r
+ onInit: function(){\r
+ \r
+ Ext.EventManager.on(this.cmp.getDoc(), {\r
+ 'keyup': this.checkIfPaste,\r
+ scope: this\r
+ });\r
+ this.lastValue = this.cmp.getValue();\r
+ this.curLength = this.lastValue.length;\r
+ this.lastLength = this.lastValue.length;\r
+ \r
+ },\r
+ // private\r
+ checkIfPaste: function(e){\r
+ \r
+ var diffAt = 0;\r
+ this.curLength = this.cmp.getValue().length;\r
+ alert(e.ctrlKey)\r
+ alert(e.metaKey)\r
+ alert(e.getKey());\r
+ if (e.V == e.getKey() && e.ctrlKey && this.wordPasteEnabled){\r
+ \r
+ this.cmp.suspendEvents();\r
+ \r
+ diffAt = this.findValueDiffAt(this.cmp.getValue());\r
+ var parts = [\r
+ this.cmp.getValue().substr(0, diffAt),\r
+ this.fixWordPaste(this.cmp.getValue().substr(diffAt, (this.curLength - this.lastLength))),\r
+ this.cmp.getValue().substr((this.curLength - this.lastLength)+diffAt, this.curLength)\r
+ ];\r
+ this.cmp.setValue(parts.join(''));\r
+ \r
+ this.cmp.resumeEvents();\r
+ }\r
+ \r
+ this.lastLength = this.cmp.getValue().length;\r
+ this.lastValue = this.cmp.getValue();\r
+ \r
+ },\r
+ // private\r
+ findValueDiffAt: function(val){\r
+ \r
+ for (i=0;i<this.curLength;i++){\r
+ if (this.lastValue[i] != val[i]){\r
+ return i; \r
+ }\r
+ }\r
+ \r
+ },\r
+ /**\r
+ * Cleans up the jubberish html from Word pasted text.\r
+ * @param wordPaste String The text that needs to be cleansed of Word jibberish html.\r
+ * @return {String} The passed in text with all Word jibberish html removed.\r
+ */\r
+/*\r
+ fixWordPaste: function(wordPaste) {\r
+ \r
+ var removals = [/ /ig, /[\r\n]/g, /<(xml|style)[^>]*>.*?<\/\1>/ig, /<\/?(meta|object|span)[^>]*>/ig,\r
+ /<\/?[A-Z0-9]*:[A-Z]*[^>]*>/ig, /(lang|class|type|href|name|title|id|clear)=\"[^\"]*\"/ig, /style=(\'\'|\"\")/ig, /<![\[-].*?-*>/g, \r
+ /MsoNormal/g, /<\\?\?xml[^>]*>/g, /<\/?o:p[^>]*>/g, /<\/?v:[^>]*>/g, /<\/?o:[^>]*>/g, /<\/?st1:[^>]*>/g, / /g, \r
+ /<\/?SPAN[^>]*>/g, /<\/?FONT[^>]*>/g, /<\/?STRONG[^>]*>/g, /<\/?H1[^>]*>/g, /<\/?H2[^>]*>/g, /<\/?H3[^>]*>/g, /<\/?H4[^>]*>/g, \r
+ /<\/?H5[^>]*>/g, /<\/?H6[^>]*>/g, /<\/?P[^>]*><\/P>/g, /<!--(.*)-->/g, /<!--(.*)>/g, /<!(.*)-->/g, /<\\?\?xml[^>]*>/g, \r
+ /<\/?o:p[^>]*>/g, /<\/?v:[^>]*>/g, /<\/?o:[^>]*>/g, /<\/?st1:[^>]*>/g, /style=\"[^\"]*\"/g, /style=\'[^\"]*\'/g, /lang=\"[^\"]*\"/g, \r
+ /lang=\'[^\"]*\'/g, /class=\"[^\"]*\"/g, /class=\'[^\"]*\'/g, /type=\"[^\"]*\"/g, /type=\'[^\"]*\'/g, /href=\'#[^\"]*\'/g, \r
+ /href=\"#[^\"]*\"/g, /name=\"[^\"]*\"/g, /name=\'[^\"]*\'/g, / clear=\"all\"/g, /id=\"[^\"]*\"/g, /title=\"[^\"]*\"/g, \r
+ /<span[^>]*>/g, /<\/?span[^>]*>/g, /<title>(.*)<\/title>/g, /class=/g, /<meta[^>]*>/g, /<link[^>]*>/g, /<style>(.*)<\/style>/g, \r
+ /<w:[^>]*>(.*)<\/w:[^>]*>/g];\r
+ \r
+ Ext.each(removals, function(s){\r
+ wordPaste = wordPaste.replace(s, "");\r
+ });\r
+ \r
+ // keep the divs in paragraphs\r
+ wordPaste = wordPaste.replace(/<div[^>]*>/g, "<p>");\r
+ wordPaste = wordPaste.replace(/<\/?div[^>]*>/g, "</p>");\r
+ return wordPaste;\r
+ \r
+ },\r
+ // private\r
+ onRender: function() {\r
+ \r
+ this.cmp.getToolbar().add({\r
+ iconCls: 'x-edit-wordpaste',\r
+ pressed: true,\r
+ handler: function(t){\r
+ t.toggle(!t.pressed);\r
+ this.wordPasteEnabled = !this.wordPasteEnabled;\r
+ },\r
+ scope: this,\r
+ tooltip: {\r
+ text: this.langToolTip\r
+ },\r
+ overflowText: this.langTitle\r
+ });\r
+ \r
+ }\r
+});*/
\ No newline at end of file