7e2e3304e1
Cleaner conceptual model: the parsed state object is the place where all derived facts about the content live, so `isMarkdown` becomes a field on `RichTextViewerState` (populated by `RichTextParser.parseText` using the same cheap heuristic). `RichTextViewer` now calls `CachedRichTextParser.parseText` once at the top and dispatches on `state.isMarkdown` instead of running a separate scan. `CachedRichTextParser.isMarkdown(content)` and its dedicated `isMarkdownCache` go away — the single `richTextCache` carries the decision alongside the parsed segments. Inner callers (`DisplaySecretEmoji`, `MultiSetCompose` reaction preview, `DisplayUncitedHashtags`) are unaffected: they continue to receive a fully-parsed state with all segments populated.