@gechiui/block-editor
Version:
58 lines (54 loc) • 2.03 kB
JavaScript
/**
* GeChiUI dependencies
*/
import { __experimentalGetBlockAttributesNamesByRole as getBlockAttributesNamesByRole } from '@gechiui/blocks';
/**
* Try to find a matching block by a block's name in a provided
* block. We recurse through InnerBlocks and return the reference
* of the matched block (it could be an InnerBlock).
* If no match is found return nothing.
*
* @param {GCBlock} block The block to try to find a match.
* @param {string} selectedBlockName The block's name to use for matching condition.
* @param {Set} consumedBlocks A set holding the previously matched/consumed blocks.
*
* @return {GCBlock?} The matched block if found or nothing(`undefined`).
*/
export const getMatchingBlockByName = (
block,
selectedBlockName,
consumedBlocks = new Set()
) => {
const { clientId, name, innerBlocks = [] } = block;
// Check if block has been consumed already.
if ( consumedBlocks.has( clientId ) ) return;
if ( name === selectedBlockName ) return block;
// Try to find a matching block from InnerBlocks recursively.
for ( const innerBlock of innerBlocks ) {
const match = getMatchingBlockByName(
innerBlock,
selectedBlockName,
consumedBlocks
);
if ( match ) return match;
}
};
/**
* Find and return the block attributes to retain through
* the transformation, based on Block Type's `role:content`
* attributes. If no `role:content` attributes exist,
* return selected block's attributes.
*
* @param {string} name Block type's namespaced name.
* @param {Object} attributes Selected block's attributes.
* @return {Object} The block's attributes to retain.
*/
export const getRetainedBlockAttributes = ( name, attributes ) => {
const contentAttributes = getBlockAttributesNamesByRole( name, 'content' );
if ( ! contentAttributes?.length ) return attributes;
return contentAttributes.reduce( ( _accumulator, attribute ) => {
if ( attributes[ attribute ] )
_accumulator[ attribute ] = attributes[ attribute ];
return _accumulator;
}, {} );
};