@wordpress/block-editor
Version:
126 lines (123 loc) • 4.74 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getAllPatternsDependants = exports.checkAllowListRecursive = exports.checkAllowList = void 0;
exports.getGrammar = getGrammar;
exports.getInsertBlockTypeDependants = void 0;
exports.getParsedPattern = getParsedPattern;
exports.isFiltered = void 0;
exports.mapUserPattern = mapUserPattern;
var _blocks = require("@wordpress/blocks");
var _blockSerializationDefaultParser = require("@wordpress/block-serialization-default-parser");
var _privateKeys = require("./private-keys");
var _lockUnlock = require("../lock-unlock");
var _constants = require("./constants");
var _privateSelectors = require("./private-selectors");
var _utils = require("../components/inserter/block-patterns-tab/utils");
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
const isFiltered = exports.isFiltered = Symbol('isFiltered');
const parsedPatternCache = new WeakMap();
const grammarMapCache = new WeakMap();
function mapUserPattern(userPattern, __experimentalUserPatternCategories = []) {
return {
name: `core/block/${userPattern.id}`,
id: userPattern.id,
type: _utils.INSERTER_PATTERN_TYPES.user,
title: userPattern.title?.raw,
categories: userPattern.wp_pattern_category?.map(catId => {
const category = __experimentalUserPatternCategories.find(({
id
}) => id === catId);
return category ? category.slug : catId;
}),
content: userPattern.content?.raw,
syncStatus: userPattern.wp_pattern_sync_status
};
}
function parsePattern(pattern) {
const blocks = (0, _blocks.parse)(pattern.content, {
__unstableSkipMigrationLogs: true
});
if (blocks.length === 1) {
blocks[0].attributes = {
...blocks[0].attributes,
metadata: {
...(blocks[0].attributes.metadata || {}),
categories: pattern.categories,
patternName: pattern.name,
name: blocks[0].attributes.metadata?.name || pattern.title
}
};
}
return {
...pattern,
blocks
};
}
function getParsedPattern(pattern) {
let parsedPattern = parsedPatternCache.get(pattern);
if (!parsedPattern) {
parsedPattern = parsePattern(pattern);
parsedPatternCache.set(pattern, parsedPattern);
}
return parsedPattern;
}
function getGrammar(pattern) {
let grammarMap = grammarMapCache.get(pattern);
if (!grammarMap) {
grammarMap = (0, _blockSerializationDefaultParser.parse)(pattern.content);
// Block names are null only at the top level for whitespace.
grammarMap = grammarMap.filter(block => block.blockName !== null);
grammarMapCache.set(pattern, grammarMap);
}
return grammarMap;
}
const checkAllowList = (list, item, defaultResult = null) => {
if (typeof list === 'boolean') {
return list;
}
if (Array.isArray(list)) {
// TODO: when there is a canonical way to detect that we are editing a post
// the following check should be changed to something like:
// if ( list.includes( 'core/post-content' ) && getEditorMode() === 'post-content' && item === null )
if (list.includes('core/post-content') && item === null) {
return true;
}
return list.includes(item);
}
return defaultResult;
};
exports.checkAllowList = checkAllowList;
const checkAllowListRecursive = (blocks, allowedBlockTypes) => {
if (typeof allowedBlockTypes === 'boolean') {
return allowedBlockTypes;
}
const blocksQueue = [...blocks];
while (blocksQueue.length > 0) {
const block = blocksQueue.shift();
const isAllowed = checkAllowList(allowedBlockTypes, block.name || block.blockName, true);
if (!isAllowed) {
return false;
}
block.innerBlocks?.forEach(innerBlock => {
blocksQueue.push(innerBlock);
});
}
return true;
};
exports.checkAllowListRecursive = checkAllowListRecursive;
const getAllPatternsDependants = select => state => {
return [state.settings.__experimentalBlockPatterns, state.settings.__experimentalUserPatternCategories, state.settings.__experimentalReusableBlocks, state.settings[_privateKeys.selectBlockPatternsKey]?.(select), state.blockPatterns, (0, _lockUnlock.unlock)(select(_constants.STORE_NAME)).getReusableBlocks()];
};
exports.getAllPatternsDependants = getAllPatternsDependants;
const getInsertBlockTypeDependants = select => (state, rootClientId) => {
return [state.blockListSettings[rootClientId], state.blocks.byClientId.get(rootClientId), state.settings.allowedBlockTypes, state.settings.templateLock, state.blockEditingModes, select(_constants.STORE_NAME).__unstableGetEditorMode(state), (0, _privateSelectors.getSectionRootClientId)(state)];
};
exports.getInsertBlockTypeDependants = getInsertBlockTypeDependants;
//# sourceMappingURL=utils.js.map
;