| 1 |
import { createBlock, getBlockType, parse, serialize } from '@wordpress/blocks'; |
| 2 |
|
| 3 |
const isDeepValid = (block) => |
| 4 |
block.isValid !== false && block.innerBlocks.every(isDeepValid); |
| 5 |
|
| 6 |
// Unregistered types keep their raw source; only registered ones can rebuild. |
| 7 |
const recoverBlock = (block) => { |
| 8 |
const innerBlocks = block.innerBlocks.map(recoverBlock); |
| 9 |
if (block.isValid !== false || !getBlockType(block.name)) |
| 10 |
return { ...block, innerBlocks }; |
| 11 |
return createBlock(block.name, block.attributes, innerBlocks); |
| 12 |
}; |
| 13 |
|
| 14 |
// The editor's "Attempt recovery" rebuild — model HTML drifting from save() breaks the block otherwise. |
| 15 |
export const healBlockMarkup = (markup) => { |
| 16 |
const blocks = parse(markup); |
| 17 |
if (blocks.every(isDeepValid)) return markup; |
| 18 |
return serialize(blocks.map(recoverBlock)); |
| 19 |
}; |
| 20 |
|