WordPress.org

Make WordPress Core

Ticket #9272: 18495.patch

File 18495.patch, 8.2 KB (added by Viper007Bond, 4 years ago)

Rewritten again. See comments below for details.

  • wp-includes/formatting.php

     
    18361836} 
    18371837 
    18381838/** 
    1839  * Determines the difference between two timestamps. 
     1839 * Determines the difference between two timestamps in a human readable format. 
    18401840 * 
    1841  * The difference is returned in a human readable format such as "1 hour", 
    1842  * "5 mins", "2 days". 
     1841 * Example return values are things like "1 hour", "5 mins", "2 days", 
     1842 * or "5 days, 2 hours, 45 minutes" (with limit=3). 
    18431843 * 
     1844 * When passing an array of arguments, the arguments are as follows: 
     1845 * 
     1846 * The "from" argument is the starting Unix timestamp. It is the only required argument. 
     1847 * 
     1848 * The "to" argument is the ending Unix timestamp. It defaults to the value of time(). 
     1849 * 
     1850 * The "limit" argument controls the maximum number of units to output, i.e. the accuracy. 
     1851 * A limit of 1 could output something like "2 years" while a limit of 3 could output 
     1852 * something like "2 years, 3 months, 10 days". The default value is 1. 
     1853 * 
     1854 * The "seconds" argument is a boolean argument that controls whether to output the 
     1855 * number of seconds, assuming that the limit value is not reached. Defaults to false. 
     1856 * 
     1857 * The "labels" argument allows the unit labels to be customized. An associative array 
     1858 * should be passed with the keys being any of the following: "years", "months", "weeks", 
     1859 * "days", "hours", "minutes", "seconds". The array values should themselves be an array, 
     1860 * the first value being the singular unit name and the second value being the multiple 
     1861 * unit name. Any missing keys will be set to the default. For example: 
     1862 * <code> 
     1863 * $args['labels'] = array( 
     1864 * 'minutes' => array( 'minute', 'minutes' ), 
     1865 * 'seconds' => array( 'second', 'seconds' ), 
     1866 * ); 
     1867 * </code> 
     1868 * 
     1869 * The "separator" argument controls the string that goes between the returned units. 
     1870 * It defaults to ", " (note the space). 
     1871 * 
     1872 * The "context" argument is entirely for translation purposes. Unlike in the English 
     1873 * language, unit names like "days" can vary depending on the context used. For details, 
     1874 * @see http://core.trac.wordpress.org/ticket/18495 
     1875 * 
    18441876 * @since 1.5.0 
    18451877 * 
    1846  * @param int $from Unix timestamp from which the difference begins. 
    1847  * @param int $to Optional. Unix timestamp to end the time difference. Default becomes time() if not set. 
     1878 * @param array|int $args Either an array of arguments or the Unix timestamp from which the difference begins. 
     1879 * @param int $to Optional. Unix timestamp to end the time difference. Default becomes time() if not set. Ignored if first argument is an array. 
    18481880 * @return string Human readable time difference. 
    18491881 */ 
    1850 function human_time_diff( $from, $to = '' ) { 
    1851         if ( empty($to) ) 
    1852                 $to = time(); 
    1853         $diff = (int) abs($to - $from); 
    1854         if ($diff <= 3600) { 
    1855                 $mins = round($diff / 60); 
    1856                 if ($mins <= 1) { 
    1857                         $mins = 1; 
    1858                 } 
    1859                 /* translators: min=minute */ 
    1860                 $since = sprintf(_n('%s min', '%s mins', $mins), $mins); 
    1861         } else if (($diff <= 86400) && ($diff > 3600)) { 
    1862                 $hours = round($diff / 3600); 
    1863                 if ($hours <= 1) { 
    1864                         $hours = 1; 
    1865                 } 
    1866                 $since = sprintf(_n('%s hour', '%s hours', $hours), $hours); 
    1867         } elseif ($diff >= 86400) { 
    1868                 $days = round($diff / 86400); 
    1869                 if ($days <= 1) { 
    1870                         $days = 1; 
    1871                 } 
    1872                 $since = sprintf(_n('%s day', '%s days', $days), $days); 
     1882function human_time_diff( $args ) { 
     1883 
     1884        // Legacy argument format ( $from, $to ) 
     1885        if ( ! is_array( $args ) ) { 
     1886                $args = array(); 
     1887 
     1888                if ( ! $arg_count = func_num_args() ) 
     1889                        return false; 
     1890 
     1891                $args['from'] = func_get_arg( 0 ); 
     1892                if ( $arg_count >= 2 ) 
     1893                        $args['to'] = func_get_arg( 1 ); 
    18731894        } 
    1874         return $since; 
     1895 
     1896        // Required argument 
     1897        if ( ! isset( $args['from'] ) ) 
     1898                return false; 
     1899 
     1900        $defaults = array( 
     1901                'to'        => time(), 
     1902                'limit'     => 1, 
     1903                'seconds'   => false, 
     1904                'labels'    => array(), 
     1905                // translators: The seperator for human_time_diff() which seperates the years, months, etc. 
     1906                'separator' => _x( ', ', 'human_time_diff' ), 
     1907                'context'   => 'duration', 
     1908        ); 
     1909 
     1910        $args = wp_parse_args( $args, $defaults ); 
     1911 
     1912        switch ( $args['context'] ) { 
     1913                case 'age': 
     1914                        $default_labels = array( 
     1915                                'years'   => array( _x( '%d year',  'age' ), _x( '%d years',  'age' ) ), 
     1916                                'months'  => array( _x( '%d month', 'age' ), _x( '%d months', 'age' ) ), 
     1917                                'weeks'   => array( _x( '%d week',  'age' ), _x( '%d weeks',  'age' ) ), 
     1918                                'days'    => array( _x( '%d day',   'age' ), _x( '%d days',   'age' ) ), 
     1919                                'hours'   => array( _x( '%d hour',  'age' ), _x( '%d hours',  'age' ) ), 
     1920                                'minutes' => array( _x( '%d min',   'age' ), _x( '%d mins',   'age' ) ), 
     1921                                'seconds' => array( _x( '%d sec',   'age' ), _x( '%d secs', '  age' ) ), 
     1922                        ); 
     1923                        break; 
     1924 
     1925                case 'duration': 
     1926                default; 
     1927                        $default_labels = array( 
     1928                                'years'   => array( _x( '%d year',  'duration' ), _x( '%d years',  'duration' ) ), 
     1929                                'months'  => array( _x( '%d month', 'duration' ), _x( '%d months', 'duration' ) ), 
     1930                                'weeks'   => array( _x( '%d week',  'duration' ), _x( '%d weeks',  'duration' ) ), 
     1931                                'days'    => array( _x( '%d day',   'duration' ), _x( '%d days',   'duration' ) ), 
     1932                                'hours'   => array( _x( '%d hour',  'duration' ), _x( '%d hours',  'duration' ) ), 
     1933                                'minutes' => array( _x( '%d min',   'duration' ), _x( '%d mins',   'duration' ) ), 
     1934                                'seconds' => array( _x( '%d sec',   'duration' ), _x( '%d secs', '  duration' ) ), 
     1935                        ); 
     1936        } 
     1937        $args['labels'] = wp_parse_args( $args['labels'], $default_labels ); 
     1938 
     1939        // Since all months/years aren't the same, these values are what Google's calculator says 
     1940        // Make sure to keep this sorted from largest unit to smallest unit 
     1941        $units = array( 
     1942                'years'   => 31556926, 
     1943                'months'  => 2629744, 
     1944                'weeks'   => 604800, 
     1945                'days'    => 86400, 
     1946                'hours'   => 3600, 
     1947                'minutes' => 60, 
     1948        ); 
     1949        if ( $args['seconds'] ) 
     1950                $units['seconds'] = 1; 
     1951 
     1952        $args['from'] = (int) $args['from']; 
     1953        $args['to']   = (int) $args['to']; 
     1954 
     1955        if ( empty( $args['to'] ) ) 
     1956                $args['to'] = time(); 
     1957 
     1958        $diff = abs( $args['to'] - $args['from'] ); 
     1959 
     1960        $output = array(); 
     1961 
     1962        foreach ( $units as $unit_type => $unit_duration ) { 
     1963                if ( count( $output ) >= $args['limit'] ) 
     1964                        break; 
     1965 
     1966                if ( $diff < $unit_duration ) 
     1967                        continue; 
     1968 
     1969                $number_of_this_units = floor( $diff / $unit_duration ); 
     1970                $diff = $diff - ( $number_of_this_units * $unit_duration ); 
     1971 
     1972                if ( $number_of_this_units > 0 ) 
     1973                        $output[] = sprintf( _n( $args['labels'][$unit_type][0], $args['labels'][$unit_type][1], $number_of_this_units ), $number_of_this_units ); 
     1974        } 
     1975 
     1976        if ( ! empty( $output ) ) { 
     1977                if ( is_rtl() ) 
     1978                        $output = array_reverse( $output ); 
     1979 
     1980                return implode( $args['separator'], $output ); 
     1981        } else { 
     1982                // Return "1 {unit}" with the unit being the smallest unit 
     1983                end( $units ); 
     1984                $smallest = key( $units ); 
     1985                return sprintf( $args['labels'][$smallest][0], 1 ); 
     1986        } 
    18751987} 
    18761988 
    18771989/** 
     1990 * Determines the difference between two timestamps in a human readable format in the context of an age. 
     1991 * 
     1992 * @see human_time_diff() 
     1993 * @see http://core.trac.wordpress.org/ticket/18495 
     1994 * 
     1995 * @since 3.4.0 
     1996 * 
     1997 * @param array|int $args Either an array of arguments or the Unix timestamp from which the difference begins. 
     1998 * @param int $to Optional. Unix timestamp to end the time difference. Default becomes time() if not set. Ignored if first argument is an array. 
     1999 * @return string Human readable time difference. 
     2000 */ 
     2001function human_time_diff_age( $args ) { 
     2002        $args['context'] = 'age'; 
     2003        return human_time_diff( $args ); 
     2004} 
     2005 
     2006/** 
     2007 * Determines the difference between two timestamps in a human readable format in the context of a duration. 
     2008 * 
     2009 * @see human_time_diff() 
     2010 * @see http://core.trac.wordpress.org/ticket/18495 
     2011 * 
     2012 * @since 3.4.0 
     2013 * 
     2014 * @param array|int $args Either an array of arguments or the Unix timestamp from which the difference begins. 
     2015 * @param int $to Optional. Unix timestamp to end the time difference. Default becomes time() if not set. Ignored if first argument is an array. 
     2016 * @return string Human readable time difference. 
     2017 */ 
     2018function human_time_diff_duration( $args ) { 
     2019        $args['context'] = 'duration'; 
     2020        return human_time_diff( $args ); 
     2021} 
     2022 
     2023/** 
    18782024 * Generates an excerpt from the content, if needed. 
    18792025 * 
    18802026 * The excerpt word amount will be 55 words and if the amount is greater than