WordPress.org

Make WordPress Core

Ticket #20418: 20418.diff

File 20418.diff, 5.0 KB (added by ryan, 6 years ago)
  • wp-includes/formatting.php

     
    14681468 *
    14691469 * @since 0.71
    14701470 *
    1471  * @param string $ret Content to convert URIs.
     1471 * @param string $text Content to convert URIs.
    14721472 * @return string Content with converted URIs.
    14731473 */
    1474 function make_clickable( $ret ) {
    1475         // Long strings might contain expensive edge cases ...
    1476         if ( 10000 < strlen( $ret ) ) {
    1477                 $r = '';
    1478                 // ... break it up
    1479                 foreach ( _split_str_by_whitespace( $ret, 2100 ) as $chunk ) { // 2100: Extra room for scheme and leading and trailing paretheses
    1480                         if ( 2101 < strlen( $chunk ) ) {
    1481                                 $r .= $chunk; // Too big, no whitespace: bail.
    1482                         } else {
    1483                                 $r .= make_clickable( $chunk );
    1484                         }
     1474function make_clickable( $text ) {
     1475        $r = '';
     1476        $textarr = preg_split( '/(<[^<>]+>)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE ); // split out HTML tags
     1477        foreach ( $textarr as $piece ) {
     1478                if ( empty( $piece ) || ( $piece[0] == '<' && ! preg_match('|^<\s*[\w]{1,20}+://|', $piece) ) ) {
     1479                        $r .= $piece;
     1480                        continue;
    14851481                }
    1486                 return $r;
    1487         }
    14881482
    1489         $ret = " $ret "; // Pad with whitespace to simplify the regexes
     1483                // Long strings might contain expensive edge cases ...
     1484                if ( 10000 < strlen( $piece ) ) {
     1485                        // ... break it up
     1486                        foreach ( _split_str_by_whitespace( $piece, 2100 ) as $chunk ) { // 2100: Extra room for scheme and leading and trailing paretheses
     1487                                if ( 2101 < strlen( $chunk ) ) {
     1488                                        $r .= $chunk; // Too big, no whitespace: bail.
     1489                                } else {
     1490                                        $r .= make_clickable( $chunk );
     1491                                }
     1492                        }
     1493                } else {
     1494                        $ret = " $piece "; // Pad with whitespace to simplify the regexes
    14901495
    1491         $url_clickable = '~
    1492                 ([\\s(<.,;:!?])                                        # 1: Leading whitespace, or punctuation
    1493                 (                                                      # 2: URL
    1494                         [\\w]{1,20}+://                                # Scheme and hier-part prefix
    1495                         (?=\S{1,2000}\s)                               # Limit to URLs less than about 2000 characters long
    1496                         [\\w\\x80-\\xff#%\\~/@\\[\\]*(+=&$-]*+         # Non-punctuation URL character
    1497                         (?:                                            # Unroll the Loop: Only allow puctuation URL character if followed by a non-punctuation URL character
    1498                                 [\'.,;:!?)]                            # Punctuation URL character
    1499                                 [\\w\\x80-\\xff#%\\~/@\\[\\]*(+=&$-]++ # Non-punctuation URL character
    1500                         )*
    1501                 )
    1502                 (\)?)                                                  # 3: Trailing closing parenthesis (for parethesis balancing post processing)
    1503         ~xS'; // The regex is a non-anchored pattern and does not have a single fixed starting character.
    1504               // Tell PCRE to spend more time optimizing since, when used on a page load, it will probably be used several times.
     1496                        $url_clickable = '~
     1497                                ([\\s(<.,;:!?])                                        # 1: Leading whitespace, or punctuation
     1498                                (                                                      # 2: URL
     1499                                        [\\w]{1,20}+://                                # Scheme and hier-part prefix
     1500                                        (?=\S{1,2000}\s)                               # Limit to URLs less than about 2000 characters long
     1501                                        [\\w\\x80-\\xff#%\\~/@\\[\\]*(+=&$-]*+         # Non-punctuation URL character
     1502                                        (?:                                            # Unroll the Loop: Only allow puctuation URL character if followed by a non-punctuation URL character
     1503                                                [\'.,;:!?)]                            # Punctuation URL character
     1504                                                [\\w\\x80-\\xff#%\\~/@\\[\\]*(+=&$-]++ # Non-punctuation URL character
     1505                                        )*
     1506                                )
     1507                                (\)?)                                                  # 3: Trailing closing parenthesis (for parethesis balancing post processing)
     1508                        ~xS'; // The regex is a non-anchored pattern and does not have a single fixed starting character.
     1509                              // Tell PCRE to spend more time optimizing since, when used on a page load, it will probably be used several times.
    15051510
    1506         $ret = preg_replace_callback( $url_clickable, '_make_url_clickable_cb', $ret );
     1511                        $ret = preg_replace_callback( $url_clickable, '_make_url_clickable_cb', $ret );
    15071512
    1508         $ret = preg_replace_callback('#([\s>])((www|ftp)\.[\w\\x80-\\xff\#$%&~/.\-;:=,?@\[\]+]+)#is', '_make_web_ftp_clickable_cb', $ret);
    1509         $ret = preg_replace_callback('#([\s>])([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', '_make_email_clickable_cb', $ret);
     1513                        $ret = preg_replace_callback( '#([\s>])((www|ftp)\.[\w\\x80-\\xff\#$%&~/.\-;:=,?@\[\]+]+)#is', '_make_web_ftp_clickable_cb', $ret );
     1514                        $ret = preg_replace_callback( '#([\s>])([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', '_make_email_clickable_cb', $ret );
    15101515
     1516                        $ret = substr( $ret, 1, -1 ); // Remove our whitespace padding.
     1517                        $r .= $ret;
     1518                }
     1519        }
     1520
    15111521        // Cleanup of accidental links within links
    1512         $ret = preg_replace("#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i", "$1$3</a>", $ret);
    1513         return substr( $ret, 1, -1 ); // Remove our whitespace padding.
     1522        $r = preg_replace( '#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i', "$1$3</a>", $r );
     1523        return $r;
    15141524}
    15151525
    15161526/**