WordPress.org

Make WordPress Core

Ticket #6610: editor.patch

File editor.patch, 3.9 KB (added by azaozz, 6 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}