Making WordPress.org

Changeset 8868


Ignore:
Timestamp:
05/24/2019 02:49:21 AM (5 years ago)
Author:
tellyworth
Message:

Plugin dir: import block metadata on commit.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sites/trunk/wordpress.org/public_html/wp-content/plugins/plugin-directory/cli/class-import.php

    r8729 r8868  
    6767        $stable_tag      = $data['stable_tag'];
    6868        $tagged_versions = $data['tagged_versions'];
     69        $blocks          = $data['blocks'];
    6970
    7071        $content = '';
     
    167168        }
    168169        update_post_meta( $plugin->ID, 'assets_banners_color', wp_slash( $banner_average_color ) );
     170
     171        // Store the block data, if known
     172        if ( count( $blocks ) ) {
     173            update_post_meta( $plugin->ID, 'all_blocks', $blocks );
     174        } else {
     175            delete_post_meta( $plugin->ID, 'all_blocks' );
     176        }
    169177
    170178        $current_stable_tag = get_post_meta( $plugin->ID, 'stable_tag', true ) ?: 'trunk';
     
    400408        }
    401409
    402         return compact( 'readme', 'stable_tag', 'tmp_dir', 'plugin_headers', 'assets', 'tagged_versions' );
     410        // Find blocks
     411        $blocks = array();
     412        foreach ( Filesystem::list_files( "$tmp_dir/export/", false, '!\.(?:php|js|jsx|json)$!i' ) as $filename ) {
     413            $file_blocks = $this->find_blocks_in_file( $filename );
     414            if ( $file_blocks ) {
     415                foreach ( $file_blocks as $block ) {
     416                    // If the info came from a block.json file with more metadata (like description) then we want it to override less detailed info scraped from php/js.
     417                    if ( empty( $blocks[ $block->name ]->title ) || isset( $block->description ) ) {
     418                        $blocks[ $block->name ] = $block;
     419                    }
     420                }
     421            }
     422        }
     423
     424        return compact( 'readme', 'stable_tag', 'tmp_dir', 'plugin_headers', 'assets', 'tagged_versions', 'blocks' );
    403425    }
    404426
     
    462484        return false;
    463485    }
     486
     487    /**
     488     * Look for Gutenberg blocks registered within a single file.
     489     *
     490     * @param string $filename Pathname of the file.
     491     *
     492     * @return array An array of objects representing blocks, corresponding to the block.json format where possible.
     493     */
     494    protected function find_blocks_in_file( $filename ) {
     495
     496        $ext = strtolower( pathinfo($filename, PATHINFO_EXTENSION) );
     497
     498        $blocks = array();
     499
     500        if ( 'js' === $ext || 'jsx' === $ext ) {
     501            // Parse a js-style registerBlockType() call.
     502            // Note that this only works with literal strings for the block name and title, and assumes that order.
     503            $contents = file_get_contents( $filename );
     504            if ( $contents && preg_match_all( "#registerBlockType\s*[(]\s*'([-\w]+/[-\w]+)'\s*,\s*[{]\s*title\s*:[\s_(]*'([^']*)'#ms", $contents, $matches, PREG_SET_ORDER ) ) {
     505                foreach ( $matches as $match ) {
     506                    $blocks[] = (object) [
     507                        'name' => $match[1],
     508                        'title' => $match[2],
     509                    ];
     510                }
     511            }
     512        }
     513        if ( 'php' === $ext ) {
     514            // Parse a php-style register_block_type() call.
     515            // Again this assumes literal strings, and only parses the name and title.
     516            $contents = file_get_contents( $filename );
     517            if ( $contents && preg_match_all( "#register_block_type\s*[(]\s*['\"]([-\w]+/[-\w]+)['\"]#ms", $contents, $matches, PREG_SET_ORDER ) ) {
     518                foreach ( $matches as $match ) {
     519                    $blocks[] = (object) [
     520                        'name' => $match[1],
     521                        'title' => null,
     522                    ];
     523                }
     524            }
     525        }
     526        if ( 'block.json' === basename( $filename ) ) {
     527            // A block.json file has everything we want.
     528            $blockinfo = json_decode( file_get_contents( $filename ) );
     529            if ( isset( $blockinfo->name ) && isset( $blockinfo->title ) ) {
     530                $blocks[] = $blockinfo;
     531            }
     532        }
     533
     534        return $blocks;
     535    }
    464536}
Note: See TracChangeset for help on using the changeset viewer.