store
2 months ago
GenerateBgImage.js
2 months ago
block-duplicate-helper.js
2 months ago
capitalize.js
2 months ago
color-code-to-class.js
2 months ago
color-slug-to-color-code.js
2 months ago
common.scss
3 weeks ago
convert-to-grid.js
2 months ago
default-color-palette.js
2 months ago
delete-from-array.js
2 months ago
depModules.js
2 months ago
disable-links.js
3 weeks ago
empty-string-to-undefined.js
2 months ago
example-data.js
2 months ago
fixBrokenUnicode.js
2 months ago
font-awesome-new.js
3 weeks ago
font-awesome-version.js
2 months ago
font-awesome.js
2 months ago
formatNumCol.js
2 months ago
gradient-slug-to-gradient-code.js
2 months ago
heading-level-utils.js
2 months ago
hex-to-rgba.js
2 months ago
horizontal-scroll-controls.js
2 months ago
icon-label.js
3 weeks ago
is-excludes-blocks.js
2 months ago
is-gradient-style.js
2 months ago
is-hex-color.js
2 months ago
is-not-json.js
2 months ago
is-parent-reusable-block.js
1 week ago
merge-colors.js
2 months ago
multi-array-flaten.js
2 months ago
removeProperty.js
2 months ago
replaceClientId.js
2 months ago
sanitizeSlug.js
2 months ago
settings-page-url.js
3 weeks ago
strip-html.js
2 months ago
taxonomy-utils.js
2 months ago
to-number.js
2 months ago
to-preset-spacing-var.js
2 months ago
unit-options.js
2 months ago
wrap-unwrap.js
2 months ago
block-duplicate-helper.js
139 lines
| 1 | /** |
| 2 | * ブロックID重複検出の� |
| 3 | �通ユーティリティ関数 |
| 4 | * ブロックIDの生成、重複検出、再帰的なブロック取得などの� |
| 5 | �通処理 |
| 6 | */ |
| 7 | |
| 8 | /** |
| 9 | * ユニークなブロックIDを生成 |
| 10 | * @return {string} ユニークなID |
| 11 | */ |
| 12 | export const generateUniqueBlockId = () => { |
| 13 | return ( |
| 14 | Math.random().toString(36).substring(2, 11) + |
| 15 | '-' + |
| 16 | Math.random().toString(36).substring(2, 6) + |
| 17 | '-' + |
| 18 | Math.random().toString(36).substring(2, 6) + |
| 19 | '-' + |
| 20 | Math.random().toString(36).substring(2, 6) + |
| 21 | '-' + |
| 22 | Math.random().toString(36).substring(2, 14) |
| 23 | ); |
| 24 | }; |
| 25 | |
| 26 | /** |
| 27 | * ブロックを再帰的に取得(ネストされたブロックも含む) |
| 28 | * @param {Array} blocks - ブロック� |
| 29 | �列 |
| 30 | * @return {Array} すべてのブロック(ネストされたものも含む) |
| 31 | */ |
| 32 | export const getAllBlocksRecursively = (blocks) => { |
| 33 | let allBlocks = []; |
| 34 | blocks.forEach((block) => { |
| 35 | allBlocks.push(block); |
| 36 | if (block.innerBlocks && block.innerBlocks.length > 0) { |
| 37 | allBlocks = allBlocks.concat( |
| 38 | getAllBlocksRecursively(block.innerBlocks) |
| 39 | ); |
| 40 | } |
| 41 | }); |
| 42 | return allBlocks; |
| 43 | }; |
| 44 | |
| 45 | /** |
| 46 | * 重複検出を� |
| 47 | 延実行するヘルパー |
| 48 | * @param {Function} checkFn - 実行する関数 |
| 49 | * @param {number} delay - � |
| 50 | 延時間(ミリ秒) |
| 51 | * @return {Function} クリーンアップ関数 |
| 52 | */ |
| 53 | export const scheduleDuplicateCheck = (checkFn, delay = 100) => { |
| 54 | checkFn(); // 即座に実行 |
| 55 | const timeoutId = setTimeout(checkFn, delay); // � |
| 56 | 延実行 |
| 57 | return () => clearTimeout(timeoutId); // クリーンアップ関数を返す |
| 58 | }; |
| 59 | |
| 60 | /** |
| 61 | * 複製されたブロックを判定する |
| 62 | * @param {Array} allBlocks - すべてのブロック� |
| 63 | �列 |
| 64 | * @param {string} blockName - 検索するブロック名 |
| 65 | * @param {string} blockId - 検索するブロックID |
| 66 | * @param {string} currentClientId - 現在のブロックのクライアントID |
| 67 | * @return {boolean} 現在のブロックが複製された方の場合true |
| 68 | */ |
| 69 | export const isCurrentBlockDuplicate = ( |
| 70 | allBlocks, |
| 71 | blockName, |
| 72 | blockId, |
| 73 | currentClientId |
| 74 | ) => { |
| 75 | const duplicateBlocks = allBlocks.filter( |
| 76 | (block) => |
| 77 | block.name === blockName && |
| 78 | block.attributes && |
| 79 | block.attributes.blockId === blockId |
| 80 | ); |
| 81 | |
| 82 | if (duplicateBlocks.length <= 1) { |
| 83 | return false; // 重複なし |
| 84 | } |
| 85 | |
| 86 | // 複数のブロックが同じIDを持っている場合 |
| 87 | // ブロックの� |
| 88 | �置順序で判定(より後に� |
| 89 | �置されたブロックが複製された方) |
| 90 | const currentBlock = duplicateBlocks.find( |
| 91 | (block) => block.clientId === currentClientId |
| 92 | ); |
| 93 | const otherBlocks = duplicateBlocks.filter( |
| 94 | (block) => block.clientId !== currentClientId |
| 95 | ); |
| 96 | |
| 97 | if (!currentBlock || otherBlocks.length === 0) { |
| 98 | return false; |
| 99 | } |
| 100 | |
| 101 | // 現在のブロックが他のブロックより後に� |
| 102 | �置されている場合、複製された方 |
| 103 | // ブロックの� |
| 104 | �置順序は、DOM� |
| 105 | での位置で判定 |
| 106 | const currentBlockIndex = allBlocks.findIndex( |
| 107 | (block) => block.clientId === currentClientId |
| 108 | ); |
| 109 | const otherBlockIndices = otherBlocks |
| 110 | .map((block) => |
| 111 | allBlocks.findIndex((b) => b.clientId === block.clientId) |
| 112 | ) |
| 113 | .filter((index) => index !== -1); |
| 114 | |
| 115 | // 現在のブロックが他のブロックより後に� |
| 116 | �置されている場合、複製された方 |
| 117 | return otherBlockIndices.some( |
| 118 | (otherIndex) => currentBlockIndex > otherIndex |
| 119 | ); |
| 120 | }; |
| 121 | |
| 122 | /** |
| 123 | * WordPressのブロックエディタからすべてのブロックを取得 |
| 124 | * @return {Array|null} すべてのブロック� |
| 125 | �列、取得できない場合はnull |
| 126 | */ |
| 127 | export const getAllBlocksFromEditor = () => { |
| 128 | if (typeof window !== 'undefined' && window.wp && window.wp.data) { |
| 129 | const { select } = window.wp.data; |
| 130 | const { getBlocks } = select('core/block-editor'); |
| 131 | |
| 132 | if (getBlocks) { |
| 133 | const rootBlocks = getBlocks(); |
| 134 | return getAllBlocksRecursively(rootBlocks); |
| 135 | } |
| 136 | } |
| 137 | return null; |
| 138 | }; |
| 139 |