Make WordPress Core

Changeset 46369


Ignore:
Timestamp:
10/01/2019 03:41:58 AM (5 years ago)
Author:
whyisjake
Message:

Shortcodes: Improve handling from shortcode_parse_attts().

Ensure consistency between shortcode_parse_attts() when being used directly.

Props mauteri, birgire, SergeyBiryukov, kadamwhite, whyisjake.
Fixes #47863.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/shortcodes.php

    r46232 r46369  
    489489 *
    490490 * @since 2.5.0
    491  *
    492  * @param string $text
     491 * @since 5.3.0 Support of a full shortcode input.
     492 *
     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 ) == '""'.
     
    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        $text = $matches[1];
     507    }
     508
    502509    if ( preg_match_all( $pattern, $text, $match, PREG_SET_ORDER ) ) {
    503510        foreach ( $match as $m ) {
     
    517524        }
    518525
    519         // Reject any unclosed HTML elements
     526        // Reject any unclosed HTML elements.
    520527        foreach ( $atts as &$value ) {
    521528            if ( false !== strpos( $value, '<' ) ) {
     
    528535        $atts = ltrim( $text );
    529536    }
     537
    530538    return $atts;
    531539}
  • trunk/tests/phpunit/tests/shortcode.php

    r45607 r46369  
    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                '[unittest title="unittest" link="https://unit.test/"][unit_test foo="bar" bar="foo"][/unittest]',
     1091                array(
     1092                    'title' => 'unittest',
     1093                    'link'  => 'https://unit.test/',
     1094                ),
     1095            ),
     1096            array(
     1097                'title="unittest" link="https://unit.test/"',
     1098                array(
     1099                    'title' => 'unittest',
     1100                    'link'  => 'https://unit.test/',
     1101                ),
     1102            ),
     1103        );
     1104
     1105    }
     1106
    9751107}
Note: See TracChangeset for help on using the changeset viewer.