Changeset 33518
- Timestamp:
- 07/30/2015 07:40:33 PM (10 years ago)
- Location:
- branches/4.2
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/4.2/src/wp-includes/class-wp-embed.php
r33360 r33518 313 313 */ 314 314 public function autoembed( $content ) { 315 // Strip newlines from all elements.316 $content = wp_replace_in_html_tags( $content, array( "\n" => " ") );315 // Replace line breaks from all HTML elements with placeholders. 316 $content = wp_replace_in_html_tags( $content, array( "\n" => '<!-- wp-line-break -->' ) ); 317 317 318 318 // Find URLs that are on their own line. 319 return preg_replace_callback( '|^(\s*)(https?://[^\s"]+)(\s*)$|im', array( $this, 'autoembed_callback' ), $content ); 319 $content = preg_replace_callback( '|^(\s*)(https?://[^\s"]+)(\s*)$|im', array( $this, 'autoembed_callback' ), $content ); 320 321 // Put the line breaks back. 322 return str_replace( '<!-- wp-line-break -->', "\n", $content ); 320 323 } 321 324 -
branches/4.2/src/wp-includes/formatting.php
r33360 r33518 420 420 421 421 // Standardize newline characters to "\n". 422 $pee = str_replace(array("\r\n", "\r"), "\n", $pee); 423 424 // Strip newlines from all elements.425 $pee = wp_replace_in_html_tags( $pee, array( "\n" => " " ) );422 $pee = str_replace(array("\r\n", "\r"), "\n", $pee); 423 424 // Find newlines in all elements and add placeholders. 425 $pee = wp_replace_in_html_tags( $pee, array( "\n" => " <!-- wpnl --> " ) ); 426 426 427 427 // Collapse line breaks before and after <option> elements so they don't get autop'd. … … 510 510 $pee = str_replace(array_keys($pre_tags), array_values($pre_tags), $pee); 511 511 512 // Restore newlines in all elements. 513 $pee = str_replace( " <!-- wpnl --> ", "\n", $pee ); 514 512 515 return $pee; 516 } 517 518 /** 519 * Separate HTML elements and comments from the text. 520 * 521 * @since 4.2.4 522 * 523 * @param string $input The text which has to be formatted. 524 * @return array The formatted text. 525 */ 526 function wp_html_split( $input ) { 527 static $regex; 528 529 if ( ! isset( $regex ) ) { 530 $comments = 531 '!' // Start of comment, after the <. 532 . '(?:' // Unroll the loop: Consume everything until --> is found. 533 . '-(?!->)' // Dash not followed by end of comment. 534 . '[^\-]*+' // Consume non-dashes. 535 . ')*+' // Loop possessively. 536 . '(?:-->)?'; // End of comment. If not found, match all input. 537 538 $cdata = 539 '!\[CDATA\[' // Start of comment, after the <. 540 . '[^\]]*+' // Consume non-]. 541 . '(?:' // Unroll the loop: Consume everything until ]]> is found. 542 . '](?!]>)' // One ] not followed by end of comment. 543 . '[^\]]*+' // Consume non-]. 544 . ')*+' // Loop possessively. 545 . '(?:]]>)?'; // End of comment. If not found, match all input. 546 547 $regex = 548 '/(' // Capture the entire match. 549 . '<' // Find start of element. 550 . '(?(?=!--)' // Is this a comment? 551 . $comments // Find end of comment. 552 . '|' 553 . '(?(?=!\[CDATA\[)' // Is this a comment? 554 . $cdata // Find end of comment. 555 . '|' 556 . '[^>]*>?' // Find end of element. If not found, match all input. 557 . ')' 558 . ')' 559 . ')/s'; 560 } 561 562 return preg_split( $regex, $input, -1, PREG_SPLIT_DELIM_CAPTURE ); 513 563 } 514 564 … … 524 574 function wp_replace_in_html_tags( $haystack, $replace_pairs ) { 525 575 // Find all elements. 526 $comments = 527 '!' // Start of comment, after the <. 528 . '(?:' // Unroll the loop: Consume everything until --> is found. 529 . '-(?!->)' // Dash not followed by end of comment. 530 . '[^\-]*+' // Consume non-dashes. 531 . ')*+' // Loop possessively. 532 . '(?:-->)?'; // End of comment. If not found, match all input. 533 534 $regex = 535 '/(' // Capture the entire match. 536 . '<' // Find start of element. 537 . '(?(?=!--)' // Is this a comment? 538 . $comments // Find end of comment. 539 . '|' 540 . '[^>]*>?' // Find end of element. If not found, match all input. 541 . ')' 542 . ')/s'; 543 544 $textarr = preg_split( $regex, $haystack, -1, PREG_SPLIT_DELIM_CAPTURE ); 576 $textarr = wp_html_split( $haystack ); 545 577 $changed = false; 546 578 -
branches/4.2/src/wp-includes/shortcodes.php
r33499 r33518 329 329 330 330 $pattern = get_shortcode_regex(); 331 332 $comment_regex = 333 '!' // Start of comment, after the <. 334 . '(?:' // Unroll the loop: Consume everything until --> is found. 335 . '-(?!->)' // Dash not followed by end of comment. 336 . '[^\-]*+' // Consume non-dashes. 337 . ')*+' // Loop possessively. 338 . '(?:-->)?'; // End of comment. If not found, match all input. 339 340 $regex = 341 '/(' // Capture the entire match. 342 . '<' // Find start of element. 343 . '(?(?=!--)' // Is this a comment? 344 . $comment_regex // Find end of comment. 345 . '|' 346 . '[^>]*>?' // Find end of element. If not found, match all input. 347 . ')' 348 . ')/s'; 349 350 $textarr = preg_split( $regex, $content, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); 331 $textarr = wp_html_split( $content ); 351 332 352 333 foreach ( $textarr as &$element ) { 353 if ( ' <' !== $element[0] ) {334 if ( '' == $element || '<' !== $element[0] ) { 354 335 continue; 355 336 } … … 366 347 } 367 348 368 if ( $ignore_html || '<!--' === substr( $element, 0, 4 ) ) {349 if ( $ignore_html || '<!--' === substr( $element, 0, 4 ) || '<![CDATA[' === substr( $element, 0, 9 ) ) { 369 350 // Encode all [ and ] chars. 370 351 $element = strtr( $element, $trans ); -
branches/4.2/tests/phpunit/tests/formatting/Autop.php
r31191 r33518 400 400 $this->assertEquals( $expected, trim( wpautop( $content ) ) ); 401 401 } 402 403 /** 404 * Do not allow newlines within HTML elements to become mangled. 405 * 406 * @ticket 33106 407 * @dataProvider data_element_sanity 408 */ 409 function test_element_sanity( $input, $output ) { 410 return $this->assertEquals( $output, wpautop( $input ) ); 411 } 412 413 function data_element_sanity() { 414 return array( 415 array( 416 "Hello <a\nhref='world'>", 417 "<p>Hello <a\nhref='world'></p>\n", 418 ), 419 array( 420 "Hello <!-- a\nhref='world' -->", 421 "<p>Hello <!-- a\nhref='world' --></p>\n", 422 ), 423 /* Block elements inside comments will fail this test in all versions, it's not a regression. 424 array( 425 "Hello <!-- <hr> a\nhref='world' -->", 426 "<p>Hello <!-- <hr> a\nhref='world' --></p>\n", 427 ), 428 array( 429 "Hello <![CDATA[ <hr> a\nhttps://youtu.be/jgz0uSaOZbE\n ]]>", 430 "<p>Hello <![CDATA[ <hr> a\nhttps://youtu.be/jgz0uSaOZbE\n ]]></p>\n", 431 ), 432 */ 433 array( 434 "Hello <![CDATA[ a\nhttps://youtu.be/jgz0uSaOZbE\n ]]>", 435 "<p>Hello <![CDATA[ a\nhttps://youtu.be/jgz0uSaOZbE\n ]]></p>\n", 436 ), 437 array( 438 "Hello <![CDATA[ <!-- a\nhttps://youtu.be/jgz0uSaOZbE\n a\n9 ]]> -->", 439 "<p>Hello <![CDATA[ <!-- a\nhttps://youtu.be/jgz0uSaOZbE\n a\n9 ]]> --></p>\n", 440 ), 441 array( 442 "Hello <![CDATA[ <!-- a\nhttps://youtu.be/jgz0uSaOZbE\n a\n9 --> a\n9 ]]>", 443 "<p>Hello <![CDATA[ <!-- a\nhttps://youtu.be/jgz0uSaOZbE\n a\n9 --> a\n9 ]]></p>\n", 444 ), 445 ); 446 } 447 402 448 } -
branches/4.2/tests/phpunit/tests/media.php
r32365 r33518 560 560 } 561 561 562 /** 563 * @ticket 33016 564 */ 565 function test_multiline_cdata() { 566 global $wp_embed; 567 568 $content = <<<EOF 569 <script>// <![CDATA[ 570 _my_function('data'); 571 // ]]> 572 </script> 573 EOF; 574 575 $result = $wp_embed->autoembed( $content ); 576 $this->assertEquals( $content, $result ); 577 } 578 579 /** 580 * @ticket 33016 581 */ 582 function test_multiline_comment() { 583 global $wp_embed; 584 585 $content = <<<EOF 586 <script><!-- 587 my_function(); 588 // --> </script> 589 EOF; 590 591 $result = $wp_embed->autoembed( $content ); 592 $this->assertEquals( $content, $result ); 593 } 594 595 596 /** 597 * @ticket 33016 598 */ 599 function test_multiline_comment_with_embeds() { 600 $content = <<<EOF 601 Start. 602 [embed]http://www.youtube.com/embed/TEST01YRHA0[/embed] 603 <script><!-- 604 my_function(); 605 // --> </script> 606 http://www.youtube.com/embed/TEST02YRHA0 607 [embed]http://www.example.com/embed/TEST03YRHA0[/embed] 608 http://www.example.com/embed/TEST04YRHA0 609 Stop. 610 EOF; 611 612 $expected = <<<EOF 613 <p>Start.<br /> 614 https://youtube.com/watch?v=TEST01YRHA0<br /> 615 <script><!-- 616 my_function(); 617 // --> </script><br /> 618 https://youtube.com/watch?v=TEST02YRHA0<br /> 619 <a href="http://www.example.com/embed/TEST03YRHA0">http://www.example.com/embed/TEST03YRHA0</a><br /> 620 http://www.example.com/embed/TEST04YRHA0<br /> 621 Stop.</p> 622 623 EOF; 624 625 $result = apply_filters( 'the_content', $content ); 626 $this->assertEquals( $expected, $result ); 627 } 628 629 /** 630 * @ticket 33016 631 */ 632 function filter_wp_embed_shortcode_custom( $content, $url ) { 633 if ( 'https://www.example.com/?video=1' == $url ) { 634 $content = '@embed URL was replaced@'; 635 } 636 return $content; 637 } 638 639 /** 640 * @ticket 33016 641 */ 642 function test_oembed_explicit_media_link() { 643 global $wp_embed; 644 add_filter( 'embed_maybe_make_link', array( $this, 'filter_wp_embed_shortcode_custom' ), 10, 2 ); 645 646 $content = <<<EOF 647 https://www.example.com/?video=1 648 EOF; 649 650 $expected = <<<EOF 651 @embed URL was replaced@ 652 EOF; 653 654 $result = $wp_embed->autoembed( $content ); 655 $this->assertEquals( $expected, $result ); 656 657 $content = <<<EOF 658 <a href="https://www.example.com/?video=1">https://www.example.com/?video=1</a> 659 <script>// <![CDATA[ 660 _my_function('data'); 661 myvar = 'Hello world 662 https://www.example.com/?video=1 663 do not break this'; 664 // ]]> 665 </script> 666 EOF; 667 668 $result = $wp_embed->autoembed( $content ); 669 $this->assertEquals( $content, $result ); 670 671 remove_filter( 'embed_maybe_make_link', array( $this, 'filter_wp_embed_shortcode_custom' ), 10 ); 672 } 562 673 }
Note: See TracChangeset
for help on using the changeset viewer.