Markdown Conversion: Remove hard dependency on deprecated library and replace with IMarkdownToHtmlConverter abstraction (closes #21238 and #19500)#21242
Merged
AndyButland merged 5 commits intomainfrom Jan 6, 2026
Conversation
…ementations - Add IMarkdownToHtmlConverter interface in Umbraco.Core.Strings - Add MarkdigMarkdownToHtmlConverter using the Markdig library (new default) - Add HeyRedMarkdownToHtmlConverter using HeyRed.MarkdownSharp (deprecated, for backwards compatibility) - Update HealthChecks.MarkdownToHtmlConverter to use the new abstraction - Update MarkdownEditorValueConverter to use the new abstraction - Add unit tests for both markdown converter implementations - Add unit tests for HealthChecks.MarkdownToHtmlConverter syntax highlighting 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <[email protected]>
IMarkdownToHtmlConverter abstraction
Contributor
There was a problem hiding this comment.
Pull request overview
This PR introduces a new abstraction IMarkdownToHtmlConverter for converting Markdown to HTML, with two implementations: the new recommended MarkdigMarkdownToHtmlConverter using the Markdig library, and the deprecated HeyRedMarkdownToHtmlConverter for backwards compatibility. The existing code is refactored to use dependency injection with the new abstraction, maintaining backwards compatibility through obsolete constructors.
Key Changes
- Added
IMarkdownToHtmlConverterinterface in theUmbraco.Core.Stringsnamespace with two implementations (Markdig and HeyRed) - Refactored
MarkdownEditorValueConverterandHealthChecks.MarkdownToHtmlConverterto use constructor injection with the new abstraction - Comprehensive unit tests added covering both markdown converter implementations and health check color highlighting
Reviewed changes
Copilot reviewed 14 out of 14 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
src/Umbraco.Core/Strings/IMarkdownToHtmlConverter.cs |
New interface defining markdown-to-HTML conversion contract |
src/Umbraco.Infrastructure/Strings/MarkdigMarkdownToHtmlConverter.cs |
New implementation using Markdig library (recommended) |
src/Umbraco.Infrastructure/Strings/HeyRedMarkdownToHtmlConverter.cs |
Deprecated implementation using HeyRed.MarkdownSharp for backwards compatibility |
src/Umbraco.Infrastructure/PropertyEditors/ValueConverters/MarkdownEditorValueConverter.cs |
Updated to use injected converter with obsolete constructor for compatibility |
src/Umbraco.Infrastructure/HealthChecks/MarkdownToHtmlConverter.cs |
Updated to use injected converter with obsolete constructor for compatibility |
src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Services.cs |
Registers HeyRed implementation as default (temporary, to be changed in V18) |
src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.CoreServices.cs |
Updates registration to use fully qualified type name to avoid conflicts |
src/Umbraco.Core/Composing/TypeFinder.cs |
Adds Markdig to exclusion list for type scanning |
src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj |
Adds Markdig package reference |
Directory.Packages.props |
Adds Markdig version 0.44.0 |
NOTICES.txt |
Adds Markdig license attribution |
tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Strings/MarkdownToHtmlConverterTests.cs |
Unit tests for both markdown converter implementations |
tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/HealthChecks/MarkdownToHtmlConverterTests.cs |
Unit tests for health check converter with color highlighting validation |
tests/Umbraco.Tests.UnitTests/Umbraco.Core/DeliveryApi/MarkdownEditorValueConverterTests.cs |
Updated test to inject deprecated HeyRed converter |
src/Umbraco.Infrastructure/Strings/MarkdigMarkdownToHtmlConverter.cs
Outdated
Show resolved
Hide resolved
src/Umbraco.Infrastructure/Strings/HeyRedMarkdownToHtmlConverter.cs
Outdated
Show resolved
Hide resolved
tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Strings/MarkdownToHtmlConverterTests.cs
Show resolved
Hide resolved
IMarkdownToHtmlConverter abstractionIMarkdownToHtmlConverter abstraction (closes #21238 and #19500)
Co-authored-by: Copilot <[email protected]>
Co-authored-by: Copilot <[email protected]>
This was referenced Dec 23, 2025
lauraneto
approved these changes
Jan 5, 2026
.../Umbraco.Tests.UnitTests/Umbraco.Infrastructure/HealthChecks/MarkdownToHtmlConverterTests.cs
Outdated
Show resolved
Hide resolved
8 tasks
Contributor
Author
|
Thanks for the review @lauraneto. I've made the suggested update and created a docs PR for the feature here: umbraco/UmbracoDocs#7740 |
This was referenced Feb 20, 2026
Merged
alexsee
pushed a commit
to alexsee/umbraco-container
that referenced
this pull request
Feb 23, 2026
Updated [Umbraco.Cms](https://github.com/umbraco/Umbraco-CMS) from 17.1.0 to 17.2.0. <details> <summary>Release notes</summary> _Sourced from [Umbraco.Cms's releases](https://github.com/umbraco/Umbraco-CMS/releases)._ ## 17.2.0 ## What's Changed Since 17.2.0-rc2 ### 📦 Dependencies * build(deps): bumps @umbraco-ui/uui to 1.17.0 by @iOvergaard in umbraco/Umbraco-CMS#21765 **Full Changelog**: umbraco/Umbraco-CMS@release-17.2.0-rc2...release-17.2.0 ## What's Changed Since 17.2.0-rc ### 🐛 Bug Fixes * Block Workspace: rename root-tab to 'generic' by @nielslyngsoe in umbraco/Umbraco-CMS#21699 * Block Workspace: Tabs navigation, Cherry-pick from #21672 by @nielslyngsoe in umbraco/Umbraco-CMS#21693 **Full Changelog**: umbraco/Umbraco-CMS@release-17.2.0-rc...release-17.2.0-rc2 ## What's Changed Since the Last Release (17.1.0) ### 🙌 Notable Changes * User group: add description to user group (closes #14986) by @NguyenThuyLan in umbraco/Umbraco-CMS#21057 * Content Types: Root properties by @nielslyngsoe in umbraco/Umbraco-CMS#21500 ### 📦 Dependencies * Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @dependabot[bot] in umbraco/Umbraco-CMS#21208 * Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in umbraco/Umbraco-CMS#21270 * Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in umbraco/Umbraco-CMS#21403 * Dependencies: Bumps login dependencies to latest by @iOvergaard in umbraco/Umbraco-CMS#21539 * Tiptap RTE: Upgraded to latest v3.x by @leekelleher in umbraco/Umbraco-CMS#21493 * Dependencies: Bumps @umbraco-ui/uui to 1.17.0-rc.4 by @iOvergaard in umbraco/Umbraco-CMS#21538 * build(deps): bumps @umbraco-ui/uui to 1.17.0-rc.5 by @iOvergaard in umbraco/Umbraco-CMS#21569 * Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable transitive dependencies (closes #21122) by @AndyButland in umbraco/Umbraco-CMS#21285 * Dependencies: Bump to latest minor/patch versions by @AndyButland in umbraco/Umbraco-CMS#21540 ### 🚀 New Features * Markdown Conversion: Remove hard dependency on deprecated library and replace with `IMarkdownToHtmlConverter` abstraction (closes #21238 and #19500) by @AndyButland in umbraco/Umbraco-CMS#21242 * UI: Refactor breadcrumb URLs to use Path Constants by @iOvergaard in umbraco/Umbraco-CMS#21179 * Tree Navigation: Add visual indicators for items with restricted access by @iOvergaard in umbraco/Umbraco-CMS#21365 * Recycle Bin: Adds `emptyRecycleBin` collection action kind for Documents and Media by @leekelleher in umbraco/Umbraco-CMS#21482 * Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by @leekelleher in umbraco/Umbraco-CMS#21494 * Rollback: Add toggle for diff display (closes #18518) by @AndyButland in umbraco/Umbraco-CMS#21426 * Dictionary: Add configurable value search functionality by @Nis-Knowit in umbraco/Umbraco-CMS#21200 ### 🚤 Performance * Performance: Embeds the API of selected extra conditions by @nielslyngsoe in umbraco/Umbraco-CMS#21188 * Performance: Bundle Js Libs by @nielslyngsoe in umbraco/Umbraco-CMS#21187 * Performance: Embed Store API in Manifests to lower number of network request by @madsrasmussen in umbraco/Umbraco-CMS#21191 * Performance: Avoid database lookup in `UserIdKeyResolver` for super-user by @AndyButland in umbraco/Umbraco-CMS#21281 * Performance: Only flush ID/Key map in `ContentCacheRefresher` on content deletion by @AndyButland in umbraco/Umbraco-CMS#21283 * Performance: Optimize refresh of hybrid cache for a document by retrieving draft and published in single query by @AndyButland in umbraco/Umbraco-CMS#21407 * Backoffice Performance: Inline entry point modules to reduce JS chunk count by @madsrasmussen in umbraco/Umbraco-CMS#21380 * HybridCache: Optimize content type change cache rebuild to resolve SQL timeouts by @AndyButland in umbraco/Umbraco-CMS#21207 ... (truncated) ## 17.2.0-rc2 ## What's Changed Since 17.2.0-rc ### 🐛 Bug Fixes * Block Workspace: rename root-tab to 'generic' by @nielslyngsoe in umbraco/Umbraco-CMS#21699 * Block Workspace: Tabs navigation, Cherry-pick from #21672 by @nielslyngsoe in umbraco/Umbraco-CMS#21693 **Full Changelog**: umbraco/Umbraco-CMS@release-17.2.0-rc...release-17.2.0-rc2 ## What's Changed Since the Last Release (17.1.0) ### 🙌 Notable Changes * User group: add description to user group (closes #14986) by @NguyenThuyLan in umbraco/Umbraco-CMS#21057 * Content Types: Root properties by @nielslyngsoe in umbraco/Umbraco-CMS#21500 ### 📦 Dependencies * Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @dependabot[bot] in umbraco/Umbraco-CMS#21208 * Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in umbraco/Umbraco-CMS#21270 * Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in umbraco/Umbraco-CMS#21403 * Dependencies: Bumps login dependencies to latest by @iOvergaard in umbraco/Umbraco-CMS#21539 * Tiptap RTE: Upgraded to latest v3.x by @leekelleher in umbraco/Umbraco-CMS#21493 * Dependencies: Bumps @umbraco-ui/uui to 1.17.0-rc.4 by @iOvergaard in umbraco/Umbraco-CMS#21538 * build(deps): bumps @umbraco-ui/uui to 1.17.0-rc.5 by @iOvergaard in umbraco/Umbraco-CMS#21569 * Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable transitive dependencies (closes #21122) by @AndyButland in umbraco/Umbraco-CMS#21285 * Dependencies: Bump to latest minor/patch versions by @AndyButland in umbraco/Umbraco-CMS#21540 ### 🚀 New Features * Markdown Conversion: Remove hard dependency on deprecated library and replace with `IMarkdownToHtmlConverter` abstraction (closes #21238 and #19500) by @AndyButland in umbraco/Umbraco-CMS#21242 * UI: Refactor breadcrumb URLs to use Path Constants by @iOvergaard in umbraco/Umbraco-CMS#21179 * Tree Navigation: Add visual indicators for items with restricted access by @iOvergaard in umbraco/Umbraco-CMS#21365 * Recycle Bin: Adds `emptyRecycleBin` collection action kind for Documents and Media by @leekelleher in umbraco/Umbraco-CMS#21482 * Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by @leekelleher in umbraco/Umbraco-CMS#21494 * Rollback: Add toggle for diff display (closes #18518) by @AndyButland in umbraco/Umbraco-CMS#21426 * Dictionary: Add configurable value search functionality by @Nis-Knowit in umbraco/Umbraco-CMS#21200 ### 🚤 Performance * Performance: Embeds the API of selected extra conditions by @nielslyngsoe in umbraco/Umbraco-CMS#21188 * Performance: Bundle Js Libs by @nielslyngsoe in umbraco/Umbraco-CMS#21187 * Performance: Embed Store API in Manifests to lower number of network request by @madsrasmussen in umbraco/Umbraco-CMS#21191 * Performance: Avoid database lookup in `UserIdKeyResolver` for super-user by @AndyButland in umbraco/Umbraco-CMS#21281 * Performance: Only flush ID/Key map in `ContentCacheRefresher` on content deletion by @AndyButland in umbraco/Umbraco-CMS#21283 * Performance: Optimize refresh of hybrid cache for a document by retrieving draft and published in single query by @AndyButland in umbraco/Umbraco-CMS#21407 * Backoffice Performance: Inline entry point modules to reduce JS chunk count by @madsrasmussen in umbraco/Umbraco-CMS#21380 * HybridCache: Optimize content type change cache rebuild to resolve SQL timeouts by @AndyButland in umbraco/Umbraco-CMS#21207 * Backoffice Performance: Use import maps to save requests by @nielslyngsoe in umbraco/Umbraco-CMS#21363 * Document URL Cache: Ensure URLs are rebuilt after upgrade and prevent duplicate initialization (closes #21337) by @AndyButland in umbraco/Umbraco-CMS#21379 * Performance: Fix thread safety and optimize cache updates in `PublishStatusService` after content changes by @AndyButland in umbraco/Umbraco-CMS#21415 * Tiptap RTE: Optimize `umb-input-tiptap` initialization and rendering by @leekelleher in umbraco/Umbraco-CMS#21070 * Routing: Add `DocumentUrlAliasService` for optimized URL alias lookups (closes #21383) by @AndyButland in umbraco/Umbraco-CMS#21396 * Performance: Optimize property retrieval and authorization checks in collection views (closes #21367) by @AndyButland in umbraco/Umbraco-CMS#21470 ... (truncated) ## 17.2.0-rc ## What's Changed ### 🙌 Notable Changes * User group: add description to user group (closes #14986) by @NguyenThuyLan in umbraco/Umbraco-CMS#21057 * Content Types: Root properties by @nielslyngsoe in umbraco/Umbraco-CMS#21500 ### 📦 Dependencies * Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @dependabot[bot] in umbraco/Umbraco-CMS#21208 * Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in umbraco/Umbraco-CMS#21270 * Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in umbraco/Umbraco-CMS#21403 * Dependencies: Bumps login dependencies to latest by @iOvergaard in umbraco/Umbraco-CMS#21539 * Tiptap RTE: Upgraded to latest v3.x by @leekelleher in umbraco/Umbraco-CMS#21493 * Dependencies: Bumps @umbraco-ui/uui to 1.17.0-rc.4 by @iOvergaard in umbraco/Umbraco-CMS#21538 * build(deps): bumps @umbraco-ui/uui to 1.17.0-rc.5 by @iOvergaard in umbraco/Umbraco-CMS#21569 * Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable transitive dependencies (closes #21122) by @AndyButland in umbraco/Umbraco-CMS#21285 * Dependencies: Bump to latest minor/patch versions by @AndyButland in umbraco/Umbraco-CMS#21540 ### 🚀 New Features * Markdown Conversion: Remove hard dependency on deprecated library and replace with `IMarkdownToHtmlConverter` abstraction (closes #21238 and #19500) by @AndyButland in umbraco/Umbraco-CMS#21242 * UI: Refactor breadcrumb URLs to use Path Constants by @iOvergaard in umbraco/Umbraco-CMS#21179 * Tree Navigation: Add visual indicators for items with restricted access by @iOvergaard in umbraco/Umbraco-CMS#21365 * Recycle Bin: Adds `emptyRecycleBin` collection action kind for Documents and Media by @leekelleher in umbraco/Umbraco-CMS#21482 * Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by @leekelleher in umbraco/Umbraco-CMS#21494 * Rollback: Add toggle for diff display (closes #18518) by @AndyButland in umbraco/Umbraco-CMS#21426 * Dictionary: Add configurable value search functionality by @Nis-Knowit in umbraco/Umbraco-CMS#21200 ### 🚤 Performance * Performance: Embeds the API of selected extra conditions by @nielslyngsoe in umbraco/Umbraco-CMS#21188 * Performance: Bundle Js Libs by @nielslyngsoe in umbraco/Umbraco-CMS#21187 * Performance: Embed Store API in Manifests to lower number of network request by @madsrasmussen in umbraco/Umbraco-CMS#21191 * Performance: Avoid database lookup in `UserIdKeyResolver` for super-user by @AndyButland in umbraco/Umbraco-CMS#21281 * Performance: Only flush ID/Key map in `ContentCacheRefresher` on content deletion by @AndyButland in umbraco/Umbraco-CMS#21283 * Performance: Optimize refresh of hybrid cache for a document by retrieving draft and published in single query by @AndyButland in umbraco/Umbraco-CMS#21407 * Backoffice Performance: Inline entry point modules to reduce JS chunk count by @madsrasmussen in umbraco/Umbraco-CMS#21380 * HybridCache: Optimize content type change cache rebuild to resolve SQL timeouts by @AndyButland in umbraco/Umbraco-CMS#21207 * Backoffice Performance: Use import maps to save requests by @nielslyngsoe in umbraco/Umbraco-CMS#21363 * Document URL Cache: Ensure URLs are rebuilt after upgrade and prevent duplicate initialization (closes #21337) by @AndyButland in umbraco/Umbraco-CMS#21379 * Performance: Fix thread safety and optimize cache updates in `PublishStatusService` after content changes by @AndyButland in umbraco/Umbraco-CMS#21415 * Tiptap RTE: Optimize `umb-input-tiptap` initialization and rendering by @leekelleher in umbraco/Umbraco-CMS#21070 * Routing: Add `DocumentUrlAliasService` for optimized URL alias lookups (closes #21383) by @AndyButland in umbraco/Umbraco-CMS#21396 * Performance: Optimize property retrieval and authorization checks in collection views (closes #21367) by @AndyButland in umbraco/Umbraco-CMS#21470 ### 🧪 Testing * E2E: QA Replaced unreliable Thread.Sleep(500) with a counter/gate pattern that ensures both transactions are initialized before releasing them to compete for locks by @andr317c in umbraco/Umbraco-CMS#21165 * E2E QA: Updated integration test that was missing directory setup by @andr317c in umbraco/Umbraco-CMS#21167 * E2E: QA Added acceptance tests for removing a not-found content picker by @nhudinh0309 in umbraco/Umbraco-CMS#21177 * E2E: QA Fixed failing tests for the current user profile by @nhudinh0309 in umbraco/Umbraco-CMS#21214 * Upgrade MSW from 1.3.5 to 2.12.4 by @madsrasmussen in umbraco/Umbraco-CMS#21096 * E2E: QA Added acceptance tests for rendering content with invariant blocks by @nhudinh0309 in umbraco/Umbraco-CMS#21180 * E2E: QA Added acceptance tests for content delivery API by @nhudinh0309 in umbraco/Umbraco-CMS#21095 ... (truncated) Commits viewable in [compare view](umbraco/Umbraco-CMS@release-17.1.0...release-17.2.0). </details> Updated [Umbraco.Cms.Persistence.Sqlite](https://github.com/umbraco/Umbraco-CMS) from 17.1.0 to 17.2.0. <details> <summary>Release notes</summary> _Sourced from [Umbraco.Cms.Persistence.Sqlite's releases](https://github.com/umbraco/Umbraco-CMS/releases)._ ## 17.2.0 ## What's Changed Since 17.2.0-rc2 ### 📦 Dependencies * build(deps): bumps @umbraco-ui/uui to 1.17.0 by @iOvergaard in umbraco/Umbraco-CMS#21765 **Full Changelog**: umbraco/Umbraco-CMS@release-17.2.0-rc2...release-17.2.0 ## What's Changed Since 17.2.0-rc ### 🐛 Bug Fixes * Block Workspace: rename root-tab to 'generic' by @nielslyngsoe in umbraco/Umbraco-CMS#21699 * Block Workspace: Tabs navigation, Cherry-pick from #21672 by @nielslyngsoe in umbraco/Umbraco-CMS#21693 **Full Changelog**: umbraco/Umbraco-CMS@release-17.2.0-rc...release-17.2.0-rc2 ## What's Changed Since the Last Release (17.1.0) ### 🙌 Notable Changes * User group: add description to user group (closes #14986) by @NguyenThuyLan in umbraco/Umbraco-CMS#21057 * Content Types: Root properties by @nielslyngsoe in umbraco/Umbraco-CMS#21500 ### 📦 Dependencies * Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @dependabot[bot] in umbraco/Umbraco-CMS#21208 * Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in umbraco/Umbraco-CMS#21270 * Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in umbraco/Umbraco-CMS#21403 * Dependencies: Bumps login dependencies to latest by @iOvergaard in umbraco/Umbraco-CMS#21539 * Tiptap RTE: Upgraded to latest v3.x by @leekelleher in umbraco/Umbraco-CMS#21493 * Dependencies: Bumps @umbraco-ui/uui to 1.17.0-rc.4 by @iOvergaard in umbraco/Umbraco-CMS#21538 * build(deps): bumps @umbraco-ui/uui to 1.17.0-rc.5 by @iOvergaard in umbraco/Umbraco-CMS#21569 * Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable transitive dependencies (closes #21122) by @AndyButland in umbraco/Umbraco-CMS#21285 * Dependencies: Bump to latest minor/patch versions by @AndyButland in umbraco/Umbraco-CMS#21540 ### 🚀 New Features * Markdown Conversion: Remove hard dependency on deprecated library and replace with `IMarkdownToHtmlConverter` abstraction (closes #21238 and #19500) by @AndyButland in umbraco/Umbraco-CMS#21242 * UI: Refactor breadcrumb URLs to use Path Constants by @iOvergaard in umbraco/Umbraco-CMS#21179 * Tree Navigation: Add visual indicators for items with restricted access by @iOvergaard in umbraco/Umbraco-CMS#21365 * Recycle Bin: Adds `emptyRecycleBin` collection action kind for Documents and Media by @leekelleher in umbraco/Umbraco-CMS#21482 * Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by @leekelleher in umbraco/Umbraco-CMS#21494 * Rollback: Add toggle for diff display (closes #18518) by @AndyButland in umbraco/Umbraco-CMS#21426 * Dictionary: Add configurable value search functionality by @Nis-Knowit in umbraco/Umbraco-CMS#21200 ### 🚤 Performance * Performance: Embeds the API of selected extra conditions by @nielslyngsoe in umbraco/Umbraco-CMS#21188 * Performance: Bundle Js Libs by @nielslyngsoe in umbraco/Umbraco-CMS#21187 * Performance: Embed Store API in Manifests to lower number of network request by @madsrasmussen in umbraco/Umbraco-CMS#21191 * Performance: Avoid database lookup in `UserIdKeyResolver` for super-user by @AndyButland in umbraco/Umbraco-CMS#21281 * Performance: Only flush ID/Key map in `ContentCacheRefresher` on content deletion by @AndyButland in umbraco/Umbraco-CMS#21283 * Performance: Optimize refresh of hybrid cache for a document by retrieving draft and published in single query by @AndyButland in umbraco/Umbraco-CMS#21407 * Backoffice Performance: Inline entry point modules to reduce JS chunk count by @madsrasmussen in umbraco/Umbraco-CMS#21380 * HybridCache: Optimize content type change cache rebuild to resolve SQL timeouts by @AndyButland in umbraco/Umbraco-CMS#21207 ... (truncated) ## 17.2.0-rc2 ## What's Changed Since 17.2.0-rc ### 🐛 Bug Fixes * Block Workspace: rename root-tab to 'generic' by @nielslyngsoe in umbraco/Umbraco-CMS#21699 * Block Workspace: Tabs navigation, Cherry-pick from #21672 by @nielslyngsoe in umbraco/Umbraco-CMS#21693 **Full Changelog**: umbraco/Umbraco-CMS@release-17.2.0-rc...release-17.2.0-rc2 ## What's Changed Since the Last Release (17.1.0) ### 🙌 Notable Changes * User group: add description to user group (closes #14986) by @NguyenThuyLan in umbraco/Umbraco-CMS#21057 * Content Types: Root properties by @nielslyngsoe in umbraco/Umbraco-CMS#21500 ### 📦 Dependencies * Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @dependabot[bot] in umbraco/Umbraco-CMS#21208 * Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in umbraco/Umbraco-CMS#21270 * Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in umbraco/Umbraco-CMS#21403 * Dependencies: Bumps login dependencies to latest by @iOvergaard in umbraco/Umbraco-CMS#21539 * Tiptap RTE: Upgraded to latest v3.x by @leekelleher in umbraco/Umbraco-CMS#21493 * Dependencies: Bumps @umbraco-ui/uui to 1.17.0-rc.4 by @iOvergaard in umbraco/Umbraco-CMS#21538 * build(deps): bumps @umbraco-ui/uui to 1.17.0-rc.5 by @iOvergaard in umbraco/Umbraco-CMS#21569 * Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable transitive dependencies (closes #21122) by @AndyButland in umbraco/Umbraco-CMS#21285 * Dependencies: Bump to latest minor/patch versions by @AndyButland in umbraco/Umbraco-CMS#21540 ### 🚀 New Features * Markdown Conversion: Remove hard dependency on deprecated library and replace with `IMarkdownToHtmlConverter` abstraction (closes #21238 and #19500) by @AndyButland in umbraco/Umbraco-CMS#21242 * UI: Refactor breadcrumb URLs to use Path Constants by @iOvergaard in umbraco/Umbraco-CMS#21179 * Tree Navigation: Add visual indicators for items with restricted access by @iOvergaard in umbraco/Umbraco-CMS#21365 * Recycle Bin: Adds `emptyRecycleBin` collection action kind for Documents and Media by @leekelleher in umbraco/Umbraco-CMS#21482 * Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by @leekelleher in umbraco/Umbraco-CMS#21494 * Rollback: Add toggle for diff display (closes #18518) by @AndyButland in umbraco/Umbraco-CMS#21426 * Dictionary: Add configurable value search functionality by @Nis-Knowit in umbraco/Umbraco-CMS#21200 ### 🚤 Performance * Performance: Embeds the API of selected extra conditions by @nielslyngsoe in umbraco/Umbraco-CMS#21188 * Performance: Bundle Js Libs by @nielslyngsoe in umbraco/Umbraco-CMS#21187 * Performance: Embed Store API in Manifests to lower number of network request by @madsrasmussen in umbraco/Umbraco-CMS#21191 * Performance: Avoid database lookup in `UserIdKeyResolver` for super-user by @AndyButland in umbraco/Umbraco-CMS#21281 * Performance: Only flush ID/Key map in `ContentCacheRefresher` on content deletion by @AndyButland in umbraco/Umbraco-CMS#21283 * Performance: Optimize refresh of hybrid cache for a document by retrieving draft and published in single query by @AndyButland in umbraco/Umbraco-CMS#21407 * Backoffice Performance: Inline entry point modules to reduce JS chunk count by @madsrasmussen in umbraco/Umbraco-CMS#21380 * HybridCache: Optimize content type change cache rebuild to resolve SQL timeouts by @AndyButland in umbraco/Umbraco-CMS#21207 * Backoffice Performance: Use import maps to save requests by @nielslyngsoe in umbraco/Umbraco-CMS#21363 * Document URL Cache: Ensure URLs are rebuilt after upgrade and prevent duplicate initialization (closes #21337) by @AndyButland in umbraco/Umbraco-CMS#21379 * Performance: Fix thread safety and optimize cache updates in `PublishStatusService` after content changes by @AndyButland in umbraco/Umbraco-CMS#21415 * Tiptap RTE: Optimize `umb-input-tiptap` initialization and rendering by @leekelleher in umbraco/Umbraco-CMS#21070 * Routing: Add `DocumentUrlAliasService` for optimized URL alias lookups (closes #21383) by @AndyButland in umbraco/Umbraco-CMS#21396 * Performance: Optimize property retrieval and authorization checks in collection views (closes #21367) by @AndyButland in umbraco/Umbraco-CMS#21470 ... (truncated) ## 17.2.0-rc ## What's Changed ### 🙌 Notable Changes * User group: add description to user group (closes #14986) by @NguyenThuyLan in umbraco/Umbraco-CMS#21057 * Content Types: Root properties by @nielslyngsoe in umbraco/Umbraco-CMS#21500 ### 📦 Dependencies * Storybook: Bumps storybook from 9.0.14 to 10.1.10 by @dependabot[bot] in umbraco/Umbraco-CMS#21208 * Bump qs from 6.14.0 to 6.14.1 in /src/Umbraco.Web.UI.Client in the npm_and_yarn group across 1 directory by @dependabot[bot] in umbraco/Umbraco-CMS#21270 * Bump the npm_and_yarn group across 2 directories with 1 update by @dependabot[bot] in umbraco/Umbraco-CMS#21403 * Dependencies: Bumps login dependencies to latest by @iOvergaard in umbraco/Umbraco-CMS#21539 * Tiptap RTE: Upgraded to latest v3.x by @leekelleher in umbraco/Umbraco-CMS#21493 * Dependencies: Bumps @umbraco-ui/uui to 1.17.0-rc.4 by @iOvergaard in umbraco/Umbraco-CMS#21538 * build(deps): bumps @umbraco-ui/uui to 1.17.0-rc.5 by @iOvergaard in umbraco/Umbraco-CMS#21569 * Dependencies: Update Microsoft packages to 10.0.1 and pin vulnerable transitive dependencies (closes #21122) by @AndyButland in umbraco/Umbraco-CMS#21285 * Dependencies: Bump to latest minor/patch versions by @AndyButland in umbraco/Umbraco-CMS#21540 ### 🚀 New Features * Markdown Conversion: Remove hard dependency on deprecated library and replace with `IMarkdownToHtmlConverter` abstraction (closes #21238 and #19500) by @AndyButland in umbraco/Umbraco-CMS#21242 * UI: Refactor breadcrumb URLs to use Path Constants by @iOvergaard in umbraco/Umbraco-CMS#21179 * Tree Navigation: Add visual indicators for items with restricted access by @iOvergaard in umbraco/Umbraco-CMS#21365 * Recycle Bin: Adds `emptyRecycleBin` collection action kind for Documents and Media by @leekelleher in umbraco/Umbraco-CMS#21482 * Tiptap RTE: Adds link (`umbLink`) support to `styleMenu` API by @leekelleher in umbraco/Umbraco-CMS#21494 * Rollback: Add toggle for diff display (closes #18518) by @AndyButland in umbraco/Umbraco-CMS#21426 * Dictionary: Add configurable value search functionality by @Nis-Knowit in umbraco/Umbraco-CMS#21200 ### 🚤 Performance * Performance: Embeds the API of selected extra conditions by @nielslyngsoe in umbraco/Umbraco-CMS#21188 * Performance: Bundle Js Libs by @nielslyngsoe in umbraco/Umbraco-CMS#21187 * Performance: Embed Store API in Manifests to lower number of network request by @madsrasmussen in umbraco/Umbraco-CMS#21191 * Performance: Avoid database lookup in `UserIdKeyResolver` for super-user by @AndyButland in umbraco/Umbraco-CMS#21281 * Performance: Only flush ID/Key map in `ContentCacheRefresher` on content deletion by @AndyButland in umbraco/Umbraco-CMS#21283 * Performance: Optimize refresh of hybrid cache for a document by retrieving draft and published in single query by @AndyButland in umbraco/Umbraco-CMS#21407 * Backoffice Performance: Inline entry point modules to reduce JS chunk count by @madsrasmussen in umbraco/Umbraco-CMS#21380 * HybridCache: Optimize content type change cache rebuild to resolve SQL timeouts by @AndyButland in umbraco/Umbraco-CMS#21207 * Backoffice Performance: Use import maps to save requests by @nielslyngsoe in umbraco/Umbraco-CMS#21363 * Document URL Cache: Ensure URLs are rebuilt after upgrade and prevent duplicate initialization (closes #21337) by @AndyButland in umbraco/Umbraco-CMS#21379 * Performance: Fix thread safety and optimize cache updates in `PublishStatusService` after content changes by @AndyButland in umbraco/Umbraco-CMS#21415 * Tiptap RTE: Optimize `umb-input-tiptap` initialization and rendering by @leekelleher in umbraco/Umbraco-CMS#21070 * Routing: Add `DocumentUrlAliasService` for optimized URL alias lookups (closes #21383) by @AndyButland in umbraco/Umbraco-CMS#21396 * Performance: Optimize property retrieval and authorization checks in collection views (closes #21367) by @AndyButland in umbraco/Umbraco-CMS#21470 ### 🧪 Testing * E2E: QA Replaced unreliable Thread.Sleep(500) with a counter/gate pattern that ensures both transactions are initialized before releasing them to compete for locks by @andr317c in umbraco/Umbraco-CMS#21165 * E2E QA: Updated integration test that was missing directory setup by @andr317c in umbraco/Umbraco-CMS#21167 * E2E: QA Added acceptance tests for removing a not-found content picker by @nhudinh0309 in umbraco/Umbraco-CMS#21177 * E2E: QA Fixed failing tests for the current user profile by @nhudinh0309 in umbraco/Umbraco-CMS#21214 * Upgrade MSW from 1.3.5 to 2.12.4 by @madsrasmussen in umbraco/Umbraco-CMS#21096 * E2E: QA Added acceptance tests for rendering content with invariant blocks by @nhudinh0309 in umbraco/Umbraco-CMS#21180 * E2E: QA Added acceptance tests for content delivery API by @nhudinh0309 in umbraco/Umbraco-CMS#21095 ... (truncated) Commits viewable in [compare view](umbraco/Umbraco-CMS@release-17.1.0...release-17.2.0). </details> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This was referenced Feb 23, 2026
This was referenced Mar 11, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Prerequisites
Addresses #21238 and #19500.
Follows-up on this closed PR: #19501
Description
The first issue raises a specific concern about the detail of code block conversion to HTML, whereas the second is a more general one about our use of a deprecated library.
Given we need to ensure backward compatibility for Umbraco 17, we can't simply swap the library we use - we need to ensure the library is still available in case anyone is using it directly in projects or packages, and there may be subtle differences in the output people are relying on for styling.
So instead I've introduced an abstraction, and created implementations for both the deprecated library and it's recommended successor. The first is registered as default so existing behaviour isn't changed. But implementors can swap for the other, or provided their own with further customisations as needed.
I've then made sure to use the abstraction in each place where we are currently doing markdown to HTML conversion: in the markdown property value converter, and for a feature with health check notifications.
Change Summary
IMarkdownToHtmlConverterinterface inUmbraco.Core.Stringsnamespace for converting Markdown to HTMLMarkdigMarkdownToHtmlConverterusing the Markdig library (new recommended implementation)HeyRedMarkdownToHtmlConverterusing HeyRed.MarkdownSharp (deprecated, but still the default until Umbraco 18 and provided for backwards compatibility until 19)HealthChecks.MarkdownToHtmlConverterto use the new abstraction with constructor injectionMarkdownEditorValueConverterto use the new abstractionHealthChecks.MarkdownToHtmlConverterverifying syntax highlighting for Success/Warning/Error statusesTesting
To test verify that a markdown property editor renders the expected output.
Using a composer, register the other implementation and verify the same:
The HTML should be almost or exactly the same. The only known difference I've seen is the syntax used for code blocks, but there may be other subtle differences.
Documentation
Should create a documentation page for the
IMarkdownToHtmlConverterinterface and theHeyRedMarkdownToHtmlConverterandMarkdigMarkdownToHtmlConverterimplementations).