UNPKG

@wordpress/block-library

Version:
8 lines (7 loc) 8.77 kB
{ "version": 3, "sources": ["../../src/footnotes/format.js"], "sourcesContent": ["/**\n * External dependencies\n */\nimport { v4 as createId } from 'uuid';\n\n/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport { formatListNumbered as icon } from '@wordpress/icons';\nimport { insertObject } from '@wordpress/rich-text';\nimport {\n\tRichTextToolbarButton,\n\tstore as blockEditorStore,\n\tprivateApis,\n} from '@wordpress/block-editor';\nimport { useSelect, useDispatch, useRegistry } from '@wordpress/data';\nimport { store as coreDataStore } from '@wordpress/core-data';\nimport { createBlock, store as blocksStore } from '@wordpress/blocks';\n\n/**\n * Internal dependencies\n */\nimport { unlock } from '../lock-unlock';\nimport { name as FOOTNOTES_BLOCK_NAME } from './';\n\nexport const formatName = 'core/footnote';\n\nconst { usesContextKey } = unlock( privateApis );\nconst POST_CONTENT_BLOCK_NAME = 'core/post-content';\nconst SYNCED_PATTERN_BLOCK_NAME = 'core/block';\n\nexport const format = {\n\ttitle: __( 'Footnote' ),\n\ttagName: 'sup',\n\tclassName: 'fn',\n\tattributes: {\n\t\t'data-fn': 'data-fn',\n\t},\n\tinteractive: true,\n\tcontentEditable: false,\n\t[ usesContextKey ]: [ 'postType', 'postId' ],\n\tedit: function Edit( {\n\t\tvalue,\n\t\tonChange,\n\t\tisObjectActive,\n\t\tcontext: { postType, postId },\n\t} ) {\n\t\tconst registry = useRegistry();\n\t\tconst {\n\t\t\tgetSelectedBlockClientId,\n\t\t\tgetBlocks,\n\t\t\tgetBlockRootClientId,\n\t\t\tgetBlockName,\n\t\t\tgetBlockParentsByBlockName,\n\t\t} = registry.select( blockEditorStore );\n\t\tconst isFootnotesSupported = useSelect(\n\t\t\t( select ) => {\n\t\t\t\tif (\n\t\t\t\t\t! select( blocksStore ).getBlockType( 'core/footnotes' )\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst allowedBlocks =\n\t\t\t\t\tselect( blockEditorStore ).getSettings().allowedBlockTypes;\n\t\t\t\tif (\n\t\t\t\t\tallowedBlocks === false ||\n\t\t\t\t\t( Array.isArray( allowedBlocks ) &&\n\t\t\t\t\t\t! allowedBlocks.includes( 'core/footnotes' ) )\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst entityRecord = select( coreDataStore ).getEntityRecord(\n\t\t\t\t\t'postType',\n\t\t\t\t\tpostType,\n\t\t\t\t\tpostId\n\t\t\t\t);\n\n\t\t\t\tif ( 'string' !== typeof entityRecord?.meta?.footnotes ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Checks if the selected block lives within a pattern.\n\t\t\t\tconst {\n\t\t\t\t\tgetBlockParentsByBlockName: _getBlockParentsByBlockName,\n\t\t\t\t\tgetSelectedBlockClientId: _getSelectedBlockClientId,\n\t\t\t\t\tgetBlockName: _getBlockName,\n\t\t\t\t} = select( blockEditorStore );\n\n\t\t\t\tconst selectedClientId = _getSelectedBlockClientId();\n\n\t\t\t\tif ( ! selectedClientId ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Check if the selected block itself is a footnotes block.\n\t\t\t\tif (\n\t\t\t\t\t_getBlockName( selectedClientId ) === FOOTNOTES_BLOCK_NAME\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst parentCoreBlocks = _getBlockParentsByBlockName(\n\t\t\t\t\tselectedClientId,\n\t\t\t\t\tSYNCED_PATTERN_BLOCK_NAME\n\t\t\t\t);\n\t\t\t\treturn ! parentCoreBlocks || parentCoreBlocks.length === 0;\n\t\t\t},\n\t\t\t[ postType, postId ]\n\t\t);\n\n\t\tconst { selectionChange, insertBlock } =\n\t\t\tuseDispatch( blockEditorStore );\n\n\t\tif ( ! isFootnotesSupported ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tfunction onClick() {\n\t\t\tregistry.batch( () => {\n\t\t\t\tlet id;\n\t\t\t\tif ( isObjectActive ) {\n\t\t\t\t\tconst object = value.replacements[ value.start ];\n\t\t\t\t\tid = object?.attributes?.[ 'data-fn' ];\n\t\t\t\t} else {\n\t\t\t\t\tid = createId();\n\t\t\t\t\tconst newValue = insertObject(\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: formatName,\n\t\t\t\t\t\t\tattributes: {\n\t\t\t\t\t\t\t\t'data-fn': id,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tinnerHTML: `<a href=\"#${ id }\" id=\"${ id }-link\">*</a>`,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvalue.end,\n\t\t\t\t\t\tvalue.end\n\t\t\t\t\t);\n\t\t\t\t\tnewValue.start = newValue.end - 1;\n\t\t\t\t\tonChange( newValue );\n\t\t\t\t}\n\n\t\t\t\tconst selectedClientId = getSelectedBlockClientId();\n\n\t\t\t\t/*\n\t\t\t\t * Attempts to find a common parent post content block.\n\t\t\t\t * This allows for locating blocks within a page edited in the site editor.\n\t\t\t\t */\n\t\t\t\tconst parentPostContent = getBlockParentsByBlockName(\n\t\t\t\t\tselectedClientId,\n\t\t\t\t\tPOST_CONTENT_BLOCK_NAME\n\t\t\t\t);\n\n\t\t\t\t// When called with a post content block, getBlocks will return\n\t\t\t\t// the block with controlled inner blocks included.\n\t\t\t\tconst blocks = parentPostContent.length\n\t\t\t\t\t? getBlocks( parentPostContent[ 0 ] )\n\t\t\t\t\t: getBlocks();\n\n\t\t\t\t// BFS search to find the first footnote block.\n\t\t\t\tlet fnBlock = null;\n\t\t\t\t{\n\t\t\t\t\tconst queue = [ ...blocks ];\n\t\t\t\t\twhile ( queue.length ) {\n\t\t\t\t\t\tconst block = queue.shift();\n\t\t\t\t\t\tif ( block.name === 'core/footnotes' ) {\n\t\t\t\t\t\t\tfnBlock = block;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqueue.push( ...block.innerBlocks );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Maybe this should all also be moved to the entity provider.\n\t\t\t\t// When there is no footnotes block in the post, create one and\n\t\t\t\t// insert it at the bottom.\n\t\t\t\tif ( ! fnBlock ) {\n\t\t\t\t\tlet rootClientId = getBlockRootClientId( selectedClientId );\n\n\t\t\t\t\twhile (\n\t\t\t\t\t\trootClientId &&\n\t\t\t\t\t\tgetBlockName( rootClientId ) !== POST_CONTENT_BLOCK_NAME\n\t\t\t\t\t) {\n\t\t\t\t\t\trootClientId = getBlockRootClientId( rootClientId );\n\t\t\t\t\t}\n\n\t\t\t\t\tfnBlock = createBlock( 'core/footnotes' );\n\n\t\t\t\t\tinsertBlock( fnBlock, undefined, rootClientId );\n\t\t\t\t}\n\n\t\t\t\tselectionChange( fnBlock.clientId, id, 0, 0 );\n\t\t\t} );\n\t\t}\n\n\t\treturn (\n\t\t\t<RichTextToolbarButton\n\t\t\t\ticon={ icon }\n\t\t\t\ttitle={ __( 'Footnote' ) }\n\t\t\t\tonClick={ onClick }\n\t\t\t\tisActive={ isObjectActive }\n\t\t\t/>\n\t\t);\n\t},\n};\n"], "mappings": "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", "names": [] }