WordPress.org

Make WordPress Core

Changeset 36603


Ignore:
Timestamp:
02/20/2016 09:43:51 PM (3 years ago)
Author:
ocean90
Message:

i18n-tools: Respect the coding standards when adding textdomains with add-textdomain.php.

Props GaryJ, groovecoder.
Fixes #21616.

Location:
trunk/tools/i18n
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/i18n/add-textdomain.php

    r36600 r36603  
    1818     * Constructor.
    1919     */
    20     function __construct() {
     20    public function __construct() {
    2121        $makepot = new MakePOT;
    2222        $this->funcs = array_keys( $makepot->rules );
     
    2424    }
    2525
    26     function usage() {
     26    /**
     27     * Prints CLI usage.
     28     */
     29    public function usage() {
    2730        $usage = "Usage: php add-textdomain.php [-i] <domain> <file>\n\nAdds the string <domain> as a last argument to all i18n function calls in <file>\nand prints the modified php file on standard output.\n\nOptions:\n    -i    Modifies the PHP file in place, instead of printing it to standard output.\n";
    2831        fwrite(STDERR, $usage);
     
    3033    }
    3134
    32     function process_token($token_text, $inplace) {
    33         if ($inplace)
    34             $this->modified_contents .= $token_text;
    35         else
    36             echo $token_text;
     35    /**
     36     * Adds textdomain to a single file.
     37     *
     38     * @see AddTextdomain::process_string()
     39     *
     40     * @param string $domain          Text domain.
     41     * @param string $source_filename Filename with optional path.
     42     * @param bool   $inplace         True to modifies the PHP file in place. False to print to standard output.
     43     */
     44    public function process_file( $domain, $source_filename, $inplace ) {
     45        $new_source = $this->process_string( $domain, file_get_contents( $source_filename ) );
     46
     47        if ( $inplace ) {
     48            $f = fopen( $source_filename, 'w' );
     49            fwrite( $f, $new_source );
     50            fclose( $f );
     51        } else {
     52            echo $new_source;
     53        }
    3754    }
    3855
     56    /**
     57     * Adds textdomain to a string of PHP.
     58     *
     59     * Functions calls should be wrapped in opening and closing PHP delimiters as usual.
     60     *
     61     * @see AddTextdomain::process_tokens()
     62     *
     63     * @param string $domain Text domain.
     64     * @param string $string PHP code to parse.
     65     * @return string Modified source.
     66     */
     67    public function process_string( $domain, $string ) {
     68        $tokens = token_get_all( $string );
     69        return $this->process_tokens( $domain, $tokens );
     70    }
    3971
    40     function process_file($domain, $source_filename, $inplace) {
    41 
     72    /**
     73     * Adds textdomain to a set of PHP tokens.
     74     *
     75     * @param string $domain Text domain.
     76     * @param array  $tokens PHP tokens. An array of token identifiers. Each individual token identifier is either a
     77     *                       single character (i.e.: ;, ., >, !, etc.), or a three element array containing the token
     78     *                       index in element 0, the string content of the original token in element 1 and the line
     79     *                       number in element 2.
     80     * @return string Modified source.
     81     */
     82    public function process_tokens( $domain, $tokens ) {
    4283        $this->modified_contents = '';
    43         $domain = addslashes($domain);
    44 
    45         $source = file_get_contents($source_filename);
    46         $tokens = token_get_all($source);
     84        $domain = addslashes( $domain );
    4785
    4886        $in_func = false;
     
    5189        $found_domain = false;
    5290
    53         foreach($tokens as $token) {
     91        foreach($tokens as $index => $token) {
    5492            $string_success = false;
    5593            if (is_array($token)) {
     
    72110                --$parens_balance;
    73111                if ($in_func && 0 == $parens_balance) {
    74                     $token = $found_domain? ')' : ", '$domain')";
     112                    if ( ! $found_domain ) {
     113                        $token = ", '$domain'";
     114                        if ( T_WHITESPACE == $tokens[ $index - 1 ][0] ) {
     115                            $token .= ' '; // Maintain code standards if previously present
     116                            // Remove previous whitespace token to account for it.
     117                            $this->modified_contents = trim( $this->modified_contents );
     118                        }
     119                        $token .= ')';
     120                    }
    75121                    $in_func = false;
    76122                    $args_started = false;
     
    78124                }
    79125            }
    80             $this->process_token($token, $inplace);
     126            $this->modified_contents .= $token;
    81127        }
    82128
    83         if ($inplace) {
    84             $f = fopen($source_filename, 'w');
    85             fwrite($f, $this->modified_contents);
    86             fclose($f);
    87         }
     129        return $this->modified_contents;
    88130    }
    89131}
    90132
    91 
    92 // run the CLI only if the file
    93 // wasn't included
     133// Run the CLI only if the file wasn't included.
    94134$included_files = get_included_files();
    95135if ($included_files[0] == __FILE__) {
  • trunk/tools/i18n/t/AddTextdomainTest.php

    r36389 r36603  
    1111class AddTextDomainTest extends PHPUnit_Framework_TestCase {
    1212
    13     function __construct() {
    14         $this->atd = new AddTextdomain;
     13    function setUp() {
     14        parent::setUp();
     15        $this->atd = new AddTextdomain();
    1516    }
    1617
    1718    function test_add() {
    18         # copy to a new file, so that we don't corrupt the old one
     19        // Copy to a new file, so that we don't corrupt the old one.
    1920        copy( 'data/add-textdomain-0.php', 'data/add-textdomain-0-work.php' );
    2021        $this->atd->process_file( 'test-domain', 'data/add-textdomain-0-work.php', true );
     
    2223        unlink( 'data/add-textdomain-0-work.php' );
    2324    }
     25
     26    /**
     27     * @dataProvider data_textdomain_sources
     28     */
     29    function test_basic_add_textdomain( $source, $expected ) {
     30        $tokens = token_get_all( $source );
     31        $result = $this->atd->process_tokens( 'foo', $tokens );
     32        $this->assertEquals( $expected, $result );
     33    }
     34
     35    function data_textdomain_sources() {
     36        return array(
     37            array( "<?php __('string'); ?>", "<?php __('string', 'foo'); ?>" ), // Simple single quotes
     38            array( '<?php __("string"); ?>', "<?php __(\"string\", 'foo'); ?>" ), // Simple double quotes
     39            array( "<?php __( 'string' ); ?>", "<?php __( 'string', 'foo' ); ?>" ), // Simple single quotes CS
     40            array( '<?php __( "string" ); ?>', "<?php __( \"string\", 'foo' ); ?>" ), // Simple double quotes CS
     41            array( "<?php __( 'string', 'string2' ); ?>", "<?php __( 'string', 'string2', 'foo' ); ?>" ), // Multiple string args
     42            array( '<?php __( \'string\', $var ); ?>', '<?php __( \'string\', $var, \'foo\' ); ?>' ), // Multiple string / var args
     43            array( "<?php __( 'string', 'foo' ); ?>", "<?php __( 'string', 'foo' ); ?>" ), // Existing textdomain
     44        );
     45    }
    2446}
  • trunk/tools/i18n/t/data/add-textdomain-0-result.php

    r36390 r36603  
    11<?php
    22function call_some_i18n_methods() {
    3     __( 'Hello World' , 'test-domain');
    4     _e( 'Hello World' , 'test-domain');
    5     _n( 'Single', 'Plural', 1 , 'test-domain');
    6     _n_noop( 'Single Noop', 'Plural Noop', 1 , 'test-domain');
    7     _x( 'Hello World', 'Testing' , 'test-domain');
    8     _ex( 'Hello World', 'Testing' , 'test-domain');
    9     _nx( 'Hello World', 'Testing' , 'test-domain');
    10     _nx_noop( 'Hello World Noop', 'Testing' , 'test-domain');
    11     esc_attr__( 'Attribute' , 'test-domain');
    12     esc_html__( 'HTML' , 'test-domain');
    13     esc_attr_e( 'Attribute' , 'test-domain');
    14     esc_html_e( 'HTML' , 'test-domain');
    15     esc_attr_x( 'Attribute', 'Testing' , 'test-domain');
    16     esc_html_x( 'HTML', 'Testing' , 'test-domain');
    17     translate_nooped_plural( 'Plural Noop', 2 , 'test-domain');
     3    __( 'Hello World', 'test-domain' );
     4    _e( 'Hello World', 'test-domain' );
     5    _n( 'Single', 'Plural', 1, 'test-domain' );
     6    _n_noop( 'Single Noop', 'Plural Noop', 1, 'test-domain' );
     7    _x( 'Hello World', 'Testing', 'test-domain' );
     8    _ex( 'Hello World', 'Testing', 'test-domain' );
     9    _nx( 'Hello World', 'Testing', 'test-domain' );
     10    _nx_noop( 'Hello World Noop', 'Testing', 'test-domain' );
     11    esc_attr__( 'Attribute', 'test-domain' );
     12    esc_html__( 'HTML', 'test-domain' );
     13    esc_attr_e( 'Attribute', 'test-domain' );
     14    esc_html_e( 'HTML', 'test-domain' );
     15    esc_attr_x( 'Attribute', 'Testing', 'test-domain' );
     16    esc_html_x( 'HTML', 'Testing', 'test-domain' );
     17    translate_nooped_plural( 'Plural Noop', 2, 'test-domain' );
    1818}
Note: See TracChangeset for help on using the changeset viewer.