Ticket #4539: dev-snapshot-2010-11-27.php.diff
File dev-snapshot-2010-11-27.php.diff, 19.0 KB (added by , 14 years ago) |
---|
-
wordpress/wp-includes/formatting.php
31 31 static $static_setup = false, $opening_quote, $closing_quote, $default_no_texturize_tags, $default_no_texturize_shortcodes, $static_characters, $static_replacements, $dynamic_characters, $dynamic_replacements; 32 32 $output = ''; 33 33 $curl = ''; 34 $textarr = preg_split('/(< .*>|\[.*\])/Us', $text, -1, PREG_SPLIT_DELIM_CAPTURE);34 $textarr = preg_split('/(<!--.*-->|<.*>|\[.*\])/Us', $text, -1, PREG_SPLIT_DELIM_CAPTURE); 35 35 $stop = count($textarr); 36 36 37 37 // No need to set up these variables more than once … … 56 56 $static_characters = array_merge(array('---', ' -- ', '--', ' - ', 'xn–', '...', '``', '\'\'', ' (tm)'), $cockney); 57 57 $static_replacements = array_merge(array('—', ' — ', '–', ' – ', 'xn--', '…', $opening_quote, $closing_quote, ' ™'), $cockneyreplace); 58 58 59 $dynamic_ characters = array('/\'(\d\d(?:’|\')?s)/', '/\'(\d)/', '/(\s|\A|[([{<]|")\'/', '/(\d)"/', '/(\d)\'/', '/(\S)\'([^\'\s])/', '/(\s|\A|[([{<])"(?!\s)/', '/"(\s|\S|\Z)/', '/\'([\s.]|\Z)/', '/\b(\d+)x(\d+)\b/');60 $dynamic_replacements = array('’$1','’$1', '$1‘', '$1″', '$1′', '$1’$2', '$1' . $opening_quote . '$2', $closing_quote . '$1', '’$1', '$1×$2');59 $dynamic_map = array( 60 '/([\A\s])\'(\d{2})([^\d]|\'\w|\Z)/' => '$1’$2$3', // '99, '99ers 61 61 62 '/([\w\]})])\'([\w])/' => '$1’$2', // test's 63 64 '/\'([^\']*)\'/' => '‘$1’', // 'asd' 65 '/"([^"]*)"/' => $opening_quote . '$1' . $closing_quote, // "qwe" 66 67 '/(\A|\s)(\d)\'/' => '$1$2′', // 9' 68 '/(\A|\s)(\d)"/' => '$1$2″', // 9" 69 70 '/\b(\d+)x(\d+)\b/' => '$1×$2' // 97x34 71 ); 72 73 $dynamic_characters = array_keys( $dynamic_map ); 74 $dynamic_replacements = array_values( $dynamic_map ); 75 62 76 $static_setup = true; 63 77 } 64 78 … … 70 84 $no_texturize_tags_stack = array(); 71 85 $no_texturize_shortcodes_stack = array(); 72 86 87 $single_quote_state = '‘'; 88 $double_quote_state = $opening_quote; 89 90 $text_node_count = 0; 91 $whitespace_before_last_tag = false; 92 73 93 for ( $i = 0; $i < $stop; $i++ ) { 74 94 $curl = $textarr[$i]; 75 95 … … 78 98 // This is not a tag, nor is the texturization disabled 79 99 // static strings 80 100 $curl = str_replace($static_characters, $static_replacements, $curl); 101 // quotes after tags, e.g. <b>somebody</b>'s 102 if ( ( $text_node_count > 0 ) && ( ! $whitespace_before_last_tag ) ) { 103 $curl = preg_replace( '/^(\')/', '’', $curl ); 104 } 105 81 106 // regular expressions 82 107 $curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl); 108 109 // Quotes that span across multiple tags & shortcodes 110 // Dynamic regexps above ensure that there is at most 1 quote left in the string. 111 // Otherwise, the less efficient preg_replace() within a while loop would be required. 112 if ( strpos( $curl, '\'' ) !== false ) { 113 $curl = str_replace( '\'', $single_quote_state, $curl); 114 $single_quote_state = ( ( '‘' == $single_quote_state ) ? '’' : '‘' ); 115 } 116 if ( strpos($curl, '"' ) !== false ) { 117 $curl = str_replace( '"', $double_quote_state, $curl); 118 $double_quote_state = ( $opening_quote == $double_quote_state ) ? $closing_quote : $opening_quote; 119 } 120 // stats for quotes after tags above 121 $text_node_count++; 122 $whitespace_before_last_tag = ( preg_match('/\s$/', $curl) > 0 ); 83 123 } elseif (!empty($curl)) { 84 124 /* 85 125 * Only call _wptexturize_pushpop_element if first char is correct -
wp-testcase/test_includes_formatting.php
371 371 372 372 $invalid_nest = '<pre></code>"baba"</pre>'; 373 373 $this->assertEquals($invalid_nest, wptexturize($invalid_nest)); 374 } 374 375 376 //WP Ticket #8912, #10033 377 function test_skip_html_comments() { 378 $this->assertEquals('<ul><li>Hello.</li><!--<li>Goodbye.</li>--></ul>', wptexturize('<ul><li>Hello.</li><!--<li>Goodbye.</li>--></ul>')); 379 380 $html = '<!--[if !IE]>-->' . "\n"; 381 $html .= '<object type="application/x-shockwave-flash" data="http://www.youtube.com/v/_nkZ3eHeXlc" width="320" height="260">' . "\n"; 382 $html .= '<!--<![endif]-->' . "\n"; 383 $this->assertEquals($html, wptexturize($html)); 384 385 $html = '<!--[if !IE]>-->' . "\n"; 386 $html .= '</object>' . "\n"; 387 $html .= '<!--<![endif]-->' . "\n"; 388 $this->assertEquals($html, wptexturize($html)); 375 389 } 376 390 377 391 //WP Ticket #1418 … … 388 402 389 403 //WP Ticket #4539 390 404 function test_basic_quotes() { 405 $this->assertNotEquals('‘’', wptexturize("''")); // this does not work as expected due to a static replacement 406 $this->assertEquals('“”', wptexturize('""')); 407 $this->assertEquals('“”', wptexturize("``''")); // this is what causes '' to fail 408 $this->assertEquals('‘ ’', wptexturize("' '")); 409 $this->assertEquals('“ ”', wptexturize('" "')); 410 $this->assertEquals('‘<img src="">’', wptexturize('\'<img src="">\'')); 411 $this->assertEquals('“<img src="">”', wptexturize('"<img src="">"')); 412 $this->assertEquals('Peter’s photo: ‘<img src="">’', wptexturize('Peter\'s photo: \'<img src="">\'')); 413 $this->assertEquals('Peter’s photo: “<img src="">”', wptexturize('Peter\'s photo: "<img src="">"')); 414 391 415 $this->assertEquals('test’s', wptexturize('test\'s')); 392 416 $this->assertEquals('test’s', wptexturize('test\'s')); 393 417 394 418 $this->assertEquals('‘quoted’', wptexturize('\'quoted\'')); 395 419 $this->assertEquals('“quoted”', wptexturize('"quoted"')); 420 $this->assertEquals('‘quoted’s’', wptexturize('\'quoted\'s\'')); 421 $this->assertEquals('“quoted’s”', wptexturize('"quoted\'s"')); 396 422 397 423 $this->assertEquals('(‘quoted’)', wptexturize('(\'quoted\')')); 398 424 $this->assertEquals('{“quoted”}', wptexturize('{"quoted"}')); 425 $this->assertEquals('["quoted"]', wptexturize('["quoted"]')); // shortcode 426 $this->assertEquals('<"quoted">', wptexturize('<"quoted">')); // tag 427 $this->assertEquals('(‘quoted’s’)', wptexturize('(\'quoted\'s\')')); 428 $this->assertEquals('{“quoted’s”}', wptexturize('{"quoted\'s"}')); 429 $this->assertEquals('["quoted\'s"]', wptexturize('["quoted\'s"]')); // shortcode 430 $this->assertEquals('<"quoted\'s">', wptexturize('<"quoted\'s">')); // tag 399 431 400 432 $this->assertEquals('‘qu(ot)ed’', wptexturize('\'qu(ot)ed\'')); 401 433 $this->assertEquals('“qu{ot}ed”', wptexturize('"qu{ot}ed"')); 434 $this->assertEquals('“qu[ot]ed”', wptexturize('"qu[ot]ed"')); 435 $this->assertEquals('“qu<ot>ed”', wptexturize('"qu<ot>ed"')); 436 $this->assertEquals('‘qu(ot)ed’s’', wptexturize('\'qu(ot)ed\'s\'')); 437 $this->assertEquals('“qu{ot}ed’s”', wptexturize('"qu{ot}ed\'s"')); 438 $this->assertEquals('“qu[ot]ed’s”', wptexturize('"qu[ot]ed\'s"')); 439 $this->assertEquals('“qu<ot>ed’s”', wptexturize('"qu<ot>ed\'s"')); 440 $this->assertEquals('‘qu(ot)’s’', wptexturize('\'qu(ot)\'s\'')); 441 $this->assertEquals('“qu{ot}’s”', wptexturize('"qu{ot}\'s"')); 442 $this->assertEquals('“qu[ot]’s”', wptexturize('"qu[ot]\'s"')); 443 $this->assertEquals('“qu<ot>’s”', wptexturize('"qu<ot>\'s"')); 402 444 403 445 $this->assertEquals('‘test’s quoted’', wptexturize('\'test\'s quoted\'')); 404 446 $this->assertEquals('“test’s quoted”', wptexturize('"test\'s quoted"')); 405 447 } 406 448 449 //WP Ticket #14491 450 function test_quoted_numbers() { 451 $this->knownWPBug(14491); 452 453 // 4 digits 454 $this->assertEquals('‘2010’', wptexturize("'2010'")); 455 $this->assertEquals('“2011”', wptexturize('"2011"')); 456 $this->assertEquals('‘ 2010 ’', wptexturize("' 2010 '")); 457 $this->assertEquals('“ 2011 ”', wptexturize('" 2011 "')); 458 $this->assertEquals(' ‘2010’ ', wptexturize(" '2010' ")); 459 $this->assertEquals(' “2011” ', wptexturize(' "2011" ')); 460 $this->assertEquals(' ‘ 2010 ’ ', wptexturize(" ' 2010 ' ")); 461 $this->assertEquals(' “ 2011 ” ', wptexturize(' " 2011 " ')); 462 463 // 2 digits to test against '99' vs '99'ers 464 $this->assertEquals('‘10’', wptexturize("'10'")); 465 $this->assertEquals('“11”', wptexturize('"11"')); 466 $this->assertEquals('‘ 10 ’', wptexturize("' 10 '")); 467 $this->assertEquals('“ 11 ”', wptexturize('" 11 "')); 468 //$this->assertEquals(' ‘10’ ', wptexturize(" '10' ")); 469 $this->assertEquals(' “11” ', wptexturize(' "11" ')); 470 $this->assertEquals(' ‘ 10 ’ ', wptexturize(" ' 10 ' ")); 471 $this->assertEquals(' “ 11 ” ', wptexturize(' " 11 " ')); 472 } 473 474 //WP Ticket #4539 475 function test_nested_quotes() { 476 $this->assertEquals('“This is a ‘nested quote’.”', wptexturize('"This is a \'nested quote\'."')); 477 $this->assertEquals('‘This is a “nested quote”.’', wptexturize('\'This is a "nested quote".\'')); 478 $this->assertEquals('“These are some ‘nested’ ‘quotes’.”', wptexturize('"These are some \'nested\' \'quotes\'."')); 479 $this->assertEquals('‘These are some “nested” “quotes”.’', wptexturize('\'These are some "nested" "quotes".\'')); 480 } 481 407 482 //WP Tickets #4539, #15241 408 483 function test_full_sentences_with_unmatched_single_quotes() { 409 484 $this->assertEquals( 410 485 'That means every moment you’re working on something without it being in the public it’s actually dying.', 411 486 wptexturize("That means every moment you're working on something without it being in the public it's actually dying.") 412 487 ); 488 $this->assertEquals( 489 '‘That means every moment you’re working on something without it being in the public it’s actually dying.’', 490 wptexturize("'That means every moment you're working on something without it being in the public it's actually dying.'") 491 ); 492 $this->assertEquals( 493 '“That means every moment you’re working on something without it being in the public it’s actually dying.”', 494 wptexturize("\"That means every moment you're working on something without it being in the public it's actually dying.\"") 495 ); 496 $this->assertEquals( 497 'That means every moment you’re working on ‘something’ without it being in the public it’s actually dying.', 498 wptexturize("That means every moment you're working on 'something' without it being in the public it's actually dying.") 499 ); 500 $this->assertEquals( 501 'That means every moment you’re working on “something” without it being in the public it’s actually dying.', 502 wptexturize("That means every moment you're working on \"something\" without it being in the public it's actually dying.") 503 ); 413 504 } 414 505 415 //WP Ticket #4539506 //WP Tickets #4539, #10606 416 507 function test_quotes() { 417 508 $this->knownWPBug(4539); 418 509 $this->assertEquals('“Quoted String”', wptexturize('"Quoted String"')); 419 510 $this->assertEquals('Here is “<a href="http://example.com">a test with a link</a>”', wptexturize('Here is "<a href="http://example.com">a test with a link</a>"')); 511 $this->assertEquals('Here is “ <a href="http://example.com">a test with a link</a> ”', wptexturize('Here is " <a href="http://example.com">a test with a link</a> "')); 512 $this->assertEquals('Here is “<a href="http://example.com"> a test with a link </a>”', wptexturize('Here is "<a href="http://example.com"> a test with a link </a>"')); 420 513 $this->assertEquals('Here is “<a href="http://example.com">a test with a link and a period</a>”.', wptexturize('Here is "<a href="http://example.com">a test with a link and a period</a>".')); 421 514 $this->assertEquals('Here is “<a href="http://example.com">a test with a link</a>” and a space.', wptexturize('Here is "<a href="http://example.com">a test with a link</a>" and a space.')); 422 515 $this->assertEquals('Here is “<a href="http://example.com">a test with a link</a> and some text quoted”', wptexturize('Here is "<a href="http://example.com">a test with a link</a> and some text quoted"')); … … 424 517 $this->assertEquals('Here is “<a href="http://example.com">a test with a link</a>”; and a semi-colon.', wptexturize('Here is "<a href="http://example.com">a test with a link</a>"; and a semi-colon.')); 425 518 $this->assertEquals('Here is “<a href="http://example.com">a test with a link</a>”- and a dash.', wptexturize('Here is "<a href="http://example.com">a test with a link</a>"- and a dash.')); 426 519 $this->assertEquals('Here is “<a href="http://example.com">a test with a link</a>”… and ellipses.', wptexturize('Here is "<a href="http://example.com">a test with a link</a>"... and ellipses.')); 520 $this->assertEquals('Here is “<a href="http://example.com">a test</a> with a link”.', wptexturize('Here is "<a href="http://example.com">a test</a> with a link".')); 427 521 $this->assertEquals('Here is “a test <a href="http://example.com">with a link</a>”.', wptexturize('Here is "a test <a href="http://example.com">with a link</a>".')); 428 $this->assertEquals('Here is “<a href="http://example.com">a test with a link</a>”and a work stuck to the end.', wptexturize('Here is "<a href="http://example.com">a test with a link</a>"and a work stuck to the end.')); 522 $this->assertEquals('Here is “a test <a href="http://example.com">with a link</a>” .', wptexturize('Here is "a test <a href="http://example.com">with a link</a>" .')); 523 $this->assertEquals('Here is “<a href="http://example.com">a test with a link</a>”and a word stuck to the end.', wptexturize('Here is "<a href="http://example.com">a test with a link</a>"and a word stuck to the end.')); 429 524 $this->assertEquals('A test with a finishing number, “like 23”.', wptexturize('A test with a finishing number, "like 23".')); 430 525 $this->assertEquals('A test with a number, “like 62”, is nice to have.', wptexturize('A test with a number, "like 62", is nice to have.')); 431 526 } … … 451 546 $this->assertEquals('“Class of 99”', wptexturize("\"Class of 99\"")); 452 547 $this->assertEquals('“Class of ’99”', wptexturize("\"Class of '99\"")); 453 548 } 454 455 function test_quotes_after_numbers() { 456 $this->assertEquals('Class of ’99', wptexturize("Class of '99")); 457 } 458 549 459 550 //WP Ticket #15241 460 551 function test_other_html() { 461 552 $this->knownWPBug(15241); 462 553 $this->assertEquals('‘<strong>', wptexturize("'<strong>")); 554 $this->assertEquals('“<strong>', wptexturize('"<strong>')); 555 $this->assertEquals('‘<strong></strong>’', wptexturize("'<strong></strong>'")); 556 $this->assertEquals('“<strong></strong>”', wptexturize('"<strong></strong>"')); 463 557 $this->assertEquals('‘<strong>Quoted Text</strong>’,', wptexturize("'<strong>Quoted Text</strong>',")); 464 558 $this->assertEquals('“<strong>Quoted Text</strong>”,', wptexturize('"<strong>Quoted Text</strong>",')); 465 559 } 466 560 561 //WP Ticket #15241 562 function test_many_single_quotes() { 563 $this->assertEquals('This isn’t inherently bad, but I don’t think it’s normal.', wptexturize("This isn't inherently bad, but I don't think it's normal.")); 564 } 565 566 //WP Ticket #1258 567 function test_enumeration() { 568 $this->assertEquals("‘products’, ‘services’", wptexturize("'products', 'services'")); 569 $this->assertEquals("‘hello’, ‘world’, ’tis", wptexturize("'hello', 'world', 'tis")); 570 $this->assertEquals("‘hello’, ‘world’, ’tis ", wptexturize("'hello', 'world', 'tis ")); 571 } 572 573 //WP Ticket #11275 574 function test_quoting() { 575 $this->assertEquals('She said—“No!”', wptexturize('She said—"No!"')); 576 $this->assertEquals('She said — “No!”', wptexturize('She said — "No!"')); 577 $this->assertEquals('She said—“<a href="#">No!</a>”', wptexturize('She said—"<a href="#">No!</a>"')); 578 $this->assertEquals('She said—‘<a href="#">It’s Peter’s!</a>’', wptexturize('She said—\'<a href="#">It\'s Peter\'s!</a>\'')); 579 $this->assertEquals('She said—“<a href="#">It’s Peter’s!</a>”', wptexturize('She said—"<a href="#">It\'s Peter\'s!</a>"')); 580 } 581 582 //WP Ticket #15444 583 function test_tag_followed_by_quote() { 584 $this->knownWPBug(15444); 585 $this->assertEquals('<a href="#">Jim</a>’s red bike.', wptexturize('<a href="#">Jim</a>\'s red bike.')); 586 $this->assertEquals('‘<a href="#">Jim</a>’s red bike.’', wptexturize('\'<a href="#">Jim</a>\'s red bike.\'')); 587 $this->assertEquals('“<a href="#">Jim</a>’s red bike.”', wptexturize('"<a href="#">Jim</a>\'s red bike."')); 588 $this->assertEquals('<a href="#">Jim</a>’s ‘red bike.’', wptexturize('<a href="#">Jim</a>\'s \'red bike.\'')); 589 $this->assertEquals('<a href="#">Jim</a>’s “red bike.”', wptexturize('<a href="#">Jim</a>\'s "red bike."')); 590 $this->assertEquals('<a href="#">Jim</a>’s ‘<a href="#">red bike</a>.’', wptexturize('<a href="#">Jim</a>\'s \'<a href="#">red bike</a>.\'')); 591 $this->assertEquals('<a href="#">Jim</a>’s “<a href="#">red bike</a>.”', wptexturize('<a href="#">Jim</a>\'s "<a href="#">red bike</a>."')); 592 } 593 467 594 function test_x() { 468 595 $this->assertEquals('14×24', wptexturize("14x24")); 596 $this->assertEquals('‘14×24’', wptexturize("'14x24'")); 597 $this->assertEquals('“14×24”', wptexturize('"14x24"')); 598 $this->assertEquals('‘<a href="#">14×24</a>’', wptexturize('\'<a href="#">14x24</a>\'')); 599 $this->assertEquals('“<a href="#">14×24</a>”', wptexturize('"<a href="#">14x24</a>"')); 469 600 } 470 601 602 //WP Ticket #4116 603 function test_x_4116() { 604 $this->knownWPBug(4116); 605 $this->assertEquals('www.a4x3b.com', wptexturize("www.a4x3b.com")); 606 $this->assertEquals('http://www.youtube.com/watch?v=irWR7F0x2uU', wptexturize("http://www.youtube.com/watch?v=irWR7F0x2uU")); 607 } 608 471 609 function test_minutes_seconds() { 472 610 $this->assertEquals('9′', wptexturize('9\'')); 473 611 $this->assertEquals('9″', wptexturize("9\"")); … … 484 622 $this->assertEquals(' “Testing”', wptexturize(' "Testing"')); 485 623 $this->assertEquals('&“Testing”', wptexturize('&"Testing"')); 486 624 } 625 626 //WP Ticket #6969 627 function test_shortcode_skip() { 628 $this->assertEquals('[code lang="php"]$foo = \'bar\';[/code]', wptexturize('[code lang="php"]$foo = \'bar\';[/code]')); 629 } 630 487 631 } 488 632 489 633 class TestCleanUrl extends WPTestCase {