WordPress.org

Making WordPress.org

Ticket #4393: 4393.diff

File 4393.diff, 3.5 KB (added by tellyworth, 3 years ago)

Add importer code

  • cli/class-import.php

     
    6666                $headers         = $data['plugin_headers'];
    6767                $stable_tag      = $data['stable_tag'];
    6868                $tagged_versions = $data['tagged_versions'];
     69                $blocks          = $data['blocks'];
    6970
    7071                $content = '';
    7172                if ( $readme->sections ) {
     
    165166                }
    166167                update_post_meta( $plugin->ID, 'assets_banners_color', wp_slash( $banner_average_color ) );
    167168
     169                // Store the block data, if known
     170                if ( count( $blocks ) ) {
     171                        update_post_meta( $plugin->ID, 'all_blocks', $blocks );
     172                } else {
     173                        delete_post_meta( $plugin->ID, 'all_blocks' );
     174                }
     175
    168176                $current_stable_tag = get_post_meta( $plugin->ID, 'stable_tag', true ) ?: 'trunk';
    169177
    170178                $this->rebuild_affected_zips( $plugin_slug, $stable_tag, $current_stable_tag, $svn_changed_tags, $svn_revision_triggered );
     
    396404                        );
    397405                }
    398406
    399                 return compact( 'readme', 'stable_tag', 'tmp_dir', 'plugin_headers', 'assets', 'tagged_versions' );
     407                // Find blocks
     408                $blocks = array();
     409                foreach ( Filesystem::list_files( "$tmp_dir/export/", false, '!\.(?:php|js|jsx|json)$!i' ) as $filename ) {
     410                        $file_blocks = $this->find_blocks_in_file( $filename );
     411                        if ( $file_blocks ) {
     412                                foreach ( $file_blocks as $block ) {
     413                                        // 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.
     414                                        if ( empty( $blocks[ $block->name ]->title ) || isset( $block->description ) ) {
     415                                                $blocks[ $block->name ] = $block;
     416                                        }
     417                                }
     418                        }
     419                }
     420
     421                return compact( 'readme', 'stable_tag', 'tmp_dir', 'plugin_headers', 'assets', 'tagged_versions', 'blocks' );
    400422        }
    401423
    402424        /**
     
    458480
    459481                return false;
    460482        }
     483
     484        /**
     485         * Look for Gutenberg blocks registered within a single file.
     486         *
     487         * @param string $filename Pathname of the file.
     488         *
     489         * @return array An array of objects representing blocks, corresponding to the block.json format where possible.
     490         */
     491        protected function find_blocks_in_file( $filename ) {
     492
     493                $ext = strtolower( pathinfo($filename, PATHINFO_EXTENSION) );
     494
     495                $blocks = array();
     496
     497                if ( 'js' === $ext || 'jsx' === $ext ) {
     498                        // Parse a js-style registerBlockType() call.
     499                        // Note that this only works with literal strings for the block name and title, and assumes that order.
     500                        $contents = file_get_contents( $filename );
     501                        if ( $contents && preg_match_all( "#registerBlockType\s*[(]\s*'([-\w]+/[-\w]+)'\s*,\s*[{]\s*title\s*:[\s_(]*'([^']*)'#ms", $contents, $matches, PREG_SET_ORDER ) ) {
     502                                foreach ( $matches as $match ) {
     503                                        $blocks[] = (object) [
     504                                                'name' => $match[1],
     505                                                'title' => $match[2],
     506                                        ];
     507                                }
     508                        }
     509                }
     510                if ( 'php' === $ext ) {
     511                        // Parse a php-style register_block_type() call.
     512                        // Again this assumes literal strings, and only parses the name and title.
     513                        $contents = file_get_contents( $filename );
     514                        if ( $contents && preg_match_all( "#register_block_type\s*[(]\s*['\"]([-\w]+/[-\w]+)['\"]#ms", $contents, $matches, PREG_SET_ORDER ) ) {
     515                                foreach ( $matches as $match ) {
     516                                        $blocks[] = (object) [
     517                                                'name' => $match[1],
     518                                                'title' => null,
     519                                        ];
     520                                }
     521                        }
     522                }
     523                if ( 'block.json' === basename( $filename ) ) {
     524                        // A block.json file has everything we want.
     525                        $blockinfo = json_decode( file_get_contents( $filename ) );
     526                        if ( isset( $blockinfo->name ) && isset( $blockinfo->title ) ) {
     527                                $blocks[] = $blockinfo;
     528                        }
     529                }
     530
     531                return $blocks;
     532        }
    461533}