diff --git a/src/renderer/src/components/editor/markdown-rich-mode-eligibility-cache.ts b/src/renderer/src/components/editor/markdown-rich-mode-eligibility-cache.ts index f756ce786f8..f45afd6aba2 100644 --- a/src/renderer/src/components/editor/markdown-rich-mode-eligibility-cache.ts +++ b/src/renderer/src/components/editor/markdown-rich-mode-eligibility-cache.ts @@ -4,6 +4,7 @@ import { type MarkdownRichModeEligibility, type MarkdownRichModeEligibilityDecision } from './markdown-rich-mode' +import { exceedsMarkdownRenderOverrideSizeLimit } from './markdown-rich-size-limit' type EligibilityCacheEntry = { content: string @@ -46,6 +47,10 @@ function getCachedMarkdownRichModeEligibilityDecision(params: { } const decision = getMarkdownRichModeEligibilityDecision({ content, sizeOverridden }) + // Don't retain hard-cap documents; checked after lookup so cache hits skip the UTF-8 probe. + if (decision.exceedsSizeLimit && exceedsMarkdownRenderOverrideSizeLimit(content)) { + return decision + } entries.unshift({ content, sizeOverridden, decision }) if (entries.length > MAX_ENTRIES) { entries.length = MAX_ENTRIES diff --git a/src/renderer/src/components/editor/markdown-rich-mode.test.ts b/src/renderer/src/components/editor/markdown-rich-mode.test.ts index 82f90904328..335f8938728 100644 --- a/src/renderer/src/components/editor/markdown-rich-mode.test.ts +++ b/src/renderer/src/components/editor/markdown-rich-mode.test.ts @@ -1,5 +1,6 @@ import { afterEach, describe, expect, it, vi } from 'vitest' import * as roundTrip from './markdown-round-trip' +import { MARKDOWN_RENDER_OVERRIDE_MAX_SIZE_BYTES } from './markdown-rich-size-limit' import { RICH_MARKDOWN_MAX_SIZE_BYTES } from '../../../../shared/constants' import { getMarkdownRichModeEligibility, @@ -207,6 +208,24 @@ describe('getMarkdownRichModeUnsupportedMessage', () => { unsupportedMessage: expect.any(String) }) }) + + it.each([false, true])( + 'reports only the size limit beyond the hard render cap, override=%s', + (sizeOverridden) => { + const content = `${'a'.repeat(MARKDOWN_RENDER_OVERRIDE_MAX_SIZE_BYTES)}\n[ref]: /docs\n` + + const result = getMarkdownRichModeEligibility({ content, sizeOverridden }) + expect(result).toEqual({ + exceedsSizeLimit: true, + unsupportedMessage: null + }) + + expect( + getMarkdownRichModeEligibility({ content: '[ref]: /docs', sizeOverridden }) + .unsupportedMessage + ).not.toBeNull() + } + ) }) const decide = (content: string) => diff --git a/src/renderer/src/components/editor/markdown-rich-mode.ts b/src/renderer/src/components/editor/markdown-rich-mode.ts index a2db5804733..f25175b53ff 100644 --- a/src/renderer/src/components/editor/markdown-rich-mode.ts +++ b/src/renderer/src/components/editor/markdown-rich-mode.ts @@ -5,7 +5,10 @@ import { getRichMarkdownRoundTripOutput } from './markdown-round-trip' import { extractFrontMatter } from './markdown-frontmatter' -import { canRenderMarkdownAtSize } from './markdown-rich-size-limit' +import { + canRenderMarkdownAtSize, + exceedsMarkdownRenderOverrideSizeLimit +} from './markdown-rich-size-limit' import { translate } from '@/i18n/i18n' import { encodeRawMarkdownHtmlForRichEditor } from './raw-markdown-html' import { createRichMarkdownEditorCodec } from './rich-markdown-source-transport' @@ -142,6 +145,10 @@ export function getMarkdownRichModeEligibilityDecision({ content: string sizeOverridden: boolean }): MarkdownRichModeEligibilityDecision { + // Past the hard cap neither mode renders rich, so the unsupported-syntax scan is moot. + if (exceedsMarkdownRenderOverrideSizeLimit(content)) { + return { exceedsSizeLimit: true, unsupportedReason: null } + } return { exceedsSizeLimit: !canRenderMarkdownAtSize(content, sizeOverridden), unsupportedReason: getMarkdownRichModeUnsupportedReason(content)