diff --git a/tinymce-single/blocks/elements/blockquote/register.js b/tinymce-single/blocks/elements/blockquote/register.js index 50f660fe0ff110..0e15d6d792f99f 100644 --- a/tinymce-single/blocks/elements/blockquote/register.js +++ b/tinymce-single/blocks/elements/blockquote/register.js @@ -4,6 +4,7 @@ window.wp.blocks.registerBlock( { elements: [ 'blockquote' ], type: 'text', icon: 'gridicons-quote', + restrictToInline: [ 'footer' ], controls: [ { classes: 'remove-formatting', diff --git a/tinymce-single/tinymce/block.js b/tinymce-single/tinymce/block.js index 60af399ebe552e..79339f82959580 100644 --- a/tinymce-single/tinymce/block.js +++ b/tinymce-single/tinymce/block.js @@ -60,33 +60,59 @@ } ); } ); + function toInlineContent( content ) { + var settings = { + valid_elements: 'strong,em,del,a[href]' + }; + + var schema = new tinymce.html.Schema( settings ); + var parser = new tinymce.html.DomParser( settings, schema ); + var serializer = new tinymce.html.Serializer( settings, schema ); + + return serializer.serialize( parser.parse( content, { forced_root_block: false } ) ) + } + editor.on( 'beforeSetContent', function( event ) { if ( event.initial ) { return; } - var settings = { - valid_elements: 'strong,em,del,a[href]' - }; - var selectedBlock = wp.blocks.getSelectedBlock(); + var blockSettings = wp.blocks.getBlockSettingsByElement( selectedBlock ); if ( editor.$( selectedBlock ).attr( 'contenteditable' ) === 'false' ) { - var schema = new tinymce.html.Schema( settings ); - var parser = new tinymce.html.DomParser( settings, schema ); - var serializer = new tinymce.html.Serializer( settings, schema ); + event.content = toInlineContent( event.content ); + } + + if ( blockSettings && blockSettings.restrictToInline ) { + blockSettings.restrictToInline.forEach( function( selector ) { + var node = editor.selection.getNode(); - event.content = serializer.serialize( parser.parse( event.content, { forced_root_block: false } ) ); + if ( editor.$( node ).is( selector ) || editor.$( node ).parents( selector ).length ) { + event.content = toInlineContent( event.content ); + } + } ); } } ); editor.on( 'keydown', function( event ) { if ( event.keyCode === tinymce.util.VK.ENTER ) { var selectedBlock = wp.blocks.getSelectedBlock(); + var blockSettings = wp.blocks.getBlockSettingsByElement( selectedBlock ); if ( editor.$( selectedBlock ).attr( 'contenteditable' ) === 'false' ) { event.preventDefault(); } + + if ( blockSettings && blockSettings.restrictToInline ) { + blockSettings.restrictToInline.forEach( function( selector ) { + var node = editor.selection.getNode(); + + if ( editor.$( node ).is( selector ) || editor.$( node ).parents( selector ).length ) { + event.preventDefault(); + } + } ); + } } } );