WordPress.org

Make WordPress Core

Ticket #23625: 23625.10.diff

File 23625.10.diff, 6.5 KB (added by wonderboymusic, 13 months ago)
  • wp-includes/post-formats.php

    diff --git wp-includes/post-formats.php wp-includes/post-formats.php
    index ec68932..70a76fe 100644
    function post_formats_compat( $content, $id = 0 ) { 
    392392} 
    393393 
    394394/** 
     395 * Add chat detection support to the `get_content_chat()` chat parser 
     396 * 
     397 * @since 3.6.0 
     398 * 
     399 * @global array $_wp_chat_parsers 
     400 * @param string $name Unique identifier for chat format. Example: IRC 
     401 * @param string $newline_regex RegEx to match the start of a new line, typically when a new "username:" appears 
     402 *      The parser will handle up to 3 matched expressions 
     403 *      $matches[0] = the string before the user's message starts 
     404 *      $matches[1] = the time of the message, if present 
     405 *      $matches[2] = the author/username 
     406 *      OR 
     407 *      $matches[0] = the string before the user's message starts 
     408 *      $matches[1] = the author/username 
     409 * @param string $delimiter_regex RegEx to determine where to split the username syntax from the chat message 
     410 */ 
     411function add_chat_detection_format( $name, $newline_regex, $delimiter_regex ) { 
     412        global $_wp_chat_parsers; 
     413 
     414        if ( empty( $_wp_chat_parsers ) ) 
     415                $_wp_chat_parsers = array(); 
     416 
     417        $_wp_chat_parsers = array( $name => array( $newline_regex, $delimiter_regex ) ) + $_wp_chat_parsers; 
     418} 
     419add_chat_detection_format( 'IM', '#^([^:]+):#', '#[:]#' ); 
     420add_chat_detection_format( 'Skype', '#^(\[.+?\])\s([^:]+):#', '#[:]#' ); 
     421 
     422/** 
     423 * Deliberately interpret passed content as a chat transcript that is optionally 
     424 * followed by commentary 
     425 * 
     426 * If the content does not contain username syntax, assume that it does not contain 
     427 * chat logs and return 
     428 * 
     429 * @since 3.6.0 
     430 * 
     431 * Example: 
     432 * 
     433 * One stanza of chat: 
     434 * Scott: Hey, let's chat! 
     435 * Helen: No. 
     436 * 
     437 * $stanzas = array( 
     438 *     array( 
     439 *         array( 
     440 *             'time' => '', 
     441 *             'author' => 'Scott', 
     442 *             'messsage' => "Hey, let's chat!" 
     443 *         ), 
     444 *         array( 
     445 *             'time' => '', 
     446 *             'author' => 'Helen', 
     447 *             'message' => 'No.' 
     448 *         ) 
     449 *     ) 
     450 * ) 
     451 * @param string $content A string which might contain chat data. 
     452 * @param boolean $remove Whether to remove the found data from the passed content. 
     453 * @return array A chat log as structured data 
     454 */ 
     455function get_content_chat( &$content, $remove = false ) { 
     456        global $_wp_chat_parsers; 
     457 
     458        $trimmed = trim( $content ); 
     459        if ( empty( $trimmed ) ) 
     460                return array(); 
     461 
     462        $has_match = false; 
     463        $matched_parser = false; 
     464        foreach ( $_wp_chat_parsers as $parser ) { 
     465                @list( $newline_regex ) = $parser; 
     466                if ( preg_match( $newline_regex, $trimmed ) ) { 
     467                        $has_match = true; 
     468                        $matched_parser = $parser; 
     469                        break; 
     470                } 
     471        } 
     472 
     473        if ( false === $matched_parser ) 
     474                return array(); 
     475 
     476        @list( $newline_regex, $delimiter_regex ) = $parser; 
     477 
     478        $last_index = 0; 
     479        $stanzas = array(); 
     480        $lines = explode( "\n", make_clickable( $trimmed ) ); 
     481 
     482        $author = $time = ''; 
     483        $data = array(); 
     484        $stanza = array(); 
     485 
     486        foreach ( $lines as $index => $line ) { 
     487                $line = trim( $line ); 
     488 
     489                if ( empty( $line ) ) { 
     490                        if ( ! empty( $author ) ) { 
     491                                $stanza[] = array( 
     492                                        'time' => $time, 
     493                                        'author' => $author, 
     494                                        'message' => join( ' ', $data ) 
     495                                ); 
     496                        } 
     497 
     498                        $stanzas[] = $stanza; 
     499                        $last_index = $index; 
     500                        $stanza = array(); 
     501                        $author = $time = ''; 
     502                        $data = array(); 
     503                        if ( ! empty( $lines[$index + 1] ) && ! preg_match( $delimiter_regex, $lines[$index + 1] ) ) 
     504                                break; 
     505                } 
     506 
     507                $matches = array(); 
     508                $matched = preg_match( $newline_regex, $line, $matches ); 
     509                $author_match = empty( $matches[2] ) ? $matches[1] : $matches[2]; 
     510                // assume username syntax if no whitespace is present 
     511                $no_ws = $matched && ! preg_match( '#\s#', $author_match ); 
     512                // allow script-like stanzas 
     513                $has_ws = $matched && preg_match( '#\s#', $author_match ) && empty( $lines[$index + 1] ) && empty( $lines[$index - 1] ); 
     514                if ( $matched && ( ! empty( $matches[2] ) || ( $no_ws || $has_ws ) ) ) { 
     515                        if ( ! empty( $author ) ) { 
     516                                $stanza[] = array( 
     517                                        'time' => $time, 
     518                                        'author' => $author, 
     519                                        'message' => join( ' ', $data ) 
     520                                ); 
     521                                $data = array(); 
     522                        } 
     523 
     524                        $time = empty( $matches[2] ) ? '' : $matches[1]; 
     525                        $author = $author_match; 
     526                        $data[] = trim( str_replace( $matches[0], '', $line ) ); 
     527                } elseif ( preg_match( '#\S#', $line ) ) { 
     528                        $data[] = $line; 
     529                } 
     530        } 
     531 
     532        if ( ! empty( $author ) ) { 
     533                $stanza[] = array( 
     534                        'time' => $time, 
     535                        'author' => $author, 
     536                        'message' => trim( join( ' ', $data ) ) 
     537                ); 
     538        } 
     539 
     540        if ( ! empty( $stanza ) ) 
     541                $stanzas[] = $stanza; 
     542 
     543        if ( $remove ) 
     544                $content = trim( join( "\n", array_slice( $lines, $last_index ) ) ); 
     545 
     546        return $stanzas; 
     547} 
     548 
     549/** 
     550 * Retrieve structured chat data from the current or passed post 
     551 * 
     552 * @since 3.6.0 
     553 * 
     554 * @param int $id Optional. Post ID 
     555 * @return array 
     556 */ 
     557function get_the_chat( $id = 0 ) { 
     558        $post = empty( $id ) ? clone get_post() : get_post( $id ); 
     559        if ( empty( $post ) ) 
     560                return array(); 
     561 
     562        $data = get_content_chat( get_paged_content( $post->post_content ) ); 
     563        if ( empty( $data ) ) 
     564                return array(); 
     565 
     566        return $data; 
     567} 
     568 
     569/** 
    395570 * Extract a URL from passed content, if possible 
    396571 * Checks for a URL on the first line of the content or the first encountered href attribute. 
    397572 * 
  • wp-includes/query.php

    diff --git wp-includes/query.php wp-includes/query.php
    index 4f0ec99..370f443 100644
    function wp_old_slug_redirect() { 
    36213621                exit; 
    36223622        endif; 
    36233623} 
     3624/** 
     3625 * Split the passed content by <!--nextpage--> 
     3626 * 
     3627 * @since 3.6.0 
     3628 * 
     3629 * @param string $content Content to split 
     3630 * @return array Paged content 
     3631 */ 
     3632function paginate_content( $content ) { 
     3633        $content = str_replace( "\n<!--nextpage-->\n", '<!--nextpage-->', $content ); 
     3634        $content = str_replace( "\n<!--nextpage-->", '<!--nextpage-->', $content ); 
     3635        $content = str_replace( "<!--nextpage-->\n", '<!--nextpage-->', $content ); 
     3636        return explode( '<!--nextpage-->', $content); 
     3637} 
     3638 
     3639/** 
     3640 * Return content offset by $page 
     3641 * 
     3642 * @since 3.6.0 
     3643 * 
     3644 * @param string $content 
     3645 * @return string 
     3646 */ 
     3647function get_paged_content( $content = null, $paged = null ) { 
     3648        global $page; 
     3649        if ( empty( $page ) ) 
     3650                $page = 1; 
     3651 
     3652        if ( empty( $paged ) ) 
     3653                $paged = $page; 
     3654 
     3655        if ( empty( $content ) ) { 
     3656                $post = get_post(); 
     3657                if ( empty( $post ) ) 
     3658                        return; 
     3659 
     3660                $content = $post->post_content; 
     3661        } 
     3662 
     3663        $pages = paginate_content( $content ); 
     3664        if ( isset( $pages[$paged - 1] ) ) 
     3665                return $pages[$paged - 1]; 
     3666 
     3667        return reset( $pages ); 
     3668} 
    36243669 
    36253670/** 
    36263671 * Set up global post data.