WordPress.org

Make WordPress Core


Ignore:
Timestamp:
06/19/2015 08:05:52 PM (6 years ago)
Author:
wonderboymusic
Message:

wptexturize() improvements:

  • Make sure that strings ending with a number and quotation mark get the proper smart quotes
  • Introduce wptexturize_primes(), a logic tree to determine whether or not "7'." represents seven feet, then converts the special char into either a prime char or a closing quote char.

Adds unit tests.

Props miqrogroove.
Fixes #29256.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tests/phpunit/tests/formatting/WPTexturize.php

    r32789 r32863  
    9191        //$this->assertEquals('Here is &#8220;a test <a href="http://example.com">with a link</a>&#8221;.', wptexturize('Here is "a test <a href="http://example.com">with a link</a>".'));
    9292        //$this->assertEquals('Here is &#8220;<a href="http://example.com">a test with a link</a>&#8221;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.'));
    93         //$this->assertEquals('A test with a finishing number, &#8220;like 23&#8221;.', wptexturize('A test with a finishing number, "like 23".'));
    94         //$this->assertEquals('A test with a number, &#8220;like 62&#8221;, is nice to have.', wptexturize('A test with a number, "like 62", is nice to have.'));
     93        $this->assertEquals('A test with a finishing number, &#8220;like 23&#8221;.', wptexturize('A test with a finishing number, "like 23".'));
     94        $this->assertEquals('A test with a number, &#8220;like 62&#8221;, is nice to have.', wptexturize('A test with a number, "like 62", is nice to have.'));
    9595    }
    9696
     
    122122        $this->assertEquals('&#8216;Class of &#8217;99&#8217;s&#8217;', wptexturize("'Class of '99's'"));
    123123        $this->assertEquals('&#8216;Class of &#8217;99&#8217;s&#8217;', wptexturize("'Class of '99&#8217;s'"));
    124         //$this->assertEquals('&#8220;Class of 99&#8221;', wptexturize("\"Class of 99\""));
     124        $this->assertEquals('&#8220;Class of 99&#8221;', wptexturize("\"Class of 99\""));
    125125        $this->assertEquals('&#8220;Class of &#8217;99&#8221;', wptexturize("\"Class of '99\""));
    126126        $this->assertEquals('{&#8220;Class of &#8217;99&#8221;}', wptexturize("{\"Class of '99\"}"));
     
    19011901        );
    19021902    }
     1903
     1904    /**
     1905     * Ensure primes logic is not too greedy at the end of a quotation.
     1906     *
     1907     * @ticket 29256
     1908     * @dataProvider data_primes_vs_quotes
     1909     */
     1910    function test_primes_vs_quotes( $input, $output ) {
     1911        return $this->assertEquals( $output, wptexturize( $input ) );
     1912    }
     1913
     1914    function data_primes_vs_quotes() {
     1915        return array(
     1916            array(
     1917                "George's porch is 99' long.",
     1918                "George&#8217;s porch is 99&#8242; long.",
     1919            ),
     1920            array(
     1921                'The best year "was that time in 2012" when everyone partied, he said.',
     1922                'The best year &#8220;was that time in 2012&#8221; when everyone partied, he said.',
     1923            ),
     1924            array(
     1925                "I need 4 x 20' = 80' of trim.", // Works only with a space before the = char.
     1926                "I need 4 x 20&#8242; = 80&#8242; of trim.",
     1927            ),
     1928            array(
     1929                '"Lorem ipsum dolor sit amet 1234"',
     1930                '&#8220;Lorem ipsum dolor sit amet 1234&#8221;',
     1931            ),
     1932            array(
     1933                "'Etiam eu egestas dui 1234'",
     1934                "&#8216;Etiam eu egestas dui 1234&#8217;",
     1935            ),
     1936            array(
     1937                'according to our source, "33% of all students scored less than 50" on the test.',
     1938                'according to our source, &#8220;33% of all students scored less than 50&#8221; on the test.',
     1939            ),
     1940            array(
     1941                "The doctor said, 'An average height is between 5' and 6' in study group 7'.  He then produced a 6' chart of averages.  A man of 7', incredibly, is very possible.",
     1942                "The doctor said, &#8216;An average height is between 5&#8242; and 6&#8242; in study group 7&#8217;.  He then produced a 6&#8242; chart of averages.  A man of 7&#8242;, incredibly, is very possible.",
     1943            ),
     1944            array(
     1945                'Pirates have voted on "The Expendables 3" with their clicks -- and it turns out the Sylvester Stallone-starrer hasn\'t been astoundingly popular among digital thieves, relatively speaking.
     1946
     1947As of Sunday, 5.12 million people worldwide had pirated "Expendables 3" since a high-quality copy hit torrent-sharing sites July 23, according to piracy-tracking firm Excipio.
     1948
     1949That likely contributed to the action movie\'s dismal box-office debut this weekend. But over the same July 23-Aug. 18 time period, the movie was No. 4 in downloads, after "Captain America: The Winter Soldier" (7.31 million), "Divergent" (6.29 million) and "The Amazing Spider-Man 2" (5.88 million). Moreover, that\'s despite "Expendables 3" becoming available more than three weeks prior to the film\'s U.S. theatrical debut.
     1950
     1951String with a number followed by a single quote \'Expendables 3\' vestibulum in arcu mi.',
     1952
     1953                'Pirates have voted on &#8220;The Expendables 3&#8221; with their clicks &#8212; and it turns out the Sylvester Stallone-starrer hasn&#8217;t been astoundingly popular among digital thieves, relatively speaking.
     1954
     1955As of Sunday, 5.12 million people worldwide had pirated &#8220;Expendables 3&#8221; since a high-quality copy hit torrent-sharing sites July 23, according to piracy-tracking firm Excipio.
     1956
     1957That likely contributed to the action movie&#8217;s dismal box-office debut this weekend. But over the same July 23-Aug. 18 time period, the movie was No. 4 in downloads, after &#8220;Captain America: The Winter Soldier&#8221; (7.31 million), &#8220;Divergent&#8221; (6.29 million) and &#8220;The Amazing Spider-Man 2&#8221; (5.88 million). Moreover, that&#8217;s despite &#8220;Expendables 3&#8221; becoming available more than three weeks prior to the film&#8217;s U.S. theatrical debut.
     1958
     1959String with a number followed by a single quote &#8216;Expendables 3&#8217; vestibulum in arcu mi.',
     1960            ),
     1961        );
     1962    }
     1963
     1964    /**
     1965     * Make sure translation actually works.
     1966     *
     1967     * Also make sure opening and closing quotes are allowed to be identical.
     1968     *
     1969     * @ticket 29256
     1970     * @dataProvider data_primes_quotes_translation
     1971     */
     1972    function test_primes_quotes_translation( $input, $output ) {
     1973        add_filter( 'gettext_with_context', array( $this, 'filter_translate2' ), 10, 4 );
     1974
     1975        $result = wptexturize( $input, true );
     1976
     1977        remove_filter( 'gettext_with_context', array( $this, 'filter_translate2' ), 10, 4 );
     1978        wptexturize( 'reset', true );
     1979
     1980        return $this->assertEquals( $output, $result );
     1981    }
     1982
     1983    function filter_translate2( $translations, $text, $context, $domain ) {
     1984        switch ($text) {
     1985            case '&#8211;' : return '!endash!';
     1986            case '&#8212;' : return '!emdash!';
     1987            case '&#8216;' : return '!q1!';
     1988            case '&#8217;' :
     1989                if ( 'apostrophe' == $context ) {
     1990                    return '!apos!';
     1991                } else {
     1992                    return '!q1!';
     1993                }
     1994            case '&#8220;' : return '!q2!';
     1995            case '&#8221;' : return '!q2!';
     1996            case '&#8242;' : return '!prime1!';
     1997            case '&#8243;' : return '!prime2!';
     1998            default : return $translations;
     1999        }
     2000    }
     2001
     2002    function data_primes_quotes_translation() {
     2003        return array(
     2004            array(
     2005                "George's porch is 99' long.",
     2006                "George!apos!s porch is 99!prime1! long.",
     2007            ),
     2008            array(
     2009                'The best year "was that time in 2012" when everyone partied, he said.',
     2010                'The best year !q2!was that time in 2012!q2! when everyone partied, he said.',
     2011            ),
     2012            array(
     2013                "I need 4 x 20' = 80' of trim.", // Works only with a space before the = char.
     2014                "I need 4 x 20!prime1! = 80!prime1! of trim.",
     2015            ),
     2016            array(
     2017                '"Lorem ipsum dolor sit amet 1234"',
     2018                '!q2!Lorem ipsum dolor sit amet 1234!q2!',
     2019            ),
     2020            array(
     2021                "'Etiam eu egestas dui 1234'",
     2022                "!q1!Etiam eu egestas dui 1234!q1!",
     2023            ),
     2024            array(
     2025                'according to our source, "33% of all students scored less than 50" on the test.',
     2026                'according to our source, !q2!33% of all students scored less than 50!q2! on the test.',
     2027            ),
     2028            array(
     2029                "The doctor said, 'An average height is between 5' and 6' in study group 7'.  He then produced a 6' chart of averages.  A man of 7', incredibly, is very possible.",
     2030                "The doctor said, !q1!An average height is between 5!prime1! and 6!prime1! in study group 7!q1!.  He then produced a 6!prime1! chart of averages.  A man of 7!prime1!, incredibly, is very possible.",
     2031            ),
     2032            array(
     2033                'Pirates have voted on "The Expendables 3" with their clicks -- and it turns out the Sylvester Stallone-starrer hasn\'t been astoundingly popular among digital thieves, relatively speaking.
     2034
     2035As of Sunday, 5.12 million people worldwide had pirated "Expendables 3" since a high-quality copy hit torrent-sharing sites July 23, according to piracy-tracking firm Excipio.
     2036
     2037That likely contributed to the action movie\'s dismal box-office debut this weekend. But over the same July 23-Aug. 18 time period, the movie was No. 4 in downloads, after "Captain America: The Winter Soldier" (7.31 million), "Divergent" (6.29 million) and "The Amazing Spider-Man 2" (5.88 million). Moreover, that\'s despite "Expendables 3" becoming available more than three weeks prior to the film\'s U.S. theatrical debut.
     2038
     2039String with a number followed by a single quote \'Expendables 3\' vestibulum in arcu mi.',
     2040
     2041                'Pirates have voted on !q2!The Expendables 3!q2! with their clicks !emdash! and it turns out the Sylvester Stallone-starrer hasn!apos!t been astoundingly popular among digital thieves, relatively speaking.
     2042
     2043As of Sunday, 5.12 million people worldwide had pirated !q2!Expendables 3!q2! since a high-quality copy hit torrent-sharing sites July 23, according to piracy-tracking firm Excipio.
     2044
     2045That likely contributed to the action movie!apos!s dismal box-office debut this weekend. But over the same July 23-Aug. 18 time period, the movie was No. 4 in downloads, after !q2!Captain America: The Winter Soldier!q2! (7.31 million), !q2!Divergent!q2! (6.29 million) and !q2!The Amazing Spider-Man 2!q2! (5.88 million). Moreover, that!apos!s despite !q2!Expendables 3!q2! becoming available more than three weeks prior to the film!apos!s U.S. theatrical debut.
     2046
     2047String with a number followed by a single quote !q1!Expendables 3!q1! vestibulum in arcu mi.',
     2048            ),
     2049        );
     2050    }
    19032051}
Note: See TracChangeset for help on using the changeset viewer.