WordPress.org

Make WordPress Core

Ticket #12690: miqro-12690.5.patch

File miqro-12690.5.patch, 7.0 KB (added by miqrogroove, 6 years ago)

Revert one of the previous regexp edits not needed.

  • src/wp-includes/formatting.php

     
    130130                $dynamic_replacements = array_values( $dynamic );
    131131        }
    132132
     133        // If there's nothing to do, just stop.
     134        if ( empty( $text ) ) {
     135                return $text;
     136        }
     137
    133138        // Transform into regexp sub-expression used in _wptexturize_pushpop_element
    134139        // Must do this every time in case plugins use these filters in a context sensitive manner
    135140        /**
     
    152157        $no_texturize_tags_stack = array();
    153158        $no_texturize_shortcodes_stack = array();
    154159
    155         $textarr = preg_split('/(<.*>|\[.*\])/Us', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
     160        // Look for shortcodes and HTML elements.
    156161
     162        $regex =  '/('                  // Capture the entire match.
     163                .       '<'             // Find start of element.
     164                .       '(?(?=!--)'     // Is this a comment?
     165                .               '.+?--\s*>'     // Find end of comment
     166                .       '|'
     167                .               '.+?>'          // Find end of element
     168                .       ')'
     169                . '|'
     170                .       '\['            // Find start of shortcode.
     171                .       '\[?'           // Shortcodes may begin with [[
     172                .       '[^\[\]<>]+'    // Shortcodes do not contain other shortcodes or HTML elements.
     173                .       '\]'            // Find end of shortcode.
     174                .       '\]?'           // Shortcodes may end with ]]
     175                . ')/s';
     176
     177        $textarr = preg_split($regex, $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
     178
    157179        foreach ( $textarr as &$curl ) {
    158                 if ( empty( $curl ) ) {
    159                         continue;
    160                 }
     180                // Only call _wptexturize_pushpop_element if $curl is a delimeter.
     181                $first = $curl[0];
     182                if ( '<' === $first && '>' === substr($curl, -1) ) {
     183                        // This is an HTML delimeter.
    161184
    162                 // Only call _wptexturize_pushpop_element if first char is correct tag opening
    163                 $first = $curl[0];
    164                 if ( '<' === $first ) {
    165                         _wptexturize_pushpop_element($curl, $no_texturize_tags_stack, $no_texturize_tags, '<', '>');
    166                 } elseif ( '[' === $first ) {
     185                        if ( '<!--' !== substr($curl, 0, 4) ) {
     186                                _wptexturize_pushpop_element($curl, $no_texturize_tags_stack, $no_texturize_tags, '<', '>');
     187                        }
     188
     189                } elseif ( '[' === $first && 1 === preg_match('/^\[[^\[\]<>]+\]$/', $curl) ) {
     190                        // This is a shortcode delimeter.
     191
    167192                        _wptexturize_pushpop_element($curl, $no_texturize_shortcodes_stack, $no_texturize_shortcodes, '[', ']');
     193
     194                } elseif ( '[' === $first && 1 === preg_match('/^\[\[?[^\[\]<>]+\]\]?$/', $curl) ) {
     195                        // This is an escaped shortcode delimeter.
     196
     197                        // Do not texturize.
     198                        // Do not push to the shortcodes stack.
     199
    168200                } elseif ( empty($no_texturize_shortcodes_stack) && empty($no_texturize_tags_stack) ) {
     201                        // This is neither a delimeter, nor is this content inside of no_texturize pairs.  Do texturize.
    169202
    170                         // This is not a tag, nor is the texturization disabled static strings
    171203                        $curl = str_replace($static_characters, $static_replacements, $curl);
    172 
    173                         // regular expressions
    174204                        $curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl);
    175205
    176206                        // 9x9 (times)
  • tests/phpunit/tests/formatting/WPTexturize.php

     
    994994                        ),
    995995                );
    996996        }
     997
     998        /**
     999         * Test HTML and shortcode avoidance.
     1000         *
     1001         * @ticket 12690
     1002         * @dataProvider data_tag_avoidance
     1003         */
     1004        function test_tag_avoidance( $input, $output ) {
     1005                return $this->assertEquals( $output, wptexturize( $input ) );
     1006        }
     1007
     1008        function data_tag_avoidance() {
     1009                return array(
     1010                        array(
     1011                                '[ photos by <a href="http://example.com/?a[]=1&a[]=2"> this guy </a> ]',
     1012                                '[ photos by <a href="http://example.com/?a[]=1&#038;a[]=2"> this guy </a> ]',
     1013                        ),
     1014                        array(
     1015                                '[gallery ...]',
     1016                                '[gallery ...]',
     1017                        ),
     1018                        array(
     1019                                '[[gallery ...]', // This tag is still valid.
     1020                                '[[gallery ...]',
     1021                        ),
     1022                        array(
     1023                                '[gallery ...]]', // This tag is also valid.
     1024                                '[gallery ...]]',
     1025                        ),
     1026                        array(
     1027                                '[/...]', // This would actually be ignored by the shortcode system.  The decision to not texturize it is intentional, if not correct.
     1028                                '[/...]',
     1029                        ),
     1030                        array(
     1031                                '[...]...[/...]', // These are potentially usable shortcodes.
     1032                                '[...]&#8230;[/...]',
     1033                        ),
     1034                        array(
     1035                                '[[...]]...[[/...]]', // Shortcode parsing will ignore the inner ]...[ part and treat this as a single escaped shortcode.
     1036                                '[[...]]&#8230;[[/...]]',
     1037                        ),
     1038                        array(
     1039                                '[[[...]]]...[[[/...]]]', // Again, shortcode parsing matches, but only the [[...] and [/...]] parts.
     1040                                '[[[...]]]&#8230;[[[/...]]]',
     1041                        ),
     1042                        array(
     1043                                '[[code]...[/code]...', // These are potentially usable shortcodes.  Unfortunately, the meaning of [[/code] is ambiguous unless we run the entire shortcode regexp.
     1044                                '[[code]&#8230;[/code]...', // Same behavior as 3.9 due to buggy logic in _wptexturize_pushpop_element().  See ticket #28483.
     1045                        ),
     1046                        array(
     1047                                '[code]...[/code]]...', // These are potentially usable shortcodes.  Unfortunately, the meaning of [/code]] is ambiguous unless we run the entire shortcode regexp.
     1048                                '[code]...[/code]]...', // This test would not pass in 3.9 because the extra brace was always ignored by texturize.
     1049                        ),
     1050                        array(
     1051                                '[gal>ery ...]',
     1052                                '[gal>ery &#8230;]',
     1053                        ),
     1054                        array(
     1055                                '[gallery ...',
     1056                                '[gallery &#8230;',
     1057                        ),
     1058                        array(
     1059                                '[gallery <br ... /> ...]',
     1060                                '[gallery <br ... /> &#8230;]',
     1061                        ),
     1062                        array(
     1063                                '<br [gallery ...] ... />',
     1064                                '<br [gallery ...] ... />',
     1065                        ),
     1066                        array(
     1067                                '<br [gallery ...] ... /',
     1068                                '<br [gallery ...] &#8230; /',
     1069                        ),
     1070                        array(
     1071                                '<br ... />',
     1072                                '<br ... />',
     1073                        ),
     1074                        array(
     1075                                '<br ... />...<br ... />',
     1076                                '<br ... />&#8230;<br ... />',
     1077                        ),
     1078                        array(
     1079                                '[gallery ...]...[gallery ...]',
     1080                                '[gallery ...]&#8230;[gallery ...]',
     1081                        ),
     1082                        array(
     1083                                '[[gallery ...]]',
     1084                                '[[gallery ...]]',
     1085                        ),
     1086                        array(
     1087                                '[[gallery ...]',
     1088                                '[[gallery ...]',
     1089                        ),
     1090                        array(
     1091                                '[gallery ...]]',
     1092                                '[gallery ...]]',
     1093                        ),
     1094                        array(
     1095                                '[/gallery ...]]',
     1096                                '[/gallery ...]]',
     1097                        ),
     1098                        array(
     1099                                '[[gallery <br ... /> ...]]',
     1100                                '[[gallery <br ... /> &#8230;]]',
     1101                        ),
     1102                        array(
     1103                                '<br [[gallery ...]] ... />',
     1104                                '<br [[gallery ...]] ... />',
     1105                        ),
     1106                        array(
     1107                                '<br [[gallery ...]] ... /',
     1108                                '<br [[gallery ...]] &#8230; /',
     1109                        ),
     1110                        array(
     1111                                '[[gallery ...]]...[[gallery ...]]',
     1112                                '[[gallery ...]]&#8230;[[gallery ...]]',
     1113                        ),
     1114                        array(
     1115                                '[[gallery ...]...[/gallery]]',
     1116                                '[[gallery ...]&#8230;[/gallery]]',
     1117                        ),
     1118                        array(
     1119                                '<!-- ... -->',
     1120                                '<!-- ... -->',
     1121                        ),
     1122                        array(
     1123                                '<!--...-->',
     1124                                '<!--...-->',
     1125                        ),
     1126                        array(
     1127                                '<!-- ... -- >',
     1128                                '<!-- ... -- >',
     1129                        ),
     1130                        array(
     1131                                '<!-- <br /> [gallery] ... -->',
     1132                                '<!-- <br /> [gallery] ... -->',
     1133                        ),
     1134                        array(
     1135                                '...<!-- ... -->...',
     1136                                '&#8230;<!-- ... -->&#8230;',
     1137                        ),
     1138                        array(
     1139                                '[gallery ...]...<!-- ... -->...<br ... />',
     1140                                '[gallery ...]&#8230;<!-- ... -->&#8230;<br ... />',
     1141                        ),
     1142                        array(
     1143                                '<ul><li>Hello.</li><!--<li>Goodbye.</li>--></ul>',
     1144                                '<ul><li>Hello.</li><!--<li>Goodbye.</li>--></ul>',
     1145                        ),
     1146                );
     1147        }
    9971148}