WordPress.org

Make WordPress Core

Ticket #47863: 47863-3.patch

File 47863-3.patch, 4.5 KB (added by mauteri, 10 months ago)

Additional tests and slight code adjustment.

  • src/wp-includes/shortcodes.php

     
    488488 * retrieval of the attributes, since all attributes have to be known.
    489489 *
    490490 * @since 2.5.0
     491 * @since 5.3.0 Support of a full shortcode input.
    491492 *
    492  * @param string $text
     493 * @param string $text  Any single shortcode of any format or key/value pair string.
    493494 * @return array|string List of attribute values.
    494495 *                      Returns empty array if trim( $text ) == '""'.
    495496 *                      Returns empty string if trim( $text ) == ''.
     
    498499function shortcode_parse_atts( $text ) {
    499500        $atts    = array();
    500501        $pattern = get_shortcode_atts_regex();
    501         $text    = preg_replace( "/[\x{00a0}\x{200b}]+/u", ' ', $text );
     502        $text    = trim( preg_replace( "/[\x{00a0}\x{200b}]+/u", ' ', $text ) );
     503
     504        // Remove everything but attributes from shortcode.
     505        if ( preg_match( '/^\[[\w-]+([^\]]*)\]/', $text, $matches ) ) {
     506                if ( count( $matches ) === 2 ) {
     507                        $text = $matches[1];
     508                        $text = preg_replace( "/\/$/", '', $text );
     509                        $text = trim( $text );;
     510                }
     511        }
     512
    502513        if ( preg_match_all( $pattern, $text, $match, PREG_SET_ORDER ) ) {
    503514                foreach ( $match as $m ) {
    504515                        if ( ! empty( $m[1] ) ) {
     
    516527                        }
    517528                }
    518529
    519                 // Reject any unclosed HTML elements
     530                // Reject any unclosed HTML elements.
    520531                foreach ( $atts as &$value ) {
    521532                        if ( false !== strpos( $value, '<' ) ) {
    522533                                if ( 1 !== preg_match( '/^[^<]*+(?:<[^>]*+>[^<]*+)*+$/', $value ) ) {
     
    527538        } else {
    528539                $atts = ltrim( $text );
    529540        }
     541
    530542        return $atts;
    531543}
    532544
  • tests/phpunit/tests/shortcode.php

     
    972972                );
    973973                $this->assertEquals( 'test-shortcode-tag', $this->tagname );
    974974        }
     975
     976        /**
     977         * Testing the `shortcode_parse_atts()` function.
     978         *
     979         * @ticket 47863
     980         *
     981         * @covers ::shortcode_parse_atts
     982         * @dataProvider data_shortcode_parse_atts
     983         *
     984         * @param string       $text     A single shortcode format or key/value pair string.
     985         * @param string|array $expected Expected results.
     986         */
     987        public function test_shortcode_parse_atts( $text, $expected ) {
     988                $actual = shortcode_parse_atts( $text );
     989                $this->assertSame( $expected, $actual );
     990        }
     991
     992        /**
     993         * Data provider for `test_shortcode_parse_atts()`.
     994         *
     995         * @return array {
     996         *     @type array {
     997         *         @type string       $text     A single shortcode format or key/value pair string.
     998         *         @type string|array $expected The expected result.
     999         *     }
     1000         * }
     1001         */
     1002        public function data_shortcode_parse_atts() {
     1003
     1004                return array(
     1005                        array(
     1006                                '',
     1007                                '',
     1008                        ),
     1009                        array(
     1010                                '       ',
     1011                                '',
     1012                        ),
     1013                        array(
     1014                                '""',
     1015                                array(),
     1016                        ),
     1017                        array(
     1018                                '\'\'',
     1019                                array(),
     1020                        ),
     1021                        array(
     1022                                '[unittest]',
     1023                                '',
     1024                        ),
     1025                        array(
     1026                                '[unitest]Unit Test[/unittest]',
     1027                                '',
     1028                        ),
     1029                        array(
     1030                                '[unittest title="unittest" link="https://unit.test/"]',
     1031                                array(
     1032                                        'title' => 'unittest',
     1033                                        'link'  => 'https://unit.test/',
     1034                                ),
     1035                        ),
     1036                        array(
     1037                                '[unittest title="unittest" link="https://unit.test/"/]',
     1038                                array(
     1039                                        'title' => 'unittest',
     1040                                        'link'  => 'https://unit.test/',
     1041                                ),
     1042                        ),
     1043                        array(
     1044                                '[unit_test title="unittest" link="https://unit.test/"/]',
     1045                                array(
     1046                                        'title' => 'unittest',
     1047                                        'link'  => 'https://unit.test/',
     1048                                ),
     1049                        ),
     1050                        array(
     1051                                '[unit-test title="unittest" link="https://unit.test/"/]',
     1052                                array(
     1053                                        'title' => 'unittest',
     1054                                        'link'  => 'https://unit.test/',
     1055                                ),
     1056                        ),
     1057                        array(
     1058                                '[unittest link=https://unit.test/ /]',
     1059                                array(
     1060                                        'link'  => 'https://unit.test/',
     1061                                ),
     1062                        ),
     1063                        array(
     1064                                '[unittest link=https://unit.test/ ]',
     1065                                array(
     1066                                        'link'  => 'https://unit.test/',
     1067                                ),
     1068                        ),
     1069                        array(
     1070                                '[unittest link=https://unit.test/]',
     1071                                array(
     1072                                        'link'  => 'https://unit.test',
     1073                                ),
     1074                        ),
     1075                        array(
     1076                                '[unittest link https://unit.test/ /]',
     1077                                array(
     1078                                        'link',
     1079                                        'https://unit.test/',
     1080                                ),
     1081                        ),
     1082                        array(
     1083                                '[unittest title="unittest" link="https://unit.test/"]Unit Test[/unittest]',
     1084                                array(
     1085                                        'title' => 'unittest',
     1086                                        'link'  => 'https://unit.test/',
     1087                                ),
     1088                        ),
     1089                        array(
     1090                                'title="unittest" link="https://unit.test/"',
     1091                                array(
     1092                                        'title' => 'unittest',
     1093                                        'link'  => 'https://unit.test/',
     1094                                ),
     1095                        ),
     1096                );
     1097
     1098        }
     1099
    9751100}