81 lines
2.2 KiB
TypeScript
81 lines
2.2 KiB
TypeScript
/**
|
|
* External dependencies
|
|
*/
|
|
import { renderMarkdownFromHTML } from '@automattic/jetpack-ai-client';
|
|
import { createBlock, getSaveContent } from '@wordpress/blocks';
|
|
/**
|
|
* Internal dependencies
|
|
*/
|
|
import metadata from '../block.json';
|
|
import {
|
|
EXTENDED_TRANSFORMATIVE_BLOCKS,
|
|
isPossibleToExtendBlock,
|
|
} from '../extensions/ai-assistant';
|
|
/**
|
|
* Types
|
|
*/
|
|
import type { ExtendedBlockProp, ExtendedInlineBlockProp } from '../extensions/ai-assistant';
|
|
import type { PromptItemProps } from '../lib/prompt';
|
|
|
|
const from: unknown[] = [];
|
|
|
|
/**
|
|
* Return an AI Assistant block instance from a given block type.
|
|
*
|
|
* @param {ExtendedBlockProp} blockType - Block type.
|
|
* @param {object} attrs - Block attributes.
|
|
* @returns {object} AI Assistant block instance.
|
|
*/
|
|
export function transformToAIAssistantBlock(
|
|
blockType: ExtendedBlockProp | ExtendedInlineBlockProp,
|
|
attrs
|
|
) {
|
|
const { content, ...restAttrs } = attrs;
|
|
let htmlContent = content;
|
|
|
|
// core/heading custom transform handling.
|
|
if ( blockType === 'core/heading' && attrs?.level ) {
|
|
// Replace the HTML tags with the block level.
|
|
htmlContent = htmlContent.replace( /<(\/?)h\d([^>]*)>/g, `<$1h${ attrs.level }$2>` );
|
|
}
|
|
|
|
// Convert the content to markdown.
|
|
const aiAssistantBlockcontent = renderMarkdownFromHTML( { content: htmlContent } );
|
|
|
|
// A list of messages to start with
|
|
const messages: Array< PromptItemProps > = [];
|
|
|
|
messages.push( {
|
|
role: 'jetpack-ai',
|
|
context: {
|
|
type: 'ai-assistant-relevant-content',
|
|
content: aiAssistantBlockcontent,
|
|
},
|
|
} );
|
|
|
|
return createBlock( metadata.name, {
|
|
...restAttrs,
|
|
content: aiAssistantBlockcontent,
|
|
originalContent: aiAssistantBlockcontent,
|
|
messages,
|
|
originalMessages: messages,
|
|
} );
|
|
}
|
|
|
|
/*
|
|
* Create individual transform handler for each block type.
|
|
*/
|
|
for ( const blockType of EXTENDED_TRANSFORMATIVE_BLOCKS ) {
|
|
from.push( {
|
|
type: 'block',
|
|
blocks: [ blockType ],
|
|
isMatch: () => isPossibleToExtendBlock(),
|
|
transform: ( attrs, innerBlocks ) => {
|
|
const content = getSaveContent( blockType, attrs, innerBlocks );
|
|
return transformToAIAssistantBlock( blockType as ExtendedBlockProp, { ...attrs, content } );
|
|
},
|
|
} );
|
|
}
|
|
|
|
export default { from };
|