From dde79a61bb70ce8cd80a4352ff25e532e08eaadf Mon Sep 17 00:00:00 2001 From: epiqueras Date: Thu, 16 Jan 2020 22:39:19 -0500 Subject: [PATCH 1/6] Lib: Add single demo block template. --- lib/demo-block-templates/single.html | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 lib/demo-block-templates/single.html diff --git a/lib/demo-block-templates/single.html b/lib/demo-block-templates/single.html new file mode 100644 index 0000000000000..477e98d7bf845 --- /dev/null +++ b/lib/demo-block-templates/single.html @@ -0,0 +1,2 @@ + + From 9ee063b1b373273cba63429579bfd8a4c4264033 Mon Sep 17 00:00:00 2001 From: epiqueras Date: Thu, 16 Jan 2020 22:47:07 -0500 Subject: [PATCH 2/6] Core Data: Provide full raw properties from `useEntityProp`. --- packages/core-data/src/entity-provider.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/core-data/src/entity-provider.js b/packages/core-data/src/entity-provider.js index 03454425ccb31..14d495426a8c2 100644 --- a/packages/core-data/src/entity-provider.js +++ b/packages/core-data/src/entity-provider.js @@ -85,12 +85,15 @@ export function useEntityId( kind, type ) { export function useEntityProp( kind, type, prop ) { const id = useEntityId( kind, type ); - const value = useSelect( + const { value, fullValue } = useSelect( ( select ) => { const { getEntityRecord, getEditedEntityRecord } = select( 'core' ); - getEntityRecord( kind, type, id ); // Trigger resolver. - const entity = getEditedEntityRecord( kind, type, id ); - return entity && entity[ prop ]; + const entity = getEntityRecord( kind, type, id ); // Trigger resolver. + const editedEntity = getEditedEntityRecord( kind, type, id ); + return ( + entity && + editedEntity && { value: editedEntity[ prop ], fullValue: entity[ prop ] } + ); }, [ kind, type, id, prop ] ); @@ -105,7 +108,7 @@ export function useEntityProp( kind, type, prop ) { [ kind, type, id, prop ] ); - return [ value, setValue ]; + return [ value, setValue, fullValue ]; } /** From 2368b51a80e2b1b32257a8587fc55f15842d7edf Mon Sep 17 00:00:00 2001 From: epiqueras Date: Thu, 16 Jan 2020 22:47:41 -0500 Subject: [PATCH 3/6] Block Library: Add features to the Post Excerpt block. --- packages/block-library/src/editor.scss | 1 + .../block-library/src/post-excerpt/block.json | 15 +++- .../block-library/src/post-excerpt/edit.js | 90 +++++++++++++++++-- .../src/post-excerpt/editor.scss | 3 + .../block-library/src/post-excerpt/index.php | 42 ++++++++- 5 files changed, 141 insertions(+), 10 deletions(-) create mode 100644 packages/block-library/src/post-excerpt/editor.scss diff --git a/packages/block-library/src/editor.scss b/packages/block-library/src/editor.scss index 012918eef5483..7b68e2d7a9ddf 100644 --- a/packages/block-library/src/editor.scss +++ b/packages/block-library/src/editor.scss @@ -28,6 +28,7 @@ @import "./navigation-link/editor.scss"; @import "./nextpage/editor.scss"; @import "./paragraph/editor.scss"; +@import "./post-excerpt/editor.scss"; @import "./pullquote/editor.scss"; @import "./quote/editor.scss"; @import "./rss/editor.scss"; diff --git a/packages/block-library/src/post-excerpt/block.json b/packages/block-library/src/post-excerpt/block.json index ef39be86f839c..6ef5e21bc55b7 100644 --- a/packages/block-library/src/post-excerpt/block.json +++ b/packages/block-library/src/post-excerpt/block.json @@ -1,4 +1,17 @@ { "name": "core/post-excerpt", - "category": "layout" + "category": "layout", + "attributes": { + "excerptLength": { + "type": "number", + "default": 55 + }, + "moreText": { + "type": "string" + }, + "showMoreOnNewLine": { + "type": "boolean", + "default": true + } + } } diff --git a/packages/block-library/src/post-excerpt/edit.js b/packages/block-library/src/post-excerpt/edit.js index 7bbeff3a97900..65d1bfc4d6939 100644 --- a/packages/block-library/src/post-excerpt/edit.js +++ b/packages/block-library/src/post-excerpt/edit.js @@ -2,20 +2,96 @@ * WordPress dependencies */ import { useEntityProp, useEntityId } from '@wordpress/core-data'; -import { PlainText } from '@wordpress/block-editor'; +import { useMemo } from '@wordpress/element'; +import { InspectorControls, RichText } from '@wordpress/block-editor'; +import { PanelBody, RangeControl, ToggleControl } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; -function PostExcerptDisplay() { - const [ excerpt, setExcerpt ] = useEntityProp( +function usePostContentExcerpt( excerptLength ) { + const [ , , { raw: rawPostContent } ] = useEntityProp( 'postType', 'post', - 'excerpt' + 'content' ); - return ; + return useMemo( () => { + if ( ! rawPostContent ) { + return ''; + } + const excerptElement = document.createElement( 'div' ); + excerptElement.innerHTML = rawPostContent; + const excerpt = + excerptElement.textContent || excerptElement.innerText || ''; + return excerpt + .trim() + .split( ' ', excerptLength ) + .join( ' ' ); + }, [ rawPostContent, excerptLength ] ); } -export default function PostExcerptEdit() { +function PostExcerptEditor( { + attributes: { excerptLength, moreText, showMoreOnNewLine }, + setAttributes, + isSelected, +} ) { + const [ excerpt, setExcerpt ] = useEntityProp( 'postType', 'post', 'excerpt' ); + const postContentExcerpt = usePostContentExcerpt( excerptLength ); + return ( + <> + <InspectorControls> + <PanelBody title={ __( 'Post Excerpt Settings' ) }> + { ! excerpt && ( + <RangeControl + label={ __( 'Max words' ) } + value={ excerptLength } + onChange={ ( newExcerptLength ) => + setAttributes( { excerptLength: newExcerptLength } ) + } + min={ 10 } + max={ 100 } + /> + ) } + <ToggleControl + label={ __( 'Show link on new line' ) } + checked={ showMoreOnNewLine } + onChange={ ( newShowMoreOnNewLine ) => + setAttributes( { showMoreOnNewLine: newShowMoreOnNewLine } ) + } + /> + </PanelBody> + </InspectorControls> + <RichText + className={ + ! showMoreOnNewLine && 'wp-block-post-excerpt__excerpt is-inline' + } + placeholder={ postContentExcerpt } + value={ excerpt || ( isSelected ? '' : postContentExcerpt ) } + onChange={ setExcerpt } + keepPlaceholderOnFocus + /> + { ! showMoreOnNewLine && ' ' } + <RichText + tagName="a" + placeholder={ __( 'Read more…' ) } + value={ moreText } + onChange={ ( newMoreText ) => setAttributes( { moreText: newMoreText } ) } + /> + </> + ); +} + +export default function PostExcerptEdit( { + attributes, + setAttributes, + isSelected, +} ) { if ( ! useEntityId( 'postType', 'post' ) ) { return 'Post Excerpt Placeholder'; } - return <PostExcerptDisplay />; + return ( + <PostExcerptEditor + attributes={ attributes } + setAttributes={ setAttributes } + isSelected={ isSelected } + /> + ); } diff --git a/packages/block-library/src/post-excerpt/editor.scss b/packages/block-library/src/post-excerpt/editor.scss new file mode 100644 index 0000000000000..8d36110746aef --- /dev/null +++ b/packages/block-library/src/post-excerpt/editor.scss @@ -0,0 +1,3 @@ +.wp-block-post-excerpt__excerpt.is-inline { + display: inline-block; +} diff --git a/packages/block-library/src/post-excerpt/index.php b/packages/block-library/src/post-excerpt/index.php index 06d1b9726468f..f23e6cfe479ce 100644 --- a/packages/block-library/src/post-excerpt/index.php +++ b/packages/block-library/src/post-excerpt/index.php @@ -8,14 +8,39 @@ /** * Renders the `core/post-excerpt` block on the server. * + * @param array $attributes The block attributes. + * * @return string Returns the filtered post excerpt for the current post wrapped inside "p" tags. */ -function render_block_core_post_excerpt() { +function render_block_core_post_excerpt( $attributes ) { $post = gutenberg_get_post_from_context(); if ( ! $post ) { return ''; } - return '<p>' . get_the_excerpt( $post ) . '</p>'; + + $more_text = isset( $attributes['moreText'] ) ? '<a href="' . esc_url( get_the_permalink( $post ) ) . '">' . $attributes['moreText'] . '</a>' : ''; + + $filter_excerpt_length = function() use ( $attributes ) { + return isset( $attributes['excerptLength'] ) ? $attributes['excerptLength'] : 55; + }; + add_filter( + 'excerpt_length', + $filter_excerpt_length + ); + + $output = '<p>' . get_the_excerpt( $post ); + if ( ! isset( $attributes['showMoreOnNewLine'] ) || $attributes['showMoreOnNewLine'] ) { + $output .= '</p>' . '<p>' . $more_text . '</p>'; + } else { + $output .= ' ' . $more_text . '</p>'; + } + + remove_filter( + 'excerpt_length', + $filter_excerpt_length + ); + + return $output; } /** @@ -25,6 +50,19 @@ function register_block_core_post_excerpt() { register_block_type( 'core/post-excerpt', array( + 'attributes' => array( + 'excerptLength' => array( + 'type' => 'number', + 'default' => 55, + ), + 'moreText' => array( + 'type' => 'string', + ), + 'showMoreOnNewLine' => array( + 'type' => 'boolean', + 'default' => true, + ), + ), 'render_callback' => 'render_block_core_post_excerpt', ) ); From 2aef54ff424d3757bda4864e60a2374e385972f9 Mon Sep 17 00:00:00 2001 From: epiqueras <epiquerass@gmail.com> Date: Mon, 20 Jan 2020 13:59:18 -0500 Subject: [PATCH 4/6] E2E Tests: Update Post Excerpt block fixtures. --- .../fixtures/blocks/core__post-excerpt.json | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/packages/e2e-tests/fixtures/blocks/core__post-excerpt.json b/packages/e2e-tests/fixtures/blocks/core__post-excerpt.json index 67bee1bd83f27..63d53344f1c17 100644 --- a/packages/e2e-tests/fixtures/blocks/core__post-excerpt.json +++ b/packages/e2e-tests/fixtures/blocks/core__post-excerpt.json @@ -1,10 +1,13 @@ [ - { - "clientId": "_clientId_0", - "name": "core/post-excerpt", - "isValid": true, - "attributes": {}, - "innerBlocks": [], - "originalContent": "" - } + { + "clientId": "_clientId_0", + "name": "core/post-excerpt", + "isValid": true, + "attributes": { + "excerptLength": 55, + "showMoreOnNewLine": true + }, + "innerBlocks": [], + "originalContent": "" + } ] From 99ce46993a2d693acf76ac57760c782f16a0b101 Mon Sep 17 00:00:00 2001 From: epiqueras <epiquerass@gmail.com> Date: Tue, 18 Feb 2020 05:16:50 -0800 Subject: [PATCH 5/6] Block Library: Change Post Excerpt block `excerptLength` to `wordCount`. --- .../block-library/src/post-excerpt/block.json | 2 +- .../block-library/src/post-excerpt/edit.js | 54 +++++++++++++------ .../block-library/src/post-excerpt/index.php | 4 +- packages/core-data/src/entity-provider.js | 5 +- 4 files changed, 45 insertions(+), 20 deletions(-) diff --git a/packages/block-library/src/post-excerpt/block.json b/packages/block-library/src/post-excerpt/block.json index 6ef5e21bc55b7..24a74217c547a 100644 --- a/packages/block-library/src/post-excerpt/block.json +++ b/packages/block-library/src/post-excerpt/block.json @@ -2,7 +2,7 @@ "name": "core/post-excerpt", "category": "layout", "attributes": { - "excerptLength": { + "wordCount": { "type": "number", "default": 55 }, diff --git a/packages/block-library/src/post-excerpt/edit.js b/packages/block-library/src/post-excerpt/edit.js index 65d1bfc4d6939..7b4ee53704f37 100644 --- a/packages/block-library/src/post-excerpt/edit.js +++ b/packages/block-library/src/post-excerpt/edit.js @@ -7,7 +7,7 @@ import { InspectorControls, RichText } from '@wordpress/block-editor'; import { PanelBody, RangeControl, ToggleControl } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; -function usePostContentExcerpt( excerptLength ) { +function usePostContentExcerpt( wordCount ) { const [ , , { raw: rawPostContent } ] = useEntityProp( 'postType', 'post', @@ -23,18 +23,22 @@ function usePostContentExcerpt( excerptLength ) { excerptElement.textContent || excerptElement.innerText || ''; return excerpt .trim() - .split( ' ', excerptLength ) + .split( ' ', wordCount ) .join( ' ' ); - }, [ rawPostContent, excerptLength ] ); + }, [ rawPostContent, wordCount ] ); } function PostExcerptEditor( { - attributes: { excerptLength, moreText, showMoreOnNewLine }, + attributes: { wordCount, moreText, showMoreOnNewLine }, setAttributes, isSelected, } ) { - const [ excerpt, setExcerpt ] = useEntityProp( 'postType', 'post', 'excerpt' ); - const postContentExcerpt = usePostContentExcerpt( excerptLength ); + const [ excerpt, setExcerpt ] = useEntityProp( + 'postType', + 'post', + 'excerpt' + ); + const postContentExcerpt = usePostContentExcerpt( wordCount ); return ( <> <InspectorControls> @@ -42,9 +46,9 @@ function PostExcerptEditor( { { ! excerpt && ( <RangeControl label={ __( 'Max words' ) } - value={ excerptLength } + value={ wordCount } onChange={ ( newExcerptLength ) => - setAttributes( { excerptLength: newExcerptLength } ) + setAttributes( { wordCount: newExcerptLength } ) } min={ 10 } max={ 100 } @@ -54,14 +58,17 @@ function PostExcerptEditor( { label={ __( 'Show link on new line' ) } checked={ showMoreOnNewLine } onChange={ ( newShowMoreOnNewLine ) => - setAttributes( { showMoreOnNewLine: newShowMoreOnNewLine } ) + setAttributes( { + showMoreOnNewLine: newShowMoreOnNewLine, + } ) } /> </PanelBody> </InspectorControls> <RichText className={ - ! showMoreOnNewLine && 'wp-block-post-excerpt__excerpt is-inline' + ! showMoreOnNewLine && + 'wp-block-post-excerpt__excerpt is-inline' } placeholder={ postContentExcerpt } value={ excerpt || ( isSelected ? '' : postContentExcerpt ) } @@ -69,12 +76,27 @@ function PostExcerptEditor( { keepPlaceholderOnFocus /> { ! showMoreOnNewLine && ' ' } - <RichText - tagName="a" - placeholder={ __( 'Read more…' ) } - value={ moreText } - onChange={ ( newMoreText ) => setAttributes( { moreText: newMoreText } ) } - /> + { showMoreOnNewLine ? ( + <p> + <RichText + tagName="a" + placeholder={ __( 'Read more…' ) } + value={ moreText } + onChange={ ( newMoreText ) => + setAttributes( { moreText: newMoreText } ) + } + /> + </p> + ) : ( + <RichText + tagName="a" + placeholder={ __( 'Read more…' ) } + value={ moreText } + onChange={ ( newMoreText ) => + setAttributes( { moreText: newMoreText } ) + } + /> + ) } </> ); } diff --git a/packages/block-library/src/post-excerpt/index.php b/packages/block-library/src/post-excerpt/index.php index f23e6cfe479ce..5bb2c205cd197 100644 --- a/packages/block-library/src/post-excerpt/index.php +++ b/packages/block-library/src/post-excerpt/index.php @@ -21,7 +21,7 @@ function render_block_core_post_excerpt( $attributes ) { $more_text = isset( $attributes['moreText'] ) ? '<a href="' . esc_url( get_the_permalink( $post ) ) . '">' . $attributes['moreText'] . '</a>' : ''; $filter_excerpt_length = function() use ( $attributes ) { - return isset( $attributes['excerptLength'] ) ? $attributes['excerptLength'] : 55; + return isset( $attributes['wordCount'] ) ? $attributes['wordCount'] : 55; }; add_filter( 'excerpt_length', @@ -51,7 +51,7 @@ function register_block_core_post_excerpt() { 'core/post-excerpt', array( 'attributes' => array( - 'excerptLength' => array( + 'wordCount' => array( 'type' => 'number', 'default' => 55, ), diff --git a/packages/core-data/src/entity-provider.js b/packages/core-data/src/entity-provider.js index 14d495426a8c2..3a73e5a79c280 100644 --- a/packages/core-data/src/entity-provider.js +++ b/packages/core-data/src/entity-provider.js @@ -92,7 +92,10 @@ export function useEntityProp( kind, type, prop ) { const editedEntity = getEditedEntityRecord( kind, type, id ); return ( entity && - editedEntity && { value: editedEntity[ prop ], fullValue: entity[ prop ] } + editedEntity && { + value: editedEntity[ prop ], + fullValue: entity[ prop ], + } ); }, [ kind, type, id, prop ] From ece6591e4a88c014aec906858f6ef4622186c16e Mon Sep 17 00:00:00 2001 From: Enrique Piqueras <epiqueras@users.noreply.github.com> Date: Tue, 18 Feb 2020 07:00:07 -0800 Subject: [PATCH 6/6] Delete single.html --- lib/demo-block-templates/single.html | 2 -- .../block-library/src/post-excerpt/index.php | 2 +- .../fixtures/blocks/core__post-excerpt.json | 22 +++++++++---------- .../full-content/server-registered.json | 2 +- 4 files changed, 13 insertions(+), 15 deletions(-) delete mode 100644 lib/demo-block-templates/single.html diff --git a/lib/demo-block-templates/single.html b/lib/demo-block-templates/single.html deleted file mode 100644 index 477e98d7bf845..0000000000000 --- a/lib/demo-block-templates/single.html +++ /dev/null @@ -1,2 +0,0 @@ -<!-- wp:post-title /--> -<!-- wp:post-content /--> diff --git a/packages/block-library/src/post-excerpt/index.php b/packages/block-library/src/post-excerpt/index.php index 5bb2c205cd197..c3f1755d0422f 100644 --- a/packages/block-library/src/post-excerpt/index.php +++ b/packages/block-library/src/post-excerpt/index.php @@ -51,7 +51,7 @@ function register_block_core_post_excerpt() { 'core/post-excerpt', array( 'attributes' => array( - 'wordCount' => array( + 'wordCount' => array( 'type' => 'number', 'default' => 55, ), diff --git a/packages/e2e-tests/fixtures/blocks/core__post-excerpt.json b/packages/e2e-tests/fixtures/blocks/core__post-excerpt.json index 63d53344f1c17..44a38831ec996 100644 --- a/packages/e2e-tests/fixtures/blocks/core__post-excerpt.json +++ b/packages/e2e-tests/fixtures/blocks/core__post-excerpt.json @@ -1,13 +1,13 @@ [ - { - "clientId": "_clientId_0", - "name": "core/post-excerpt", - "isValid": true, - "attributes": { - "excerptLength": 55, - "showMoreOnNewLine": true - }, - "innerBlocks": [], - "originalContent": "" - } + { + "clientId": "_clientId_0", + "name": "core/post-excerpt", + "isValid": true, + "attributes": { + "wordCount": 55, + "showMoreOnNewLine": true + }, + "innerBlocks": [], + "originalContent": "" + } ] diff --git a/test/integration/full-content/server-registered.json b/test/integration/full-content/server-registered.json index 3fae2b82a0e4e..9551491707847 100644 --- a/test/integration/full-content/server-registered.json +++ b/test/integration/full-content/server-registered.json @@ -1 +1 @@ -{"core\/archives":{"attributes":{"align":{"type":"string","enum":["left","center","right","wide","full"]},"className":{"type":"string"},"displayAsDropdown":{"type":"boolean","default":false},"showPostCounts":{"type":"boolean","default":false}}},"core\/block":{"attributes":{"ref":{"type":"number"}}},"core\/calendar":{"attributes":{"align":{"type":"string","enum":["left","center","right","wide","full"]},"className":{"type":"string"},"month":{"type":"integer"},"year":{"type":"integer"}}},"core\/categories":{"attributes":{"align":{"type":"string","enum":["left","center","right","wide","full"]},"className":{"type":"string"},"displayAsDropdown":{"type":"boolean","default":false},"showHierarchy":{"type":"boolean","default":false},"showPostCounts":{"type":"boolean","default":false}}},"core\/latest-comments":{"attributes":{"align":{"type":"string","enum":["left","center","right","wide","full"]},"className":{"type":"string"},"commentsToShow":{"type":"number","default":5,"minimum":1,"maximum":100},"displayAvatar":{"type":"boolean","default":true},"displayDate":{"type":"boolean","default":true},"displayExcerpt":{"type":"boolean","default":true}}},"core\/latest-posts":{"attributes":{"align":{"type":"string","enum":["left","center","right","wide","full"]},"className":{"type":"string"},"categories":{"type":"string"},"postsToShow":{"type":"number","default":5},"displayPostContent":{"type":"boolean","default":false},"displayPostContentRadio":{"type":"string","default":"excerpt"},"excerptLength":{"type":"number","default":55},"displayPostDate":{"type":"boolean","default":false},"postLayout":{"type":"string","default":"list"},"columns":{"type":"number","default":3},"order":{"type":"string","default":"desc"},"orderBy":{"type":"string","default":"date"},"displayFeaturedImage":{"type":"boolean","default":false},"featuredImageAlign":{"type":"string","enum":["left","center","right"]},"featuredImageSizeSlug":{"type":"string","default":"thumbnail"},"featuredImageSizeWidth":{"type":"number","default":null},"featuredImageSizeHeight":{"type":"number","default":null}}},"core\/legacy-widget":{"attributes":{"widgetClass":{"type":"string"},"id":{"type":"string"},"idBase":{"type":"string"},"number":{"type":"number"},"instance":{"type":"object"}}},"core\/navigation":{"attributes":{"className":{"type":"string"},"textColor":{"type":"string"},"customTextColor":{"type":"string"},"rgbTextColor":{"type":"string"},"backgroundColor":{"type":"string"},"customBackgroundColor":{"type":"string"},"rgbBackgroundColor":{"type":"string"},"fontSize":{"type":"string"},"customFontSize":{"type":"number"},"itemsJustification":{"type":"string"},"showSubmenuIcon":{"type":"boolean","default":true}}},"core\/post-comments-count":{"attributes":{"className":{"type":"string"}}},"core\/rss":{"attributes":{"align":{"type":"string","enum":["left","center","right","wide","full"]},"className":{"type":"string"},"columns":{"type":"number","default":2},"blockLayout":{"type":"string","default":"list"},"feedURL":{"type":"string","default":""},"itemsToShow":{"type":"number","default":5},"displayExcerpt":{"type":"boolean","default":false},"displayAuthor":{"type":"boolean","default":false},"displayDate":{"type":"boolean","default":false},"excerptLength":{"type":"number","default":55}}},"core\/search":{"attributes":{"align":{"type":"string","enum":["left","center","right","wide","full"]},"className":{"type":"string"},"label":{"type":"string","default":"Search"},"placeholder":{"type":"string","default":""},"buttonText":{"type":"string","default":"Search"}}},"core\/tag-cloud":{"attributes":{"align":{"type":"string","enum":["left","center","right","wide","full"]},"className":{"type":"string"},"taxonomy":{"type":"string","default":"post_tag"},"showTagCounts":{"type":"boolean","default":false}}},"core\/template-part":{"attributes":{"postId":{"type":"number"},"slug":{"type":"string"},"theme":{"type":"string"}}}} +{"core\/archives":{"attributes":{"align":{"type":"string","enum":["left","center","right","wide","full"]},"className":{"type":"string"},"displayAsDropdown":{"type":"boolean","default":false},"showPostCounts":{"type":"boolean","default":false}}},"core\/block":{"attributes":{"ref":{"type":"number"}}},"core\/calendar":{"attributes":{"align":{"type":"string","enum":["left","center","right","wide","full"]},"className":{"type":"string"},"month":{"type":"integer"},"year":{"type":"integer"}}},"core\/categories":{"attributes":{"align":{"type":"string","enum":["left","center","right","wide","full"]},"className":{"type":"string"},"displayAsDropdown":{"type":"boolean","default":false},"showHierarchy":{"type":"boolean","default":false},"showPostCounts":{"type":"boolean","default":false}}},"core\/latest-comments":{"attributes":{"align":{"type":"string","enum":["left","center","right","wide","full"]},"className":{"type":"string"},"commentsToShow":{"type":"number","default":5,"minimum":1,"maximum":100},"displayAvatar":{"type":"boolean","default":true},"displayDate":{"type":"boolean","default":true},"displayExcerpt":{"type":"boolean","default":true}}},"core\/latest-posts":{"attributes":{"align":{"type":"string","enum":["left","center","right","wide","full"]},"className":{"type":"string"},"categories":{"type":"string"},"postsToShow":{"type":"number","default":5},"displayPostContent":{"type":"boolean","default":false},"displayPostContentRadio":{"type":"string","default":"excerpt"},"excerptLength":{"type":"number","default":55},"displayPostDate":{"type":"boolean","default":false},"postLayout":{"type":"string","default":"list"},"columns":{"type":"number","default":3},"order":{"type":"string","default":"desc"},"orderBy":{"type":"string","default":"date"},"displayFeaturedImage":{"type":"boolean","default":false},"featuredImageAlign":{"type":"string","enum":["left","center","right"]},"featuredImageSizeSlug":{"type":"string","default":"thumbnail"},"featuredImageSizeWidth":{"type":"number","default":null},"featuredImageSizeHeight":{"type":"number","default":null}}},"core\/legacy-widget":{"attributes":{"widgetClass":{"type":"string"},"id":{"type":"string"},"idBase":{"type":"string"},"number":{"type":"number"},"instance":{"type":"object"}}},"core\/navigation":{"attributes":{"className":{"type":"string"},"textColor":{"type":"string"},"customTextColor":{"type":"string"},"rgbTextColor":{"type":"string"},"backgroundColor":{"type":"string"},"customBackgroundColor":{"type":"string"},"rgbBackgroundColor":{"type":"string"},"fontSize":{"type":"string"},"customFontSize":{"type":"number"},"itemsJustification":{"type":"string"},"showSubmenuIcon":{"type":"boolean","default":true}}},"core\/post-comments-count":{"attributes":{"className":{"type":"string"}}},"core\/post-excerpt":{"attributes":{"wordCount":{"type":"number","default":55},"moreText":{"type":"string"},"showMoreOnNewLine":{"type":"boolean","default":true}}},"core\/rss":{"attributes":{"align":{"type":"string","enum":["left","center","right","wide","full"]},"className":{"type":"string"},"columns":{"type":"number","default":2},"blockLayout":{"type":"string","default":"list"},"feedURL":{"type":"string","default":""},"itemsToShow":{"type":"number","default":5},"displayExcerpt":{"type":"boolean","default":false},"displayAuthor":{"type":"boolean","default":false},"displayDate":{"type":"boolean","default":false},"excerptLength":{"type":"number","default":55}}},"core\/search":{"attributes":{"align":{"type":"string","enum":["left","center","right","wide","full"]},"className":{"type":"string"},"label":{"type":"string","default":"Search"},"placeholder":{"type":"string","default":""},"buttonText":{"type":"string","default":"Search"}}},"core\/tag-cloud":{"attributes":{"align":{"type":"string","enum":["left","center","right","wide","full"]},"className":{"type":"string"},"taxonomy":{"type":"string","default":"post_tag"},"showTagCounts":{"type":"boolean","default":false}}},"core\/template-part":{"attributes":{"postId":{"type":"number"},"slug":{"type":"string"},"theme":{"type":"string"}}}}