WordPress.org

Make WordPress Core

Ticket #6610: editor.patch

File editor.patch, 3.9 KB (added by azaozz, 10 years ago)

Protect the <pre> and <script> tags when switching editors

  • editor.js

     
    1313switchEditors = {
    1414
    1515    saveCallback : function(el, content, body) {
    16    
     16
    1717        document.getElementById(el).style.color = '#fff';
    1818        if ( tinyMCE.activeEditor.isHidden() )
    1919            content = document.getElementById(el).value;
     
    2626    pre_wpautop : function(content) {
    2727        // We have a TON of cleanup to do. Line breaks are already stripped.
    2828
     29        // Protect pre|script tags
     30        content = content.replace(/<(pre|script)[^>]*>[\s\S]+?<\/\1>/g, function(a) {
     31            a = a.replace(/<br ?\/?>[\r\n]*/g, '<wp_temp>');
     32            return a.replace(/<\/?p( [^>]*)?>[\r\n]*/g, '<wp_temp>');
     33        });
     34
    2935        // Pretty it up for the source editor
    30         var blocklist1 = 'blockquote|ul|ol|li|table|thead|tbody|tr|th|td|div|h[1-6]|pre|p';
     36        var blocklist1 = 'blockquote|ul|ol|li|table|thead|tbody|tr|th|td|div|h[1-6]|p';
    3137        content = content.replace(new RegExp('\\s*</('+blocklist1+')>\\s*', 'mg'), '</$1>\n');
    3238        content = content.replace(new RegExp('\\s*<(('+blocklist1+')[^>]*)>', 'mg'), '\n<$1>');
    3339
     
    4652        // Fix some block element newline issues
    4753        content = content.replace(new RegExp('\\s*<div', 'mg'), '\n<div');
    4854        content = content.replace(new RegExp('</div>\\s*', 'mg'), '</div>\n');
    49        
     55
    5056        var blocklist2 = 'blockquote|ul|ol|li|table|thead|tr|th|td|h[1-6]|pre';
    5157        content = content.replace(new RegExp('\\s*<(('+blocklist2+') ?[^>]*)\\s*>', 'mg'), '\n<$1>');
    5258        content = content.replace(new RegExp('\\s*</('+blocklist2+')>\\s*', 'mg'), '</$1>\n');
     
    6571        content = content.replace(new RegExp('^\\s*', ''), '');
    6672        content = content.replace(new RegExp('\\s*$', ''), '');
    6773
     74        // put back the line breaks in pre|script
     75        content = content.replace(/<wp_temp>/g, '\n');
     76
    6877        // Hope.
    6978        return content;
    7079    },
     
    109118                                ec.style.padding = '6px';
    110119            }
    111120
    112                         ta.style.color = '';
     121            ta.style.color = '';
    113122            this.wpSetDefaultEditor('html');
    114123        }
    115124    },
     
    148157        pee = pee.replace(new RegExp('<p>\\s*?</p>', 'gi'), '');
    149158        pee = pee.replace(new RegExp('<p>\\s*(</?(?:'+blocklist+')[^>]*>)\\s*</p>', 'gi'), "$1");
    150159        pee = pee.replace(new RegExp("<p>(<li.+?)</p>", 'gi'), "$1");
    151         pee = pee.replace(new RegExp('<p><blockquote([^>]*)>', 'gi'), "<blockquote$1><p>");
    152         pee = pee.replace(new RegExp('</blockquote></p>', 'gi'), '</p></blockquote>');
     160        pee = pee.replace(new RegExp('<p>\\s*<blockquote([^>]*)>', 'gi'), "<blockquote$1><p>");
     161        pee = pee.replace(new RegExp('</blockquote>\\s*</p>', 'gi'), '</p></blockquote>');
    153162        pee = pee.replace(new RegExp('<p>\\s*(</?(?:'+blocklist+')[^>]*>)', 'gi'), "$1");
    154163        pee = pee.replace(new RegExp('(</?(?:'+blocklist+')[^>]*>)\\s*</p>', 'gi'), "$1");
    155164        pee = pee.replace(new RegExp('\\s*\\n', 'gi'), "<br />\n");
    156165        pee = pee.replace(new RegExp('(</?(?:'+blocklist+')[^>]*>)\\s*<br />', 'gi'), "$1");
    157166        pee = pee.replace(new RegExp('<br />(\\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)', 'gi'), '$1');
    158         pee = pee.replace(new RegExp('^((?:&nbsp;)*)\\s', 'mg'), '$1&nbsp;');
    159         //pee = pee.replace(new RegExp('(<pre.*?>)(.*?)</pre>!ise', " stripslashes('$1') .  stripslashes(clean_pre('$2'))  . '</pre>' "); // Hmm...
    160         return pee;
     167        // pee = pee.replace(new RegExp('^((?:&nbsp;)*)\\s', 'mg'), '$1&nbsp;');
     168
     169        // Fix the pre|script tags         
     170        pee = pee.replace(/<(pre|script)[^>]*>[\s\S]+?<\/\1>/g, function(a) {
     171                        a = a.replace(/<br ?\/?>[\r\n]*/g, '\n');
     172                        return a.replace(/<\/?p( [^>]*)?>[\r\n]*/g, '\n');
     173        });
     174
     175            return pee;
    161176    }
    162177}