WordPress.org

Make WordPress Core

Ticket #47014: 47014.diff

File 47014.diff, 8.9 KB (added by flixos90, 7 weeks ago)
  • src/wp-includes/formatting.php

     
    24652465        // WP bug fix for LOVE <3 (and other situations with '<' before a number)
    24662466        $text = preg_replace( '#<([0-9]{1})#', '&lt;$1', $text );
    24672467
    2468         while ( preg_match( '/<(\/?[\w:]*)\s*([^>]*)>/', $text, $regex ) ) {
     2468        while ( preg_match( '/<(\/?[a-z0-9]+-[a-z0-9-]+|\/?[\w:]*)(\s*)([^>]*)>/', $text, $regex ) ) {
    24692469                $newtext .= $tagqueue;
    24702470
    24712471                $i = strpos( $text, $regex[0] );
    24722472                $l = strlen( $regex[0] );
    24732473
     2474                // Do not modify since tags shouldn't end in a dash.
     2475                if ( empty( $regex[2] ) && isset( $regex[3][0] ) && '-' === $regex[3][0] ) {
     2476                        $newtext .= substr( $text, 0, $i + $l );
     2477                        $text     = substr( $text, $i + $l );
     2478                        continue;
     2479                }
     2480
    24742481                // clear the shifter
    24752482                $tagqueue = '';
    24762483                // Pop or Push
     
    25082515                        // If it's an empty tag "< >", do nothing
    25092516                        if ( '' == $tag ) {
    25102517                                // do nothing
    2511                         } elseif ( substr( $regex[2], -1 ) == '/' ) { // ElseIf it presents itself as a self-closing tag...
     2518                        } elseif ( substr( $regex[3], -1 ) == '/' ) { // ElseIf it presents itself as a self-closing tag...
    25122519                                // ...but it isn't a known single-entity self-closing tag, then don't let it be treated as such and
    25132520                                // immediately close it with a closing tag (the tag will encapsulate no text as a result)
    25142521                                if ( ! in_array( $tag, $single_tags ) ) {
    2515                                         $regex[2] = trim( substr( $regex[2], 0, -1 ) ) . "></$tag";
     2522                                        $regex[3] = trim( substr( $regex[3], 0, -1 ) ) . "></$tag";
    25162523                                }
    25172524                        } elseif ( in_array( $tag, $single_tags ) ) { // ElseIf it's a known single-entity tag but it doesn't close itself, do so
    2518                                 $regex[2] .= '/';
     2525                                $regex[3] .= '/';
    25192526                        } else { // Else it's not a single-entity tag
    25202527                                // If the top of the stack is the same as the tag we want to push, close previous tag
    25212528                                if ( $stacksize > 0 && ! in_array( $tag, $nestable_tags ) && $tagstack[ $stacksize - 1 ] == $tag ) {
     
    25262533                        }
    25272534
    25282535                        // Attributes
    2529                         $attributes = $regex[2];
     2536                        $attributes = $regex[3];
    25302537                        if ( ! empty( $attributes ) && $attributes[0] != '>' ) {
    25312538                                $attributes = ' ' . $attributes;
    25322539                        }
     
    30403047function wp_targeted_link_rel( $text ) {
    30413048        // Don't run (more expensive) regex if no links with targets.
    30423049        if ( stripos( $text, 'target' ) !== false && stripos( $text, '<a ' ) !== false ) {
    3043                 if ( ! is_serialized( $text ) ) {
    3044                         $text = preg_replace_callback( '|<a\s([^>]*target\s*=[^>]*)>|i', 'wp_targeted_link_rel_callback', $text );
    3045                 }
     3050                $text = preg_replace_callback( '|<a\s([^>]*target\s*=[^>]*)>|i', 'wp_targeted_link_rel_callback', $text );
    30463051        }
    30473052
    30483053        return $text;
     
    30963101                $delimiter = trim( $rel_match[1] ) ? $rel_match[1] : '"';
    30973102                $rel       = 'rel=' . $delimiter . trim( implode( ' ', $parts ) ) . $delimiter;
    30983103                $link_html = str_replace( $rel_match[0], $rel, $link_html );
    3099         } elseif ( preg_match( '|target\s*=\s*?\\\\"|', $link_html ) ) {
    3100                 $link_html .= " rel=\\\"$rel\\\"";
    3101         } elseif ( preg_match( '#(target|href)\s*=\s*?\'#', $link_html ) ) {
    3102                 $link_html .= " rel='$rel'";
    31033104        } else {
    31043105                $link_html .= " rel=\"$rel\"";
    31053106        }
     
    34323433        if ( $tz ) {
    34333434                $datetime = date_create( $string, new DateTimeZone( 'UTC' ) );
    34343435                if ( ! $datetime ) {
    3435                         return gmdate( $format, 0 );
     3436                        return date( $format, 0 );
    34363437                }
    34373438                $datetime->setTimezone( new DateTimeZone( $tz ) );
    34383439                $string_localtime = $datetime->format( $format );
    34393440        } else {
    34403441                if ( ! preg_match( '#([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})#', $string, $matches ) ) {
    3441                         return gmdate( $format, 0 );
     3442                        return date( $format, 0 );
    34423443                }
    34433444                $string_time      = gmmktime( $matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1] );
    34443445                $string_localtime = gmdate( $format, $string_time + get_option( 'gmt_offset' ) * HOUR_IN_SECONDS );
     
    48114812 * @since 2.5.0
    48124813 * @link https://secure.php.net/sprintf
    48134814 *
    4814  * @param string $pattern The string which formatted args are inserted.
    4815  * @param mixed  ...$args Arguments to be formatted into the $pattern string.
     4815 * @param string $pattern   The string which formatted args are inserted.
     4816 * @param mixed  $args ,... Arguments to be formatted into the $pattern string.
    48164817 * @return string The formatted string.
    48174818 */
    48184819function wp_sprintf( $pattern ) {
     
    55205521
    55215522                /*
    55225523                 * If you're looking at a src version of this file, you'll see an "include"
    5523                  * statement below. This is used by the `npm run build` process to directly
     5524                 * statement below. This is used by the `grunt build` process to directly
    55245525                 * include a minified version of wp-emoji-loader.js, instead of using the
    55255526                 * readfile() method from above.
    55265527                 *
     
    55315532                ?>
    55325533                <script type="text/javascript">
    55335534                        window._wpemojiSettings = <?php echo wp_json_encode( $settings ); ?>;
    5534                         include "js/wp-emoji-loader.min.js"
     5535                        !function(a,b,c){function d(a,b){var c=String.fromCharCode;l.clearRect(0,0,k.width,k.height),l.fillText(c.apply(this,a),0,0);var d=k.toDataURL();l.clearRect(0,0,k.width,k.height),l.fillText(c.apply(this,b),0,0);var e=k.toDataURL();return d===e}function e(a){var b;if(!l||!l.fillText)return!1;switch(l.textBaseline="top",l.font="600 32px Arial",a){case"flag":return!(b=d([55356,56826,55356,56819],[55356,56826,8203,55356,56819]))&&(b=d([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]),!b);case"emoji":return b=d([55357,56424,55356,57342,8205,55358,56605,8205,55357,56424,55356,57340],[55357,56424,55356,57342,8203,55358,56605,8203,55357,56424,55356,57340]),!b}return!1}function f(a){var c=b.createElement("script");c.src=a,c.defer=c.type="text/javascript",b.getElementsByTagName("head")[0].appendChild(c)}var g,h,i,j,k=b.createElement("canvas"),l=k.getContext&&k.getContext("2d");for(j=Array("flag","emoji"),c.supports={everything:!0,everythingExceptFlag:!0},i=0;i<j.length;i++)c.supports[j[i]]=e(j[i]),c.supports.everything=c.supports.everything&&c.supports[j[i]],"flag"!==j[i]&&(c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&c.supports[j[i]]);c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&!c.supports.flag,c.DOMReady=!1,c.readyCallback=function(){c.DOMReady=!0},c.supports.everything||(h=function(){c.readyCallback()},b.addEventListener?(b.addEventListener("DOMContentLoaded",h,!1),a.addEventListener("load",h,!1)):(a.attachEvent("onload",h),b.attachEvent("onreadystatechange",function(){"complete"===b.readyState&&c.readyCallback()})),g=c.source||{},g.concatemoji?f(g.concatemoji):g.wpemoji&&g.twemoji&&(f(g.twemoji),f(g.wpemoji)))}(window,document,window._wpemojiSettings);
    55355536                </script>
    55365537                <?php
    55375538        }
     
    57365737 * Returns arrays of emoji data.
    57375738 *
    57385739 * These arrays are automatically built from the regex in twemoji.js - if they need to be updated,
    5739  * you should update the regex there, then run the `npm run grunt precommit:emoji` job.
     5740 * you should update the regex there, then run the `grunt precommit:emoji` job.
    57405741 *
    57415742 * @since 4.9.0
    57425743 * @access private
  • tests/phpunit/tests/formatting/balanceTags.php

     
    6868                        '<em />',
    6969                        '<p class="main1"/>',
    7070                        '<p class="main2" />',
     71                        '<STRONG/>',
    7172                );
    7273                $expected = array(
    7374                        '<strong></strong>',
     
    7475                        '<em></em>',
    7576                        '<p class="main1"></p>',
    7677                        '<p class="main2"></p>',
     78                        // Valid tags are transformed to lowercase.
     79                        '<strong></strong>',
    7780                );
    7881
    7982                foreach ( $inputs as $key => $input ) {
     
    221224                }
    222225        }
    223226
     227        /**
     228         * Get custom element data.
     229         *
     230         * @return array Data.
     231         */
     232        public function data_custom_elements() {
     233                return array(
     234                        // Valid custom element tags.
     235                        array(
     236                                '<my-custom-element>Test</my-custom-element>',
     237                                '<my-custom-element>Test</my-custom-element>',
     238                        ),
     239                        array(
     240                                '<my-custom-element>Test',
     241                                '<my-custom-element>Test</my-custom-element>',
     242                        ),
     243                        array(
     244                                'Test</my-custom-element>',
     245                                'Test',
     246                        ),
     247                        array(
     248                                '</my-custom-element>Test',
     249                                'Test',
     250                        ),
     251                        // Invalid (or at least temporarily unsupported) custom element tags.
     252                        array(
     253                                '<MY-CUSTOM-ELEMENT>Test',
     254                                '<MY-CUSTOM-ELEMENT>Test',
     255                        ),
     256                        array(
     257                                '<my->Test',
     258                                '<my->Test',
     259                        ),
     260                        array(
     261                                '<--->Test',
     262                                '<--->Test',
     263                        ),
     264                );
     265        }
     266
     267        /**
     268         * Test custom elements.
     269         *
     270         * @ticket 47014
     271         * @dataProvider data_custom_elements
     272         *
     273         * @param string $source   Source.
     274         * @param string $expected Expected.
     275         */
     276        public function test_custom_elements( $source, $expected ) {
     277                $this->assertEquals( $expected, balanceTags( $source, true ) );
     278        }
    224279}