From 4c8f8ab0db4d24a94df23c5dbcb6c66b4c17226d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20T=C3=B6nsing?= Date: Wed, 24 Jun 2026 22:36:02 +0200 Subject: [PATCH 1/2] Fix HTML API notices --- build/block.json | 2 +- build/index.asset.php | 2 +- build/index.js | 2 +- changelog.txt | 3 +++ package-lock.json | 4 +-- package.json | 2 +- plugin.php | 54 +++++++++++++++++++++++++++++----------- readme.txt | 12 +++------ src/block.json | 2 +- tests/test-simpletoc.php | 11 ++++++++ 10 files changed, 64 insertions(+), 30 deletions(-) diff --git a/build/block.json b/build/block.json index a467744..3a51dce 100644 --- a/build/block.json +++ b/build/block.json @@ -2,7 +2,7 @@ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "simpletoc/toc", - "version": "7.1.0", + "version": "7.2.0", "title": "SimpleTOC", "category": "layout", "icon": "", diff --git a/build/index.asset.php b/build/index.asset.php index e30b3cf..4999b5d 100644 --- a/build/index.asset.php +++ b/build/index.asset.php @@ -1 +1 @@ - array('wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-editor', 'wp-element', 'wp-i18n', 'wp-server-side-render'), 'version' => '8ec3bdb72d0c6301fa9c'); + array('wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-editor', 'wp-element', 'wp-i18n', 'wp-server-side-render'), 'version' => '1512672d04ad478e8e8e'); diff --git a/build/index.js b/build/index.js index ecdc874..4abcc42 100644 --- a/build/index.js +++ b/build/index.js @@ -1 +1 @@ -(()=>{"use strict";var e,t={197(e,t,l){const n=window.wp.blocks,o=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":3,"name":"simpletoc/toc","version":"7.1.0","title":"SimpleTOC","category":"layout","icon":"","keywords":["TOC","Table of Contents","SimpleTOC","Index"],"supports":{"align":["wide","full"]},"description":"Adds a Table of Contents.","attributes":{"no_title":{"type":"boolean","default":false},"title_level":{"type":"integer","default":2},"title_text":{"type":"string"},"use_ol":{"type":"boolean","default":false},"remove_indent":{"type":"boolean","default":false},"add_smooth":{"type":"boolean","default":false},"use_absolute_urls":{"type":"boolean","default":false},"max_level":{"type":"integer","default":6},"min_level":{"type":"integer","default":1},"updated":{"type":"integer"},"accordion":{"type":"boolean","default":false},"hidden":{"type":"boolean","default":false},"wrapper":{"type":"boolean","default":false},"box_style":{"type":"boolean","default":false},"box_color":{"type":"string"},"autoupdate":{"type":"boolean","default":true},"hideTOC":{"type":"boolean","default":false,"role":"local"},"sidebar_style":{"type":"boolean","default":false,"role":"local"}},"textdomain":"simpletoc","editorScript":"file:./index.js","style":"file:./style-index.css","editorStyle":"file:./index.css"}');function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var l=0,n=Array(t);l tag).","simpletoc"),value:"hidden"},{label:(0,c.__)("Hide in accordion menu. Adds minimal JS and CSS.","simpletoc"),value:"accordion"}],onChange:function(e){n({hidden:"hidden"===e,accordion:"accordion"===e})}}))),wp.element.createElement(p.PanelRow,null,wp.element.createElement(p.ToggleControl,{label:(0,c.__)("Smooth scrolling support","simpletoc"),help:(0,c.__)('Adds the following CSS to the HTML element: "scroll-behavior: smooth;"',"simpletoc"),checked:l.add_smooth,onChange:function(){return n({add_smooth:!l.add_smooth})}})),wp.element.createElement(p.PanelRow,null,wp.element.createElement(p.ToggleControl,{label:(0,c.__)("Use absolute urls","simpletoc"),help:(0,c.__)("Adds the permalink url to the fragment.","simpletoc"),checked:l.use_absolute_urls,onChange:function(){return n({use_absolute_urls:!l.use_absolute_urls})}})),wp.element.createElement(p.PanelRow,null,wp.element.createElement(p.ToggleControl,{label:(0,c.__)("Box style","simpletoc"),help:(0,c.__)("Adds box spacing and title styling. Enables the wrapper markup automatically.","simpletoc"),checked:l.box_style,onChange:function(){return n({box_style:!l.box_style,box_color:l.box_style||l.box_color?l.box_color:"#ebebeb"})}})),l.box_style&&C.length>0&&wp.element.createElement(p.PanelRow,null,wp.element.createElement(p.BaseControl,{id:"simpletoc-box-color",label:(0,c.__)("Box color","simpletoc"),help:(0,c.__)("Uses the active editor color palette.","simpletoc")},wp.element.createElement(p.ColorPalette,{colors:C,value:x,onChange:function(e){return n({box_color:e||""})},clearable:!1}))),wp.element.createElement(p.PanelRow,null,wp.element.createElement(p.ToggleControl,{label:(0,c.__)("Wrapper div","simpletoc"),help:l.box_style?(0,c.__)("Enabled automatically while box style is active.","simpletoc"):(0,c.__)('Additionally adds the role "navigation" and ARIA attributes.',"simpletoc"),checked:S,disabled:l.box_style,onChange:function(){return n({wrapper:!l.wrapper})}})),wp.element.createElement(p.PanelRow,null,wp.element.createElement(p.ToggleControl,{label:(0,c.__)("Automatic refresh","simpletoc"),help:(0,c.__)("Automatic updating of the table of contents.","simpletoc"),checked:l.autoupdate,onChange:function(){return n({autoupdate:!l.autoupdate})}})),k&&wp.element.createElement(p.PanelRow,null,wp.element.createElement(p.BaseControl,{id:"simpletoc-global-settings-link",help:(0,c.__)("Global SimpleTOC settings can enforce these options for all blocks.","simpletoc")},wp.element.createElement(p.ExternalLink,{href:k},(0,c.__)("Open global SimpleTOC settings","simpletoc")))))));return wp.element.createElement("div",h,V,B,wp.element.createElement(d(),{block:"simpletoc/toc",attributes:m,LoadingResponsePlaceholder:E,urlQueryArgs:{simpletoc_refresh:P}}))},save:function(){return null}})}},l={};function n(e){var o=l[e];if(void 0!==o)return o.exports;var r=l[e]={exports:{}};return t[e](r,r.exports,n),r.exports}n.m=t,e=[],n.O=(t,l,o,r)=>{if(!l){var i=1/0;for(u=0;u=r)&&Object.keys(n.O).every(e=>n.O[e](l[c]))?l.splice(c--,1):(a=!1,r0&&e[u-1][2]>r;u--)e[u]=e[u-1];e[u]=[l,o,r]},n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var l in t)n.o(t,l)&&!n.o(e,l)&&Object.defineProperty(e,l,{enumerable:!0,get:t[l]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={57:0,350:0};n.O.j=t=>0===e[t];var t=(t,l)=>{var o,r,[i,a,c]=l,s=0;if(i.some(t=>0!==e[t])){for(o in a)n.o(a,o)&&(n.m[o]=a[o]);if(c)var u=c(n)}for(t&&t(l);sn(197));o=n.O(o)})(); \ No newline at end of file +(()=>{"use strict";var e,t={197(e,t,l){const n=window.wp.blocks,o=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":3,"name":"simpletoc/toc","version":"7.2.0","title":"SimpleTOC","category":"layout","icon":"","keywords":["TOC","Table of Contents","SimpleTOC","Index"],"supports":{"align":["wide","full"]},"description":"Adds a Table of Contents.","attributes":{"no_title":{"type":"boolean","default":false},"title_level":{"type":"integer","default":2},"title_text":{"type":"string"},"use_ol":{"type":"boolean","default":false},"remove_indent":{"type":"boolean","default":false},"add_smooth":{"type":"boolean","default":false},"use_absolute_urls":{"type":"boolean","default":false},"max_level":{"type":"integer","default":6},"min_level":{"type":"integer","default":1},"updated":{"type":"integer"},"accordion":{"type":"boolean","default":false},"hidden":{"type":"boolean","default":false},"wrapper":{"type":"boolean","default":false},"box_style":{"type":"boolean","default":false},"box_color":{"type":"string"},"autoupdate":{"type":"boolean","default":true},"hideTOC":{"type":"boolean","default":false,"role":"local"},"sidebar_style":{"type":"boolean","default":false,"role":"local"}},"textdomain":"simpletoc","editorScript":"file:./index.js","style":"file:./style-index.css","editorStyle":"file:./index.css"}');function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var l=0,n=Array(t);l tag).","simpletoc"),value:"hidden"},{label:(0,c.__)("Hide in accordion menu. Adds minimal JS and CSS.","simpletoc"),value:"accordion"}],onChange:function(e){n({hidden:"hidden"===e,accordion:"accordion"===e})}}))),wp.element.createElement(p.PanelRow,null,wp.element.createElement(p.ToggleControl,{label:(0,c.__)("Smooth scrolling support","simpletoc"),help:(0,c.__)('Adds the following CSS to the HTML element: "scroll-behavior: smooth;"',"simpletoc"),checked:l.add_smooth,onChange:function(){return n({add_smooth:!l.add_smooth})}})),wp.element.createElement(p.PanelRow,null,wp.element.createElement(p.ToggleControl,{label:(0,c.__)("Use absolute urls","simpletoc"),help:(0,c.__)("Adds the permalink url to the fragment.","simpletoc"),checked:l.use_absolute_urls,onChange:function(){return n({use_absolute_urls:!l.use_absolute_urls})}})),wp.element.createElement(p.PanelRow,null,wp.element.createElement(p.ToggleControl,{label:(0,c.__)("Box style","simpletoc"),help:(0,c.__)("Adds box spacing and title styling. Enables the wrapper markup automatically.","simpletoc"),checked:l.box_style,onChange:function(){return n({box_style:!l.box_style,box_color:l.box_style||l.box_color?l.box_color:"#ebebeb"})}})),l.box_style&&C.length>0&&wp.element.createElement(p.PanelRow,null,wp.element.createElement(p.BaseControl,{id:"simpletoc-box-color",label:(0,c.__)("Box color","simpletoc"),help:(0,c.__)("Uses the active editor color palette.","simpletoc")},wp.element.createElement(p.ColorPalette,{colors:C,value:x,onChange:function(e){return n({box_color:e||""})},clearable:!1}))),wp.element.createElement(p.PanelRow,null,wp.element.createElement(p.ToggleControl,{label:(0,c.__)("Wrapper div","simpletoc"),help:l.box_style?(0,c.__)("Enabled automatically while box style is active.","simpletoc"):(0,c.__)('Additionally adds the role "navigation" and ARIA attributes.',"simpletoc"),checked:S,disabled:l.box_style,onChange:function(){return n({wrapper:!l.wrapper})}})),wp.element.createElement(p.PanelRow,null,wp.element.createElement(p.ToggleControl,{label:(0,c.__)("Automatic refresh","simpletoc"),help:(0,c.__)("Automatic updating of the table of contents.","simpletoc"),checked:l.autoupdate,onChange:function(){return n({autoupdate:!l.autoupdate})}})),k&&wp.element.createElement(p.PanelRow,null,wp.element.createElement(p.BaseControl,{id:"simpletoc-global-settings-link",help:(0,c.__)("Global SimpleTOC settings can enforce these options for all blocks.","simpletoc")},wp.element.createElement(p.ExternalLink,{href:k},(0,c.__)("Open global SimpleTOC settings","simpletoc")))))));return wp.element.createElement("div",h,V,B,wp.element.createElement(d(),{block:"simpletoc/toc",attributes:m,LoadingResponsePlaceholder:E,urlQueryArgs:{simpletoc_refresh:P}}))},save:function(){return null}})}},l={};function n(e){var o=l[e];if(void 0!==o)return o.exports;var r=l[e]={exports:{}};return t[e](r,r.exports,n),r.exports}n.m=t,e=[],n.O=(t,l,o,r)=>{if(!l){var i=1/0;for(u=0;u=r)&&Object.keys(n.O).every(e=>n.O[e](l[c]))?l.splice(c--,1):(a=!1,r0&&e[u-1][2]>r;u--)e[u]=e[u-1];e[u]=[l,o,r]},n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var l in t)n.o(t,l)&&!n.o(e,l)&&Object.defineProperty(e,l,{enumerable:!0,get:t[l]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={57:0,350:0};n.O.j=t=>0===e[t];var t=(t,l)=>{var o,r,[i,a,c]=l,s=0;if(i.some(t=>0!==e[t])){for(o in a)n.o(a,o)&&(n.m[o]=a[o]);if(c)var u=c(n)}for(t&&t(l);sn(197));o=n.O(o)})(); \ No newline at end of file diff --git a/changelog.txt b/changelog.txt index dbb36c6..4576bbb 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,8 @@ == Changelog == += 7.2.0 = +* Fixed: Prevented WordPress HTML API notices when nested block content is not a string. + = 7.1.0 = * Fixed: Avoid DOMDocument HTML parsing for highlighted heading markup by using the WordPress HTML API. * Changed: Minimum required WordPress version is now 6.2. diff --git a/package-lock.json b/package-lock.json index 4d42ef4..ead2829 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "simpletoc", - "version": "7.1.0", + "version": "7.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "simpletoc", - "version": "7.1.0", + "version": "7.2.0", "license": "GPL-2.0-or-later", "dependencies": { "@wordpress/element": "^6.46.0", diff --git a/package.json b/package.json index 4fe96f3..ab9f969 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "simpletoc", - "version": "7.1.0", + "version": "7.2.0", "author": "Marc Tönsing", "description": "SEO-friendly Table of Contents Gutenberg block. No JavaScript or CSS by default.", "main": "build/index.js", diff --git a/plugin.php b/plugin.php index 5932b7e..6823e5c 100644 --- a/plugin.php +++ b/plugin.php @@ -3,7 +3,7 @@ * Plugin Name: SimpleTOC - Table of Contents Block * Plugin URI: https://marc.tv/simpletoc-wordpress-inhaltsverzeichnis-plugin-gutenberg/ * Description: SEO-friendly Table of Contents Gutenberg block. No JavaScript or CSS by default. - * Version: 7.1.0 + * Version: 7.2.0 * Requires at least: 6.2 * Requires PHP: 7.3 * Author: Marc Tönsing @@ -21,7 +21,7 @@ require_once __DIR__ . '/simpletoc-class-headline-ids.php'; const DEFAULT_BOX_COLOR = '#ebebeb'; -const SIMPLETOC_VERSION = '7.1.0'; +const SIMPLETOC_VERSION = '7.2.0'; /** * Prevents direct execution of the plugin file. @@ -525,6 +525,23 @@ function simpletoc_load_html_tag_processor() { return class_exists( '\WP_HTML_Tag_Processor' ); } +/** + * Creates an HTML Tag Processor for a valid HTML fragment. + * + * Parsed block content can contain non-string placeholders for nested blocks. + * The WordPress HTML API accepts strings only. + * + * @param mixed $html The HTML fragment to inspect. + * @return \WP_HTML_Tag_Processor|null The processor, or null when unavailable or invalid. + */ +function simpletoc_get_html_tag_processor( $html ) { + if ( ! is_string( $html ) || ! simpletoc_load_html_tag_processor() ) { + return null; + } + + return new \WP_HTML_Tag_Processor( $html ); +} + /** * Returns true when the provided HTML contains a heading tag. * @@ -542,8 +559,9 @@ function simpletoc_is_heading_html( $html ) { * @return int|false The heading depth, or false when no heading was found. */ function simpletoc_get_heading_depth( $html ) { - if ( simpletoc_load_html_tag_processor() ) { - $processor = new \WP_HTML_Tag_Processor( $html ); + $processor = simpletoc_get_html_tag_processor( $html ); + + if ( $processor ) { while ( $processor->next_tag() ) { $tag_name = $processor->get_tag(); @@ -565,8 +583,9 @@ function simpletoc_get_heading_depth( $html ) { * @return string The updated HTML. */ function simpletoc_add_page_number_to_headline( $html, $page_number ) { - if ( simpletoc_load_html_tag_processor() ) { - $processor = new \WP_HTML_Tag_Processor( $html ); + $processor = simpletoc_get_html_tag_processor( $html ); + + if ( $processor ) { while ( $processor->next_tag() ) { if ( ! in_array( $processor->get_tag(), array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ), true ) ) { @@ -589,8 +608,9 @@ function simpletoc_add_page_number_to_headline( $html, $page_number ) { * @return bool True when the class exists. */ function simpletoc_heading_has_class( $html, $class_name ) { - if ( simpletoc_load_html_tag_processor() ) { - $processor = new \WP_HTML_Tag_Processor( $html ); + $processor = simpletoc_get_html_tag_processor( $html ); + + if ( $processor ) { while ( $processor->next_tag() ) { if ( ! in_array( $processor->get_tag(), array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ), true ) ) { @@ -619,6 +639,9 @@ function simpletoc_heading_has_class( $html, $class_name ) { * @return string The modified HTML content with ID attributes added to the Heading tags */ function add_anchor_attribute( $html, $headline_class_instance = null, $block = array() ) { + if ( ! is_string( $html ) ) { + return $html; + } // remove non-breaking space entites from input HTML. $html_wo_nbs = str_replace( ' ', ' ', $html ); @@ -628,8 +651,9 @@ function add_anchor_attribute( $html, $headline_class_instance = null, $block = return $html; } - if ( simpletoc_load_html_tag_processor() ) { - $processor = new \WP_HTML_Tag_Processor( $html_wo_nbs ); + $processor = simpletoc_get_html_tag_processor( $html_wo_nbs ); + + if ( $processor ) { while ( $processor->next_tag() ) { if ( ! in_array( $processor->get_tag(), array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ), true ) ) { @@ -982,8 +1006,9 @@ function add_accordion_end( $html, $attributes ) { * @return string|false Returns the extracted ID value, or false if no ID value is found. */ function extract_id( $headline ) { - if ( simpletoc_load_html_tag_processor() ) { - $processor = new \WP_HTML_Tag_Processor( $headline ); + $processor = simpletoc_get_html_tag_processor( $headline ); + + if ( $processor ) { while ( $processor->next_tag() ) { if ( ! in_array( $processor->get_tag(), array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ), true ) ) { @@ -1008,8 +1033,9 @@ function extract_id( $headline ) { * @return string The page number (in the format "X/") if it exists and is greater than 1, or an empty string otherwise. */ function get_page_number_from_headline( $headline ) { - if ( simpletoc_load_html_tag_processor() ) { - $processor = new \WP_HTML_Tag_Processor( $headline ); + $processor = simpletoc_get_html_tag_processor( $headline ); + + if ( $processor ) { while ( $processor->next_tag() ) { if ( ! in_array( $processor->get_tag(), array( 'H1', 'H2', 'H3', 'H4', 'H5', 'H6' ), true ) ) { diff --git a/readme.txt b/readme.txt index cdfa2af..bce7ec5 100644 --- a/readme.txt +++ b/readme.txt @@ -3,7 +3,7 @@ Contributors: MarcDK Tags: TOC, Table of Contents, Block, Accessibility, Table Requires at least: 6.2 Tested up to: 7.0 -Stable tag: 7.1.0 +Stable tag: 7.2.0 Requires PHP: 7.3 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html @@ -72,14 +72,8 @@ Hidden TOCs use native `
` and `` semantics without extra ARIA SimpleTOC is open-source and developed on [GitHub Pages](https://github.com/mtoensing/SimpleTOC). If you find a bug or have an idea for a feature please feel free to contribute and create a pull request. == Changelog == -= 7.1.0 = -* Fixed: Avoid DOMDocument HTML parsing for highlighted heading markup by using the WordPress HTML API. -* Changed: Minimum required WordPress version is now 6.2. -* Added: PHPUnit coverage for core rendering helpers and an editor e2e smoke test. - -= 7.0.10 = -* Fixed: Prevent the SimpleTOC editor preview from collapsing during WordPress autosaves. -* Changed: Automatic editor refresh now runs after manual post saves and keeps the previous TOC visible while updating. += 7.2.0 = +* Fixed: Prevented WordPress HTML API notices when nested block content is not a string. == Installation == diff --git a/src/block.json b/src/block.json index 95a9ce7..0e7f500 100644 --- a/src/block.json +++ b/src/block.json @@ -2,7 +2,7 @@ "$schema": "https://schemas.wp.org/trunk/block.json", "apiVersion": 3, "name": "simpletoc/toc", - "version": "7.1.0", + "version": "7.2.0", "title": "SimpleTOC", "category": "layout", "icon": "", diff --git a/tests/test-simpletoc.php b/tests/test-simpletoc.php index b1930bd..256771c 100644 --- a/tests/test-simpletoc.php +++ b/tests/test-simpletoc.php @@ -124,6 +124,17 @@ public function test_get_heading_depth_reads_heading_tag_with_html_tag_processor $this->assertSame( 4, $result ); } + /** + * @covers \MToensing\SimpleTOC\simpletoc_get_html_tag_processor + * @covers \MToensing\SimpleTOC\simpletoc_get_heading_depth + */ + public function test_html_tag_processor_ignores_non_string_block_content() { + $this->assertNull( MToensing\SimpleTOC\simpletoc_get_html_tag_processor( null ) ); + $this->assertFalse( MToensing\SimpleTOC\simpletoc_get_heading_depth( null ) ); + $this->assertSame( '', MToensing\SimpleTOC\get_page_number_from_headline( null ) ); + $this->assertFalse( MToensing\SimpleTOC\extract_id( null ) ); + } + /** * @covers \MToensing\SimpleTOC\simpletoc_add_page_number_to_headline */ From e621e4da8160f1a048c94edba22aa0be15d6d21b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 24 Jun 2026 20:36:16 +0000 Subject: [PATCH 2/2] Update README.md from readme.txt --- README.md | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 546df06..fc5f6fa 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ **Tags:** TOC, Table of Contents, Block, Accessibility, Table **Requires at least:** 6.2 **Tested up to:** 7.0 -**Stable tag:** 7.1.0 +**Stable tag:** 7.2.0 **Requires PHP:** 7.3 **License:** GPLv2 or later **License URI:** http://www.gnu.org/licenses/gpl-2.0.html @@ -72,14 +72,8 @@ Hidden TOCs use native `
` and `` semantics without extra ARIA SimpleTOC is open-source and developed on [GitHub Pages](https://github.com/mtoensing/SimpleTOC). If you find a bug or have an idea for a feature please feel free to contribute and create a pull request. ## Changelog ## -### 7.1.0 ### -* Fixed: Avoid DOMDocument HTML parsing for highlighted heading markup by using the WordPress HTML API. -* Changed: Minimum required WordPress version is now 6.2. -* Added: PHPUnit coverage for core rendering helpers and an editor e2e smoke test. - -### 7.0.10 ### -* Fixed: Prevent the SimpleTOC editor preview from collapsing during WordPress autosaves. -* Changed: Automatic editor refresh now runs after manual post saves and keeps the previous TOC visible while updating. +### 7.2.0 ### +* Fixed: Prevented WordPress HTML API notices when nested block content is not a string. ## Installation ##