WordPress.org

Make WordPress Core

Ticket #6531: patch-recursive-editors.diff

File patch-recursive-editors.diff, 10.5 KB (added by chsxf, 4 years ago)
  • wp-includes/theme.php

     
    345345                $stylesheet_files = array(); 
    346346                $template_files = array(); 
    347347 
    348                 $stylesheet_dir = @ dir("$theme_root/$stylesheet"); 
    349                 if ( $stylesheet_dir ) { 
    350                         while ( ($file = $stylesheet_dir->read()) !== false ) { 
    351                                 if ( !preg_match('|^\.+$|', $file) ) { 
    352                                         if ( preg_match('|\.css$|', $file) ) 
    353                                                 $stylesheet_files[] = "$theme_root/$stylesheet/$file"; 
    354                                         elseif ( preg_match('|\.php$|', $file) ) 
    355                                                 $template_files[] = "$theme_root/$stylesheet/$file"; 
    356                                 } 
    357                         } 
    358                         @ $stylesheet_dir->close(); 
    359                 } 
     348                search_for_theme_files_r("$theme_root/$stylesheet", 'both', $stylesheet_files, $template_files); 
     349                search_for_theme_files_r("$template_directory", 'script', $stylesheet_files, $template_files); 
    360350 
    361                 $template_dir = @ dir("$template_directory"); 
    362                 if ( $template_dir ) { 
    363                         while ( ($file = $template_dir->read()) !== false ) { 
    364                                 if ( preg_match('|^\.+$|', $file) ) 
    365                                         continue; 
    366                                 if ( preg_match('|\.php$|', $file) ) { 
    367                                         $template_files[] = "$template_directory/$file"; 
    368                                 } elseif ( is_dir("$template_directory/$file") ) { 
    369                                         $template_subdir = @ dir("$template_directory/$file"); 
    370                                         if ( !$template_subdir ) 
    371                                                 continue; 
    372                                         while ( ($subfile = $template_subdir->read()) !== false ) { 
    373                                                 if ( preg_match('|^\.+$|', $subfile) ) 
    374                                                         continue; 
    375                                                 if ( preg_match('|\.php$|', $subfile) ) 
    376                                                         $template_files[] = "$template_directory/$file/$subfile"; 
    377                                         } 
    378                                         @ $template_subdir->close(); 
    379                                 } 
    380                         } 
    381                         @ $template_dir->close(); 
    382                 } 
    383  
    384351                //Make unique and remove duplicates when stylesheet and template are the same i.e. most themes 
    385352                $template_files = array_unique($template_files); 
    386353                $stylesheet_files = array_unique($stylesheet_files); 
     
    465432} 
    466433 
    467434/** 
     435 * Search recursively for theme files 
     436 * 
     437 * @global array $__search_for_theme_files_parsed_directories To avoid recursion 
     438 * 
     439 * @param string Path to the current directory to search 
     440 * @param string File types to add ('css', 'script' or 'both') 
     441 * @param array Array to store stylesheet (.css) files 
     442 * @param array Array to store template (.php|.js) files 
     443 */ 
     444$__search_for_theme_files_parsed_directories = array(); 
     445  
     446function search_for_theme_files_r( $path, $file_types, array &$stylesheet_files, array &$template_files ) { 
     447        global $__search_for_theme_files_parsed_directories; 
     448 
     449        // Avoiding recursion 
     450        $rp = realpath($path); 
     451        if (in_array($rp, $__search_for_theme_files_parsed_directories)) 
     452                return; 
     453        $__search_for_theme_files_parsed_directories[] = $rp; 
     454         
     455        // Looking for files 
     456        $dir = @dir($path); 
     457        if ($dir) { 
     458                while ( ($file = $dir->read()) !== false ) { 
     459                        if ( !preg_match('|^\.+$|', $file) ) { 
     460                                $fn = "{$path}/{$file}"; 
     461                                if ( !is_readable( $fn ) ) 
     462                                        continue; 
     463                                if ( is_dir( $fn ) ) 
     464                                        search_for_theme_files_r( $fn, $file_types, $stylesheet_files, $template_files ); 
     465                                else if ( preg_match('|\.css$|', $file) && ( 'css' == $file_types || 'both' == $file_types ) ) 
     466                                        $stylesheet_files[] = $fn; 
     467                                elseif ( preg_match('#\.(php|js)$#', $file) && ( 'script' == $file_types || 'both' == $file_types ) ) 
     468                                        $template_files[] = $fn; 
     469                        } 
     470                } 
     471                @$dir->close(); 
     472        } 
     473} 
     474 
     475/** 
    468476 * Retrieve theme roots. 
    469477 * 
    470478 * @since 2.9.0 
  • wp-includes/functions.php

     
    66 */ 
    77 
    88/** 
     9 * Sort files by path 
     10 * 
     11 * Please refer to http://www.php.net/manual/en/function.usort.php for further information on the parameters 
     12 * 
     13 * @param mixed First item to compare 
     14 * @param midex Second item to compare 
     15 * @return int an integer based on the comparison result 
     16 */ 
     17function sort_files_by_path($a, $b) { 
     18        $dirA = dirname( $a ); 
     19        if ( '.' != $dirA ) 
     20                $dirA .= '/'; 
     21        $dirB = dirname( $b ); 
     22        if ( '.' != $dirB ) 
     23                $dirB .= '/'; 
     24        $countA = substr_count( $dirA, DIRECTORY_SEPARATOR ); 
     25        $countB = substr_count( $dirB, DIRECTORY_SEPARATOR ); 
     26        if ( $countA == $countB ) 
     27                return strcmp($a, $b); 
     28        else 
     29                return $countA - $countB; 
     30} 
     31 
     32/** 
    933 * Converts MySQL DATETIME field to user specified date format. 
    1034 * 
    1135 * If $dateformatstring has 'G' value, then gmmktime() function will be used to 
  • wp-admin/includes/plugin.php

     
    159159 * 
    160160 * @since 2.8.0 
    161161 * 
     162 * @global $plugins 
     163 * 
    162164 * @param string $plugin Plugin ID 
    163165 * @return array List of files relative to the plugin root. 
    164166 */ 
    165167function get_plugin_files($plugin) { 
    166168        $plugin_file = WP_PLUGIN_DIR . '/' . $plugin; 
    167         $dir = dirname($plugin_file); 
    168         $plugin_files = array($plugin); 
    169         if ( is_dir($dir) && $dir != WP_PLUGIN_DIR ) { 
    170                 $plugins_dir = @ opendir( $dir ); 
    171                 if ( $plugins_dir ) { 
    172                         while (($file = readdir( $plugins_dir ) ) !== false ) { 
    173                                 if ( substr($file, 0, 1) == '.' ) 
    174                                         continue; 
    175                                 if ( is_dir( $dir . '/' . $file ) ) { 
    176                                         $plugins_subdir = @ opendir( $dir . '/' . $file ); 
    177                                         if ( $plugins_subdir ) { 
    178                                                 while (($subfile = readdir( $plugins_subdir ) ) !== false ) { 
    179                                                         if ( substr($subfile, 0, 1) == '.' ) 
    180                                                                 continue; 
    181                                                         $plugin_files[] = plugin_basename("$dir/$file/$subfile"); 
    182                                                 } 
    183                                                 @closedir( $plugins_subdir ); 
    184                                         } 
    185                                 } else { 
    186                                         if ( plugin_basename("$dir/$file") != $plugin ) 
    187                                                 $plugin_files[] = plugin_basename("$dir/$file"); 
    188                                 } 
     169        $plugin_keys = array_keys( $GLOBALS['plugins'] ); 
     170 
     171        if ( in_array($plugin, $plugin_keys) ) { 
     172                $dir = dirname( $plugin_file ); 
     173                $plugin_files = array($plugin); 
     174                if ( is_dir($dir) && $dir != WP_PLUGIN_DIR ) { 
     175                        search_for_plugin_files_r($dir, $plugin_files); 
     176                        $plugin_files = array_unique($plugin_files); 
     177                } 
     178        } 
     179        else { 
     180                foreach ($plugin_keys as $p) { 
     181                        $pdir = dirname( WP_PLUGIN_DIR . '/' . $plugin ); 
     182                        if ( substr( $plugin_file, 0, strlen( $pdir ) ) == $pdir) { 
     183                                var_dump($p); 
     184                                return get_plugin_files( $p ); 
    189185                        } 
    190                         @closedir( $plugins_dir ); 
    191186                } 
    192187        } 
    193188 
     
    277272} 
    278273 
    279274/** 
     275 * Search recursively for plugin files 
     276 * 
     277 * @global array $__search_for_plugin_files_parsed_directories To avoid recursion 
     278 * 
     279 * @param string Path to the current directory to search 
     280 * @param array Array to store files 
     281 */ 
     282$__search_for_plugin_files_parsed_directories = array(); 
     283  
     284function search_for_plugin_files_r( $path, array &$files ) { 
     285        global $__search_for_plugin_files_parsed_directories; 
     286 
     287        // Avoiding recursion 
     288        $rp = realpath($path); 
     289        if (in_array($rp, $__search_for_plugin_files_parsed_directories)) 
     290                return; 
     291        $__search_for_plugin_files_parsed_directories[] = $rp; 
     292         
     293        // Looking for files 
     294        $dir = @dir($path); 
     295        if ($dir) { 
     296                while ( ($file = $dir->read()) !== false ) { 
     297                        if ( !preg_match('|^\.+$|', $file) ) { 
     298                                $fn = "{$path}/{$file}"; 
     299                                if ( !is_readable( $fn ) ) 
     300                                        continue; 
     301                                if ( is_dir( $fn ) ) 
     302                                        search_for_plugin_files_r( $fn, $files ); 
     303                                elseif ( preg_match('#\.(php|js)$#', $file) ) 
     304                                        $files[] = plugin_basename( $fn ); 
     305                        } 
     306                } 
     307                @$dir->close(); 
     308        } 
     309} 
     310 
     311/** 
    280312 * Check the mu-plugins directory and retrieve all mu-plugin files with any plugin data. 
    281313 * 
    282314 * WordPress only includes mu-plugin files in the base mu-plugins directory (wp-content/mu-plugins). 
  • wp-admin/theme-editor.php

     
    183183                if ( $is_child_theme && strpos( $template_file, trailingslashit( $template_dir ) ) === 0 ) 
    184184                        continue; 
    185185 
    186                 $description = trim( get_file_description($template_file) ); 
    187                 $template_show = basename($template_file); 
     186                if ( dirname( $template_file ) == $template_dir ) 
     187                        $description = trim( get_file_description($template_file) ); 
     188                else 
     189                        $description = trim( str_replace( "{$template_dir}/", '', $template_file ) ); 
     190                $template_show = str_replace("{$template_dir}/", '', $template_file); 
    188191                $filedesc = ( $description != $template_file ) ? "$description<br /><span class='nonessential'>($template_show)</span>" : "$description"; 
    189192                $filedesc = ( $template_file == $file ) ? "<span class='highlight'>$description<br /><span class='nonessential'>($template_show)</span></span>" : $filedesc; 
    190193                $template_mapping[ $description ] = array( _get_template_edit_filename($template_file, $template_dir), $filedesc ); 
    191194        } 
    192         ksort( $template_mapping ); 
     195        uksort( $template_mapping, 'sort_files_by_path' ); 
    193196        while ( list( $template_sorted_key, list( $template_file, $filedesc ) ) = each( $template_mapping ) ) : 
    194197        ?> 
    195198                <li><a href="theme-editor.php?file=<?php echo urlencode( $template_file ) ?>&amp;theme=<?php echo urlencode( $theme ) ?>&amp;dir=theme"><?php echo $filedesc ?></a></li> 
     
    205208                if ( $is_child_theme && strpos( $style_file, trailingslashit( $template_dir ) ) === 0 ) 
    206209                        continue; 
    207210 
    208                 $description = trim( get_file_description($style_file) ); 
    209                 $style_show = basename($style_file); 
     211                if ( dirname( $style_file ) == $template_dir ) 
     212                        $description = trim( get_file_description($style_file) ); 
     213                else 
     214                        $description = trim( str_replace( "{$stylesheet_dir}/", '', $style_file ) ); 
     215                $style_show = str_replace("{$stylesheet_dir}/", '', $style_file); 
    210216                $filedesc = ( $description != $style_file ) ? "$description<br /><span class='nonessential'>($style_show)</span>" : "$description"; 
    211217                $filedesc = ( $style_file == $file ) ? "<span class='highlight'>$description<br /><span class='nonessential'>($style_show)</span></span>" : $filedesc; 
    212218                $template_mapping[ $description ] = array( _get_template_edit_filename($style_file, $stylesheet_dir), $filedesc ); 
    213219        } 
    214         ksort( $template_mapping ); 
     220        uksort( $template_mapping, 'sort_files_by_path' ); 
    215221        while ( list( $template_sorted_key, list( $style_file, $filedesc ) ) = each( $template_mapping ) ) : 
    216222                ?> 
    217223                <li><a href="theme-editor.php?file=<?php echo urlencode( $style_file ) ?>&amp;theme=<?php echo urlencode($theme) ?>&amp;dir=style"><?php echo $filedesc ?></a></li> 
  • wp-admin/plugin-editor.php

     
    203203 
    204204        <ul> 
    205205<?php 
     206usort($plugin_files, 'sort_files_by_path'); 
    206207foreach ( $plugin_files as $plugin_file ) : 
    207208        // Get the extension of the file 
    208209        if ( preg_match('/\.([^.]+)$/', $plugin_file, $matches) ) {