@wordpress/block-library
Version:
Block library for the WordPress editor.
145 lines (144 loc) • 4.56 kB
JavaScript
// packages/block-library/src/footnotes/format.js
import { v4 as createId } from "uuid";
import { __ } from "@wordpress/i18n";
import { formatListNumbered as icon } from "@wordpress/icons";
import { insertObject } from "@wordpress/rich-text";
import {
RichTextToolbarButton,
store as blockEditorStore,
privateApis
} from "@wordpress/block-editor";
import { useSelect, useDispatch, useRegistry } from "@wordpress/data";
import { store as coreDataStore } from "@wordpress/core-data";
import { createBlock, store as blocksStore } from "@wordpress/blocks";
import { unlock } from "../lock-unlock";
import { jsx } from "react/jsx-runtime";
var { usesContextKey } = unlock(privateApis);
var formatName = "core/footnote";
var POST_CONTENT_BLOCK_NAME = "core/post-content";
var SYNCED_PATTERN_BLOCK_NAME = "core/block";
var format = {
title: __("Footnote"),
tagName: "sup",
className: "fn",
attributes: {
"data-fn": "data-fn"
},
interactive: true,
contentEditable: false,
[usesContextKey]: ["postType", "postId"],
edit: function Edit({
value,
onChange,
isObjectActive,
context: { postType, postId }
}) {
const registry = useRegistry();
const {
getSelectedBlockClientId,
getBlocks,
getBlockRootClientId,
getBlockName,
getBlockParentsByBlockName
} = registry.select(blockEditorStore);
const isFootnotesSupported = useSelect(
(select) => {
if (!select(blocksStore).getBlockType("core/footnotes")) {
return false;
}
const allowedBlocks = select(blockEditorStore).getSettings().allowedBlockTypes;
if (allowedBlocks === false || Array.isArray(allowedBlocks) && !allowedBlocks.includes("core/footnotes")) {
return false;
}
const entityRecord = select(coreDataStore).getEntityRecord(
"postType",
postType,
postId
);
if ("string" !== typeof entityRecord?.meta?.footnotes) {
return false;
}
const {
getBlockParentsByBlockName: _getBlockParentsByBlockName,
getSelectedBlockClientId: _getSelectedBlockClientId
} = select(blockEditorStore);
const parentCoreBlocks = _getBlockParentsByBlockName(
_getSelectedBlockClientId(),
SYNCED_PATTERN_BLOCK_NAME
);
return !parentCoreBlocks || parentCoreBlocks.length === 0;
},
[postType, postId]
);
const { selectionChange, insertBlock } = useDispatch(blockEditorStore);
if (!isFootnotesSupported) {
return null;
}
function onClick() {
registry.batch(() => {
let id;
if (isObjectActive) {
const object = value.replacements[value.start];
id = object?.attributes?.["data-fn"];
} else {
id = createId();
const newValue = insertObject(
value,
{
type: formatName,
attributes: {
"data-fn": id
},
innerHTML: `<a href="#${id}" id="${id}-link">*</a>`
},
value.end,
value.end
);
newValue.start = newValue.end - 1;
onChange(newValue);
}
const selectedClientId = getSelectedBlockClientId();
const parentPostContent = getBlockParentsByBlockName(
selectedClientId,
POST_CONTENT_BLOCK_NAME
);
const blocks = parentPostContent.length ? getBlocks(parentPostContent[0]) : getBlocks();
let fnBlock = null;
{
const queue = [...blocks];
while (queue.length) {
const block = queue.shift();
if (block.name === "core/footnotes") {
fnBlock = block;
break;
}
queue.push(...block.innerBlocks);
}
}
if (!fnBlock) {
let rootClientId = getBlockRootClientId(selectedClientId);
while (rootClientId && getBlockName(rootClientId) !== POST_CONTENT_BLOCK_NAME) {
rootClientId = getBlockRootClientId(rootClientId);
}
fnBlock = createBlock("core/footnotes");
insertBlock(fnBlock, void 0, rootClientId);
}
selectionChange(fnBlock.clientId, id, 0, 0);
});
}
return /* @__PURE__ */ jsx(
RichTextToolbarButton,
{
icon,
title: __("Footnote"),
onClick,
isActive: isObjectActive
}
);
}
};
export {
format,
formatName
};
//# sourceMappingURL=format.js.map