前回はブロック作成についてでした。
WordPressのブロック開発メモ その12 ブロックの作成とシリアライズ/デシリアライズ
今回はブロックの変換についてです。
変換によく出てくるcreateBlock()
については前回の記事を参照してください。
変換
あるブロックを他のブロックに変換することが出来ます。
今回は自作ブロックと段落ブロックを相互に変換できるようにします。
index.tsx
import { BlockConfiguration, createBlock, registerBlockType } from '@wordpress/blocks';
import Edit from './edit';
import save from './save';
import metadata from './block.json';
import KurageExampleBlockProps from './props';
import './style.scss';
// @ts-ignore
const blockConf: BlockConfiguration<KurageExampleBlockProps> =
{
...metadata,
edit: Edit,
save,
transforms: {
from: [
{
type: 'block',
blocks: ['core/paragraph'],
transform: ( attr ) =>
{
console.log('--- from ---')
console.log(attr);
// @ts-ignore
const { content } = attr;
return createBlock(
'create-block/kurage-worker',
{
message: content
}
)
}
}
],
to: [
{
type: 'block',
blocks: ['core/paragraph'],
transform: ( attr ) =>
{
console.log('--- to ---')
console.log(attr);
const { message } = attr;
return createBlock(
'core/paragraph',
{
content: message
}
)
}
}
]
}
};
registerBlockType(metadata.name, blockConf);
ブロック作成時、設定情報にtransforms
を設定することでブロックの変換が可能になります。
ついでに、編集コンポーネントにも書き換えます。
edit.tsx
export default (props: BlockEditProps<KurageExampleBlockProps>) =>
{
const { message } = props.attributes;
return (
<div {...useBlockProps()}>
<h2>Hello Kurage!</h2>
<TextControl value={message} onChange={message => props.setAttributes({ message })} />
</div>
);
}
段落ブロック
を追加し、Kurage Chaaaaaaaange!
と入力。
ツールバーの左のアイコンをクリックするとコンテキストが開くので
Kurage Worker
をクリックする。
すると、段落ブロック(core/paragraph
)がクラゲブロック(create-block/kurage-worker
)に変換されている。
入力をKurage Baaaaaaaaaaaaaaaaaaaack!
に書き換え、
ツールバーの左のアイコンをクリックし、段落
をクリック。
今度はクラゲブロック(creaet-block/kurage-worker
)が段落ブロック(core/paragraph
)に変換されている。
transforms
のfrom
とto
についてです。
from
は他のブロックからクラゲブロック(creaet-block/kurage-worker
)への変換時の設定です。
to
はその逆でクラゲブロックを他のブロックに変換します。
blocks
はその対象のブロックのリストです。
from
での設定は、そのリストにあるブロックからクラゲブロックへの変換が可能になります。
to
での設定はクラゲブロックの変換先ブロックのリストになります。
ブロックの変換なのでtype
はblock
を指定します。
type
は他にもいくつか種類がありますが、面倒なので省略します。
エンター
type
がenter
の場合です。
何か入力した後、エンターキーを押すことで発動します。
インテリセンスっぽい感じでブロックを追加出来ます。
index.tsx
transforms: {
from: [
// @ts-ignore
{
type: 'enter',
regExp: reg,
transform: ( { content } ) =>
{
console.log(content);
const [, a, b] = content.match(reg);
const message = `ここで ${a} * ${b} のテーブルを組み立てるとか・・・`
return createBlock(
'create-block/kurage-worker',
{
message
}
)
}
}
]
}
入力するように促されるので、
3x5
と入力してEnter
キーを押す。
するとクラゲブロックが作成される(ただしregExp
で指定した正規表現にマッチする必要がある)。
この例ではただテキストを表示しているだけですが、ここで3列5行のテーブルを出力するコードとか考えられます。
この辺は工夫しだいですね。
ただ!
ドキュメントにtransform()
が受け取る引数が明記されてませんでした。
ドキュメントでは引数を取らないような感じでしたが、この辺は今後変更とかありそうで怖いな。
次回はウィジェットについてです。