@wordpress/blocks
Version:
Block API for WordPress.
8 lines (7 loc) • 7.48 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/api/raw-handling/shortcode-converter.js"],
"sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { regexp, next } from '@wordpress/shortcode';\n\n/**\n * Internal dependencies\n */\nimport { createBlock, getBlockTransforms, findTransform } from '../factory';\nimport { getBlockType } from '../registration';\nimport { getBlockAttributes } from '../parser/get-block-attributes';\nimport { applyBuiltInValidationFixes } from '../parser/apply-built-in-validation-fixes';\n\nconst castArray = ( maybeArray ) =>\n\tArray.isArray( maybeArray ) ? maybeArray : [ maybeArray ];\n\nconst beforeLineRegexp = /(\\n|<p>|<br\\s*\\/?>)\\s*$/;\nconst afterLineRegexp = /^\\s*(\\n|<\\/p>|<br\\s*\\/?>)/;\n\nfunction segmentHTMLToShortcodeBlock(\n\tHTML,\n\tlastIndex = 0,\n\texcludedBlockNames = []\n) {\n\t// Get all matches.\n\tconst transformsFrom = getBlockTransforms( 'from' );\n\n\tconst transformation = findTransform(\n\t\ttransformsFrom,\n\t\t( transform ) =>\n\t\t\texcludedBlockNames.indexOf( transform.blockName ) === -1 &&\n\t\t\ttransform.type === 'shortcode' &&\n\t\t\tcastArray( transform.tag ).some( ( tag ) =>\n\t\t\t\tregexp( tag ).test( HTML )\n\t\t\t)\n\t);\n\n\tif ( ! transformation ) {\n\t\treturn [ HTML ];\n\t}\n\n\tconst transformTags = castArray( transformation.tag );\n\tconst transformTag = transformTags.find( ( tag ) =>\n\t\tregexp( tag ).test( HTML )\n\t);\n\n\tlet match;\n\tconst previousIndex = lastIndex;\n\n\tif ( ( match = next( transformTag, HTML, lastIndex ) ) ) {\n\t\tlastIndex = match.index + match.content.length;\n\t\tconst beforeHTML = HTML.substr( 0, match.index );\n\t\tconst afterHTML = HTML.substr( lastIndex );\n\n\t\t// If the shortcode content does not contain HTML and the shortcode is\n\t\t// not on a new line (or in paragraph from Markdown converter),\n\t\t// consider the shortcode as inline text, and thus skip conversion for\n\t\t// this segment.\n\t\tif (\n\t\t\t! match.shortcode.content?.includes( '<' ) &&\n\t\t\t! (\n\t\t\t\tbeforeLineRegexp.test( beforeHTML ) &&\n\t\t\t\tafterLineRegexp.test( afterHTML )\n\t\t\t)\n\t\t) {\n\t\t\treturn segmentHTMLToShortcodeBlock( HTML, lastIndex );\n\t\t}\n\n\t\t// If a transformation's `isMatch` predicate fails for the inbound\n\t\t// shortcode, try again by excluding the current block type.\n\t\t//\n\t\t// This is the only call to `segmentHTMLToShortcodeBlock` that should\n\t\t// ever carry over `excludedBlockNames`. Other calls in the module\n\t\t// should skip that argument as a way to reset the exclusion state, so\n\t\t// that one `isMatch` fail in an HTML fragment doesn't prevent any\n\t\t// valid matches in subsequent fragments.\n\t\tif (\n\t\t\ttransformation.isMatch &&\n\t\t\t! transformation.isMatch( match.shortcode.attrs )\n\t\t) {\n\t\t\treturn segmentHTMLToShortcodeBlock( HTML, previousIndex, [\n\t\t\t\t...excludedBlockNames,\n\t\t\t\ttransformation.blockName,\n\t\t\t] );\n\t\t}\n\n\t\tlet blocks = [];\n\t\tif ( typeof transformation.transform === 'function' ) {\n\t\t\t// Passing all of `match` as second argument is intentionally broad\n\t\t\t// but shouldn't be too relied upon.\n\t\t\t//\n\t\t\t// See: https://github.com/WordPress/gutenberg/pull/3610#discussion_r152546926\n\t\t\tblocks = [].concat(\n\t\t\t\ttransformation.transform( match.shortcode.attrs, match )\n\t\t\t);\n\n\t\t\t// Applying the built-in fixes can enhance the attributes with missing content like \"className\".\n\t\t\tblocks = blocks.map( ( block ) => {\n\t\t\t\tblock.originalContent = match.shortcode.content;\n\t\t\t\treturn applyBuiltInValidationFixes(\n\t\t\t\t\tblock,\n\t\t\t\t\tgetBlockType( block.name )\n\t\t\t\t);\n\t\t\t} );\n\t\t} else {\n\t\t\tconst attributes = Object.fromEntries(\n\t\t\t\tObject.entries( transformation.attributes )\n\t\t\t\t\t.filter( ( [ , schema ] ) => schema.shortcode )\n\t\t\t\t\t// Passing all of `match` as second argument is intentionally broad\n\t\t\t\t\t// but shouldn't be too relied upon.\n\t\t\t\t\t//\n\t\t\t\t\t// See: https://github.com/WordPress/gutenberg/pull/3610#discussion_r152546926\n\t\t\t\t\t.map( ( [ key, schema ] ) => [\n\t\t\t\t\t\tkey,\n\t\t\t\t\t\tschema.shortcode( match.shortcode.attrs, match ),\n\t\t\t\t\t] )\n\t\t\t);\n\n\t\t\tconst blockType = getBlockType( transformation.blockName );\n\t\t\tif ( ! blockType ) {\n\t\t\t\treturn [ HTML ];\n\t\t\t}\n\n\t\t\tconst transformationBlockType = {\n\t\t\t\t...blockType,\n\t\t\t\tattributes: transformation.attributes,\n\t\t\t};\n\n\t\t\tlet block = createBlock(\n\t\t\t\ttransformation.blockName,\n\t\t\t\tgetBlockAttributes(\n\t\t\t\t\ttransformationBlockType,\n\t\t\t\t\tmatch.shortcode.content,\n\t\t\t\t\tattributes\n\t\t\t\t)\n\t\t\t);\n\n\t\t\t// Applying the built-in fixes can enhance the attributes with missing content like \"className\".\n\t\t\tblock.originalContent = match.shortcode.content;\n\t\t\tblock = applyBuiltInValidationFixes(\n\t\t\t\tblock,\n\t\t\t\ttransformationBlockType\n\t\t\t);\n\n\t\t\tblocks = [ block ];\n\t\t}\n\n\t\treturn [\n\t\t\t...segmentHTMLToShortcodeBlock(\n\t\t\t\tbeforeHTML.replace( beforeLineRegexp, '' )\n\t\t\t),\n\t\t\t...blocks,\n\t\t\t...segmentHTMLToShortcodeBlock(\n\t\t\t\tafterHTML.replace( afterLineRegexp, '' )\n\t\t\t),\n\t\t];\n\t}\n\n\treturn [ HTML ];\n}\n\nexport default segmentHTMLToShortcodeBlock;\n"],
"mappings": "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",
"names": []
}