Added feature #13796: htmlArea RTE: Extjize Remove format dialogue
authorStanislas Rolland <typo3@sjbr.ca>
Thu, 11 Mar 2010 04:36:43 +0000 (04:36 +0000)
committerStanislas Rolland <typo3@sjbr.ca>
Thu, 11 Mar 2010 04:36:43 +0000 (04:36 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@7097 709f56b5-9817-0410-a4d7-c38de5d9e867

ChangeLog
typo3/sysext/rtehtmlarea/ChangeLog
typo3/sysext/rtehtmlarea/htmlarea/plugins/RemoveFormat/locallang.xml
typo3/sysext/rtehtmlarea/htmlarea/plugins/RemoveFormat/popups/removeformat.html [deleted file]
typo3/sysext/rtehtmlarea/htmlarea/plugins/RemoveFormat/remove-format.js

index 9a7cabf..ffb67a9 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,7 @@
 2010-03-10  Stanislas Rolland  <typo3@sjbr.ca>
 
        * Added feature #13795: htmlArea RTE: Extjize About dialogue
+       * Added feature #13796: htmlArea RTE: Extjize Remove format dialogue
 
 2010-03-10  Steffen Kamper  <info@sk-typo3.de>
 
index e2d2add..065dd86 100644 (file)
@@ -1,6 +1,7 @@
 2010-03-10  Stanislas Rolland  <typo3@sjbr.ca>
 
        * Added feature #13795: htmlArea RTE: Extjize About dialogue
+       * Added feature #13796: htmlArea RTE: Extjize Remove format dialogue
 
 2010-03-09  Stanislas Rolland  <typo3@sjbr.ca>
 
index 507210c..bd39176 100644 (file)
@@ -14,6 +14,7 @@
                        <label index="Cleaning options">Type of formatting to remove</label>
                        <label index="Formatting:">HTML Formatting:</label>
                        <label index="MS Word Formatting:">MS Word Formatting:</label>
+                       <label index="Spaces">Non-breaking spaces:</label>
                        <label index="Images:">Images:</label>
                        <label index="All HTML:">All HTML tags:</label>
                        <label index="Select the type of formatting you wish to remove.">Select the type of formatting to remove.</label>
diff --git a/typo3/sysext/rtehtmlarea/htmlarea/plugins/RemoveFormat/popups/removeformat.html b/typo3/sysext/rtehtmlarea/htmlarea/plugins/RemoveFormat/popups/removeformat.html
deleted file mode 100644 (file)
index 2fac7e4..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-<!DOCTYPE html
-     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html>
-<!--
-/***************************************************************
-*  Copyright notice
-*
-*  (c) 2005-2008 Stanislas Rolland <typo3(arobas)sjbr.ca>
-*  All rights reserved
-*
-*  This script is part of the TYPO3 project. The TYPO3 project is
-*  free software; you can redistribute it and/or modify
-*  it under the terms of the GNU General Public License as published by
-*  the Free Software Foundation; either version 2 of the License, or
-*  (at your option) any later version.
-*
-*  The GNU General Public License can be found at
-*  http://www.gnu.org/copyleft/gpl.html.
-*  A copy is found in the textfile GPL.txt and important notices to the license
-*  from the author is found in LICENSE.txt distributed with these scripts.
-*
-*
-*  This script is distributed in the hope that it will be useful,
-*  but WITHOUT ANY WARRANTY; without even the implied warranty of
-*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-*  GNU General Public License for more details.
-*
-*
-*  This copyright notice MUST APPEAR in all copies of the script!
-***************************************************************/
-/*
- * Remove Format Plugin for TYPO3 htmlArea RTE
- *
- * TYPO3 SVN ID: $Id$
- */
--->
-<head>
-       <title>Remove formatting</title>
-       <meta http-equiv="Content-Style-Type" content="text/css" />
-       <script type="text/javascript">
-               /*<![CDATA[*/
-               <!--
-               var dialog = window.opener.HTMLArea.Dialog.RemoveFormat;
-
-               function Init() {
-                       dialog.initialize();
-                       var editor = dialog.plugin.editor;
-                       if (!editor._selectionEmpty(editor._getSelection())) document.getElementById('clean_selection').checked = true;
-               }
-
-               function onOK() {
-                       var param = {};
-                       if (document.getElementById('clean_selection').checked) {
-                               param["cleaning_area"] = "selection";
-                       } else {
-                               param["cleaning_area"] = "all";
-                       }
-
-                       var fields = ["formatting", "ms_formatting", "images", "html_all"];
-                       oneChecked = false;
-                       for (var i=0; i<fields.length; i++) {
-                               var id = fields[i];
-                               var el = document.getElementById(id);
-                               if (el.checked) {
-                                       param[id] = true;
-                                       oneChecked = true;
-                               }
-                       }
-                       if (oneChecked) {
-                               dialog.performAction(param);
-                               dialog.close();
-                       } else {
-                               alert(dialog.plugin.localize("Select the type of formatting you wish to remove."));
-                       }
-                       return false;
-               };
-
-               function onCancel() {
-                       dialog.close();
-                       return false;
-               }
-               // -->
-               /*]]>*/
-       </script>
-</head>
-<body class="popupwin htmlarea-remove-format" onload="Init();">
-<div id="content">
-<div class="title">Remove formatting</div>
-<form action="" method="get">
-       <fieldset>
-               <legend>Cleaning Area</legend>
-               <div>
-                       <label for="clean_selection">Selection</label> <input type="radio" name="cleaning_area" id="clean_selection" value="selection" />
-                       <label for="clean_page">All</label> <input type="radio" name="cleaning_area" id="clean_page" value="page" checked="checked" />
-               </div>
-       </fieldset>
-       <fieldset>
-               <legend>Cleaning options</legend>
-                       <div>
-                               <label class="fl" for="formatting">Formatting:</label>
-                               <input type="checkbox" id="formatting" value="" />
-                       </div>
-                       <div>
-                               <label class="fl" for="ms_formatting">MS Word Formatting:</label>
-                               <input type="checkbox" id="ms_formatting" value="" checked="checked" />
-                       </div>
-                       <div>
-                               <label class="fl" for="images">Images:</label>
-                               <input type="checkbox" id="images" value="" />
-                       </div>
-                       <div>
-                               <label class="fl" for="html_all">All HTML:</label>
-                               <input type="checkbox" id="html_all" value="" />
-                       </div>
-       </fieldset>
-       <div class="buttons">
-               <button type="button" name="ok" onclick="return onOK();">OK</button>
-               <button type="button" name="cancel" onclick="return onCancel();">Cancel</button>
-       </div>
-</form>
-</div>
-</body>
-</html>
index 482aff0..7499f6f 100644 (file)
  * TYPO3 SVN ID: $Id$
  */
 RemoveFormat = HTMLArea.Plugin.extend({
-
-       constructor : function(editor, pluginName) {
+       constructor: function(editor, pluginName) {
                this.base(editor, pluginName);
        },
-
        /*
         * This function gets called by the class constructor
         */
-       configurePlugin : function(editor) {
-
+       configurePlugin: function(editor) {
                /*
                 * Registering plugin "About" information
                 */
                var pluginInformation = {
-                       version         : "1.7",
-                       developer       : "Stanislas Rolland",
-                       developerUrl    : "http://www.sjbr.ca/",
-                       copyrightOwner  : "Stanislas Rolland",
-                       sponsor         : "SJBR",
-                       sponsorUrl      : "http://www.sjbr.ca/",
-                       license         : "GPL"
+                       version         : '2.0',
+                       developer       : 'Stanislas Rolland',
+                       developerUrl    : 'http://www.sjbr.ca/',
+                       copyrightOwner  : 'Stanislas Rolland',
+                       sponsor         : 'SJBR',
+                       sponsorUrl      : 'http://www.sjbr.ca/',
+                       license         : 'GPL'
                };
                this.registerPluginInformation(pluginInformation);
-
                /*
                 * Registering the button
                 */
-               var buttonId = "RemoveFormat";
+               var buttonId = 'RemoveFormat';
                var buttonConfiguration = {
                        id              : buttonId,
-                       tooltip         : this.localize(buttonId+"Tooltip"),
-                       action          : "onButtonPress",
+                       tooltip         : this.localize(buttonId + 'Tooltip'),
+                       action          : 'onButtonPress',
                        dialog          : true
                };
                this.registerButton(buttonConfiguration);
-
-               this.popupWidth = 370;
-               this.popupHeight = 260;
-
                return true;
        },
-
        /*
         * This function gets called when the button was pressed.
         *
@@ -80,105 +71,211 @@ RemoveFormat = HTMLArea.Plugin.extend({
         *
         * @return      boolean         false if action is completed
         */
-       onButtonPress : function (editor, id, target) {
+       onButtonPress: function (editor, id, target) {
                        // Could be a button or its hotkey
                var buttonId = this.translateHotKey(id);
                buttonId = buttonId ? buttonId : id;
-
-               this.dialog = this.openDialog("RemoveFormat", this.makeUrlFromPopupName("removeformat"), "applyRequest", null, {width:this.popupWidth, height:this.popupHeight});
+                       // Open dialogue window
+               this.openDialogue(
+                       buttonId,
+                       'Remove formatting',
+                       this.getWindowDimensions(
+                               {
+                                       width: 260,
+                                       height:260
+                               },
+                               buttonId
+                       )
+               );
                return false;
        },
-
        /*
-        * Perform the cleaning request
-        * .
+        * Open the dialogue window
+        *
+        * @param       string          buttonId: the button id
+        * @param       string          title: the window title
+        * @param       object          dimensions: the opening dimensions of the window
+        *
+        * @return      void
         */
-       applyRequest : function(param) {
-
-               var editor = this.editor;
-               editor.focusEditor();
-
-               if (param) {
-
-                       if (param["cleaning_area"] == "all") {
-                               var html = editor._doc.body.innerHTML;
-                       } else {
-                               var html = editor.getSelectedHTML();
-                       }
-
-                       if (html) {
-
-                               if (param["html_all"]== true) {
-                                       html = html.replace(/<[\!]*?[^<>]*?>/g, "");
-                               }
-
-                               if (param["formatting"] == true) {
-                                               // remove font, b, strong, i, em, u, strike, span and other tags
-                                       var regF1 = new RegExp("<\/?(abbr|acronym|b[^a-zA-Z]|big|cite|code|em[^a-zA-Z]|font|i[^a-zA-Z]|q|s[^a-zA-Z]|samp|small|span|strike|strong|sub|sup|u[^a-zA-Z]|var)[^>]*>", "gi");
-                                       html = html.replace(regF1, "");
-                                               // keep tags, strip attributes
-                                       var regF2 = new RegExp(" style=\"[^>\"]*\"", "gi");
-                                       var regF3 = new RegExp(" (class|align|cellpadding|cellspacing|frame|bgcolor)=(([^>\s\"]+)|(\"[^>\"]*\"))", "gi");
-                                       html = html.replace(regF2, "").replace(regF3, "");
+       openDialogue: function (buttonId, title, dimensions) {
+               this.dialog = new Ext.Window({
+                       title: this.localize(title),
+                       cls: 'htmlarea-window',
+                       border: false,
+                       width: dimensions.width,
+                       height: 'auto',
+                               // As of ExtJS 3.1, JS error with IE when the window is resizable
+                       resizable: !Ext.isIE,
+                       iconCls: buttonId,
+                       listeners: {
+                               close: {
+                                       fn: this.onClose,
+                                       scope: this
                                }
-
-                               if (param["images"] == true) {
-                                               // remove any IMG tag
-                                       html = html.replace(/<\/?img[^>]*>/gi, ""); //remove img tags
+                       },
+                       items: [{
+                                       xtype: 'fieldset',
+                                       title: this.localize('Cleaning Area'),
+                                       defaultType: 'radio',
+                                       labelWidth: 150,
+                                       defaults: {
+                                               labelSeparator: ''
+                                       },
+                                       items: [{
+                                                       itemId: 'selection',
+                                                       fieldLabel: this.localize('Selection'),
+                                                       name: 'htmlarea-removeFormat-area'
+                                               },{
+                                                       itemId: 'allContent',
+                                                       fieldLabel: this.localize('All'),
+                                                       checked: true,
+                                                       name: 'htmlarea-removeFormat-area'
+                                               }
+                                       ]
+                               },{
+                                       xtype: 'fieldset',
+                                       defaultType: 'checkbox',
+                                       title: this.localize('Cleaning options'),
+                                       labelWidth: 150,
+                                       defaults: {
+                                               labelSeparator: ''
+                                       },
+                                       items: [{
+                                                       itemId: 'formatting',
+                                                       fieldLabel: this.localize('Formatting:')
+                                               },{
+                                                       itemId: 'msWordFormatting',
+                                                       fieldLabel: this.localize('MS Word Formatting:'),
+                                                       checked: true
+                                               },{
+                                                       itemId: 'spaces',
+                                                       fieldLabel: this.localize('Spaces')
+                                               },{
+                                                       itemId: 'images',
+                                                       fieldLabel: this.localize('Images:')
+                                               },{
+                                                       itemId: 'allHtml',
+                                                       fieldLabel: this.localize('All HTML:')
+                                               }
+                                       ]
                                }
-
-                               if (param["ms_formatting"] == true) {
-                                               // make one line
-                                       var regMS1 = new RegExp("(\r\n|\n|\r)", "g");
-                                       html = html.replace(regMS1, " ");
-                                               //clean up tags
-                                       var regMS2 = new RegExp("<(b[^r]|strong|i|em|p|li|ul) [^>]*>", "gi");
-                                       html = html.replace(regMS2, "<$1>");
-                                               // keep tags, strip attributes
-                                       var regMS3 = new RegExp(" style=\"[^>\"]*\"", "gi");
-                                       var regMS4 = new RegExp(" (class|align)=(([^>\s\"]+)|(\"[^>\"]*\"))", "gi");
-                                       html = html.replace(regMS3, "").replace(regMS4, "");
-                                               // mozilla doesn't like <em> tags
-                                       html = html.replace(/<em>/gi, "<i>").replace(/<\/em>/gi, "</i>");
-                                               // kill unwanted tags: span, div, ?xml:, st1:, [a-z]:, meta, link
-                                       html = html.replace(/<\/?span[^>]*>/gi, "").
-                                               replace(/<\/?div[^>]*>/gi, "").
-                                               replace(/<\?xml:[^>]*>/gi, "").
-                                               replace(/<\/?st1:[^>]*>/gi, "").
-                                               replace(/<\/?[a-z]:[^>]*>/g, "").
-                                               replace(/<\/?meta[^>]*>/g, "").
-                                               replace(/<\/?link[^>]*>/g, "");
-                                               // remove unwanted tags and their contents: style, title
-                                       html = html.replace(/<style[^>]*>.*<\/style[^>]*>/gi, "").
-                                               replace(/<title[^>]*>.*<\/title[^>]*>/gi, "");
-                                               // remove comments
-                                       html = html.replace(/<!--[^>]*>/gi, "");
+                       ],
+                       buttons: [
+                               this.buildButtonConfig('OK', this.onOK),
+                               this.buildButtonConfig('Cancel', this.onCancel)
+                       ]
+               });
+               this.show();
+       },
+       /*
+        * Handler when the OK button is pressed
+        */
+       onOK: function () {
+               var fields = [
+                       'selection',
+                       'allContent',
+                       'formatting',
+                       'msWordFormatting',
+                       'spaces',
+                       'images',
+                       'allHtml'
+               ];
+               var params = {};
+               Ext.each(fields, function (field) {
+                       params[field] = this.dialog.find('itemId', field)[0].getValue();
+               }, this);
+               if (params['allHtml'] || params['formatting'] || params['spaces'] || params['images'] || params['msWordFormatting']) {
+                       this.applyRequest(params);
+               } else {
+                       Ext.MessageBox.alert('', this.localize('Select the type of formatting you wish to remove.'));
+               }
+               return false;
+       },
+       /*
+        * Perform the cleaning request
+        * @param       object          params: the values of the form fields
+        *
+        * @return      void
+        */
+       applyRequest: function(params) {
+               var editor = this.editor;
+               editor.focus();
+               this.restoreSelection();
+               if (params['allContent']) {
+                       var html = editor.getInnerHTML();
+               } else {
+                       var html = editor.getSelectedHTML();
+               }
+               if (html) {
+                       if (params['allHtml']) {
+                               html = html.replace(/<[\!]*?[^<>]*?>/g, "");
+                       }
+                       if (params['formatting']) {
+                                       // remove font, b, strong, i, em, u, strike, span and other tags
+                               var regF1 = new RegExp("<\/?(abbr|acronym|b[^a-zA-Z]|big|cite|code|em[^a-zA-Z]|font|i[^a-zA-Z]|q|s[^a-zA-Z]|samp|small|span|strike|strong|sub|sup|u[^a-zA-Z]|var)[^>]*>", "gi");
+                               html = html.replace(regF1, "");
+                                       // keep tags, strip attributes
+                               var regF2 = new RegExp(" style=\"[^>\"]*\"", "gi");
+                               var regF3 = new RegExp(" (class|align|cellpadding|cellspacing|frame|bgcolor)=(([^>\s\"]+)|(\"[^>\"]*\"))", "gi");
+                               html = html.replace(regF2, "").replace(regF3, "");
+                       }
+                       if (params['spaces']) {
+                                       // Replace non-breaking spaces by normal spaces
+                               html = html.replace(/&nbsp;/g, " ");
+                       }
+                       if (params['images']) {
+                                       // remove any IMG tag
+                               html = html.replace(/<\/?img[^>]*>/gi, "");
+                       }
+                       if (params['msWordFormatting']) {
+                                       // make one line
+                               var regMS1 = new RegExp("(\r\n|\n|\r)", "g");
+                               html = html.replace(regMS1, " ");
+                                       //clean up tags
+                               var regMS2 = new RegExp("<(b[^r]|strong|i|em|p|li|ul) [^>]*>", "gi");
+                               html = html.replace(regMS2, "<$1>");
+                                       // keep tags, strip attributes
+                               var regMS3 = new RegExp(" style=\"[^>\"]*\"", "gi");
+                               var regMS4 = new RegExp(" (class|align)=(([^>\s\"]+)|(\"[^>\"]*\"))", "gi");
+                               html = html.replace(regMS3, "").replace(regMS4, "");
+                                       // mozilla doesn't like <em> tags
+                               html = html.replace(/<em>/gi, "<i>").replace(/<\/em>/gi, "</i>");
+                                       // kill unwanted tags: span, div, ?xml:, st1:, [a-z]:, meta, link
+                               html = html.replace(/<\/?span[^>]*>/gi, "").
+                                       replace(/<\/?div[^>]*>/gi, "").
+                                       replace(/<\?xml:[^>]*>/gi, "").
+                                       replace(/<\/?st1:[^>]*>/gi, "").
+                                       replace(/<\/?[a-z]:[^>]*>/g, "").
+                                       replace(/<\/?meta[^>]*>/g, "").
+                                       replace(/<\/?link[^>]*>/g, "");
+                                       // remove unwanted tags and their contents: style, title
+                               html = html.replace(/<style[^>]*>.*<\/style[^>]*>/gi, "").
+                                       replace(/<title[^>]*>.*<\/title[^>]*>/gi, "");
+                                       // remove comments
+                               html = html.replace(/<!--[^>]*>/gi, "");
+                                       // remove double tags
+                               oldlen = html.length + 1;
+                               var reg6 = new RegExp("<([a-z][a-z]*)> *<\/\1>", "gi");
+                               var reg7 = new RegExp("<([a-z][a-z]*)> *<\/?([a-z][^>]*)> *<\/\1>", "gi");
+                               var reg8 = new RegExp("<([a-z][a-z]*)><\1>", "gi");
+                               var reg9 = new RegExp("<\/([a-z][a-z]*)><\/\1>", "gi");
+                               var reg10 = new RegExp("[\x20]+", "gi");
+                               while(oldlen > html.length) {
+                                       oldlen = html.length;
+                                               // join us now and free the tags
+                                       html = html.replace(reg6, " ").replace(reg7, "<$2>");
                                                // remove double tags
-                                       oldlen = html.length + 1;
-                                       var reg6 = new RegExp("<([a-z][a-z]*)> *<\/\1>", "gi");
-                                       var reg7 = new RegExp("<([a-z][a-z]*)> *<\/?([a-z][^>]*)> *<\/\1>", "gi");
-                                       var reg8 = new RegExp("<([a-z][a-z]*)><\1>", "gi");
-                                       var reg9 = new RegExp("<\/([a-z][a-z]*)><\/\1>", "gi");
-                                       var reg10 = new RegExp("[\x20]+", "gi");
-                                       while(oldlen > html.length) {
-                                               oldlen = html.length;
-                                                       // join us now and free the tags
-                                               html = html.replace(reg6, " ").replace(reg7, "<$2>");
-                                                       // remove double tags
-                                               html = html.replace(reg8, "<$1>").replace(reg9, "<\/$1>");
-                                                       // remove double spaces
-                                               html = html.replace(reg10, " ");
-                                       }
-                               }
-
-                               if (param["cleaning_area"] == "all") {
-                                       editor.setHTML(html);
-                               } else {
-                                       editor.insertHTML(html);
+                                       html = html.replace(reg8, "<$1>").replace(reg9, "<\/$1>");
+                                               // remove double spaces
+                                       html = html.replace(reg10, " ");
                                }
                        }
-               } else {
-                       return false;
+                       if (params['allContent']) {
+                               editor.setHTML(html);
+                       } else {
+                               editor.insertHTML(html);
+                       }
                }
        }
 });