WordPress.org

Make WordPress Core

Ticket #2833: 2833.3.diff

File 2833.3.diff, 3.7 KB (added by pento, 4 years ago)
  • src/wp-includes/formatting.php

     
    480480        // Find newlines in all elements and add placeholders.
    481481        $pee = wp_replace_in_html_tags( $pee, array( "\n" => " <!-- wpnl --> " ) );
    482482
     483        // Find newlines in the content of protected tags, and add placeholders.
     484        $pee = wp_replace_in_selected_html_content( $pee, array( 'script', 'style' ), array( "\n" => " <!-- wpnl --> " ) );
     485
    483486        // Collapse line breaks before and after <option> elements so they don't get autop'd.
    484487        if ( strpos( $pee, '<option' ) !== false ) {
    485488                $pee = preg_replace( '|\s*<option|', '<option', $pee );
     
    753756                                }
    754757                        }
    755758                }
     759        }
     760
     761        if ( $changed ) {
     762                $haystack = implode( $textarr );
     763        }
     764
     765        return $haystack;
     766}
     767
     768/**
     769 * Replace characters or phrases within the content of selected HTML elements.
     770 *
     771 * @since 4.7.0
     772 *
     773 * @param string $haystack The text which has to be formatted.
     774 * @param array $tags The tags to replace inside of.
     775 * @param array $replace_pairs In the form array('from' => 'to', ...).
     776 * @return string The formatted text.
     777 */
     778function wp_replace_in_selected_html_content( $haystack, $tags, $replace_pairs ) {
     779        // Find all elements.
     780        $textarr = wp_html_split( $haystack );
     781        $changed = false;
     782        $replacing = 0;
     783        $tag_count = count( $tags );
     784
     785        // Optimize when searching for one item.
     786        if ( 1 === count( $replace_pairs ) ) {
     787                // Extract $needle and $replace.
     788                foreach ( $replace_pairs as $needle => $replace );
     789
     790                for ( $i = 0, $c = count( $textarr ); $i < $c; $i += 1 ) {
     791                        for ( $j = 0; $j < $tag_count; $j++ ) {
     792                                if ( 0 === strpos( $textarr[ $i ], '<' . $tags[ $j ] ) ) {
     793                                        $replacing++;
     794                                } elseif ( $textarr[ $i ] === '</' . $tags[ $j ] . '>' ) {
     795                                        $replacing--;
     796                                }
     797                        }
     798                        if ( $replacing ) {
     799                                $textarr[ $i ] = str_replace( $needle, $replace, $textarr[ $i ] );
     800                                $changed = true;
     801                        }
     802                }
     803        } else {
     804                // Extract all $needles.
     805                $needles = array_keys( $replace_pairs );
     806
     807                // Loop through delimiters (elements) only.
     808                for ( $i = 1, $c = count( $textarr ); $i < $c; $i += 2 ) {
     809                        foreach ( $needles as $needle ) {
     810                                for ( $j = 0; $j < $tag_count; $j++ ) {
     811                                        if ( 0 === strpos( $textarr[ $i ], '<' . $tags[ $j ] ) ) {
     812                                                $replacing++;
     813                                        } elseif ( $textarr[ $i ] === '</' . $tags[ $j ] . '>' ) {
     814                                                $replacing--;
     815                                        }
     816                                }
     817                                if ( $replacing ) {
     818                                        $textarr[ $i ] = str_replace( $needle, $replace, $textarr[ $i ] );
     819                                        $changed = true;
     820                                }
     821                        }
     822                }
    756823        }
    757824
    758825        if ( $changed ) {
  • tests/phpunit/tests/formatting/Autop.php

     
    534534
    535535                $this->assertEquals( $expected, trim( wpautop( $content ) ) );
    536536        }
     537
     538        /**
     539         * wpautop() Should not alter the contents of "<script>" elements
     540         *
     541         * @ticket 2833
     542         */
     543        public function test_skip_script_elements() {
     544                $code = file_get_contents( DIR_TESTDATA . '/formatting/sizzle.js' );
     545                $code = str_replace( "\r", '', $code );
     546                $code = htmlentities( $code );
     547
     548                // Not wrapped in <p> tags
     549                $str = "<p><script>$code</script></p>";
     550                $this->assertEquals( $str, trim( wpautop( $str ) ) );
     551
     552                // Text before/after is wrapped in <p> tags
     553                $str = "Look at this code\n\n<script\n type='text/javascript'>$code</script>\n\nIsn't it neat?";
     554
     555                // Expected text after wpautop
     556                $expected = '<p>Look at this code</p>' . "\n<p><script\n type='text/javascript'>" . $code . "</script></p>\n" . '<p>Isn\'t it neat?</p>';
     557                $this->assertEquals( $expected, trim( wpautop( $str ) ) );
     558        }
    537559}