diff --git a/wire/modules/Inputfield/InputfieldTinyMCE/InputfieldTinyMCE.js b/wire/modules/Inputfield/InputfieldTinyMCE/InputfieldTinyMCE.js index 55616434..89ccd359 100644 --- a/wire/modules/Inputfield/InputfieldTinyMCE/InputfieldTinyMCE.js +++ b/wire/modules/Inputfield/InputfieldTinyMCE/InputfieldTinyMCE.js @@ -598,7 +598,7 @@ var InputfieldTinyMCE = { var t = InputfieldTinyMCE; var allow = ',' + ProcessWire.config.InputfieldTinyMCE.pasteFilter + ','; - var regexTag = /<([a-z0-9]+)([^>]*)>/gi; + var regexTag = /<([a-z0-9:!\[\]]+)([^>]*)>/gi; var regexAttr = /([-_a-z0-9]+)=["']([^"']*)["']/gi; var html = args.content; var matchTag, matchAttr; @@ -607,13 +607,30 @@ var InputfieldTinyMCE = { var replaces = []; var startLength = html.length; + allow = allow.toLowerCase(); + + /* + * HTML for testing MS word paste + msWordHtml = + "
This is bold text.
This is italic text
" +
+ "" +
+ "1." +
+ " One
tags const toggleCleanNbsp = 8; // remove entities + const toggleRemoveStyles = 16; // remove all style attributes /** * Default configuration for filtered paste diff --git a/wire/modules/Inputfield/InputfieldTinyMCE/InputfieldTinyMCEConfigs.php b/wire/modules/Inputfield/InputfieldTinyMCE/InputfieldTinyMCEConfigs.php index fee78bc0..d2f0ef5f 100644 --- a/wire/modules/Inputfield/InputfieldTinyMCE/InputfieldTinyMCEConfigs.php +++ b/wire/modules/Inputfield/InputfieldTinyMCE/InputfieldTinyMCEConfigs.php @@ -711,6 +711,7 @@ class InputfieldTinyMCEConfigs extends InputfieldTinyMCEClass { $f->addOption(InputfieldTinyMCE::toggleCleanDiv, $this->_('Convert `
` tags on save?')); $f->addOption(InputfieldTinyMCE::toggleCleanP, $this->_('Remove empty `
` tags on save?')); $f->addOption(InputfieldTinyMCE::toggleCleanNbsp, $this->_('Remove non-breaking spaces on save?')); + $f->addOption(InputfieldTinyMCE::toggleRemoveStyles, $this->_('Remove `style` attributes from all elements')); $f->attr('value', $this->inputfield->toggles); $f->collapsed = Inputfield::collapsedYes; $f->themeOffset = 1; @@ -1385,4 +1386,4 @@ class InputfieldTinyMCEConfigs extends InputfieldTinyMCEClass { 'usePurifier', ); -} \ No newline at end of file +} diff --git a/wire/modules/Inputfield/InputfieldTinyMCE/InputfieldTinyMCETools.php b/wire/modules/Inputfield/InputfieldTinyMCE/InputfieldTinyMCETools.php index 79495dd7..41b1b258 100644 --- a/wire/modules/Inputfield/InputfieldTinyMCE/InputfieldTinyMCETools.php +++ b/wire/modules/Inputfield/InputfieldTinyMCE/InputfieldTinyMCETools.php @@ -162,25 +162,41 @@ class InputfieldTinyMCETools extends InputfieldTinyMCEClass { // convert
') !== false) { - $value = str_replace(array('
', '
'), array('', '
'), $value); + + foreach($toggles as $toggle) { + switch($toggle) { + case InputfieldTinyMCE::toggleCleanDiv: + // convert+ if(strpos($value, '
') !== false) { + $value = str_replace(array('
', '
'), array('', '
'), $value); + } + } + break; + case InputfieldTinyMCE::toggleCleanP: + // remove empty paragraphs + $value = str_replace(array('', "
\xc2\xa0
", '', ''), '', $value); + break; + case InputfieldTinyMCE::toggleCleanNbsp: + // convert non-breaking space to regular space + $value = str_ireplace(' ', ' ', $value); + $value = str_replace("\xc2\xa0",' ', $value); + break; + case InputfieldTinyMCE::toggleRemoveStyles: + // remove all style attributes + if(strpos($value, 'style=')) { + if(preg_match_all('!(<.+?)\sstyle=(["\']).*?\2!i', $value, $matches)) { + foreach($matches[0] as $key => $fullMatch) { + $startMatch = $matches[1][$key]; + $value = str_replace($fullMatch, $startMatch, $value); + } + } + } + break; } } - // remove gratuitous whitespace - if(in_array(InputfieldTinyMCE::toggleCleanP, $toggles)) { - $value = str_replace(array('
', "
\xc2\xa0
", '', ''), '', $value); - } - - // convert non-breaking space to regular space - if(in_array(InputfieldTinyMCE::toggleCleanNbsp, $toggles)) { - $value = str_ireplace(' ', ' ', $value); - $value = str_replace("\xc2\xa0",' ', $value); - } - return $value; }