Skip to content

Commit aebe61c

Browse files
cursoragentmsukkari
andcommitted
fix(web): prevent angle bracket text from being hidden in chat prompts
Add disableRawHtml prop to MarkdownRenderer to prevent text like <id> from being interpreted as HTML tags. This is enabled for user questions in chat, which should not contain embedded HTML. Co-authored-by: Michael Sukkarieh <msukkari@users.noreply.github.com>
1 parent 8d171f6 commit aebe61c

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

packages/web/src/features/chat/components/chatThread/chatThreadListItem.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ const ChatThreadListItemComponent = forwardRef<HTMLDivElement, ChatThreadListIte
334334
<MarkdownRenderer
335335
content={userQuestion.trim()}
336336
className="prose-p:m-0"
337+
disableRawHtml={true}
337338
/>
338339
</div>
339340

packages/web/src/features/chat/components/chatThread/markdownRenderer.tsx

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,15 @@ const remarkTocExtractor = () => {
101101
interface MarkdownRendererProps {
102102
content: string;
103103
className?: string;
104+
/**
105+
* When true, disables raw HTML parsing. This prevents text like `<id>` from
106+
* being interpreted as HTML tags. Use this for user-provided content that
107+
* shouldn't contain embedded HTML.
108+
*/
109+
disableRawHtml?: boolean;
104110
}
105111

106-
const MarkdownRendererComponent = forwardRef<HTMLDivElement, MarkdownRendererProps>(({ content, className }, ref) => {
112+
const MarkdownRendererComponent = forwardRef<HTMLDivElement, MarkdownRendererProps>(({ content, className, disableRawHtml = false }, ref) => {
107113
const router = useRouter();
108114

109115
const remarkPlugins = useMemo((): PluggableList => {
@@ -115,8 +121,13 @@ const MarkdownRendererComponent = forwardRef<HTMLDivElement, MarkdownRendererPro
115121
}, []);
116122

117123
const rehypePlugins = useMemo((): PluggableList => {
118-
return [
119-
rehypeRaw,
124+
const plugins: PluggableList = [];
125+
126+
if (!disableRawHtml) {
127+
plugins.push(rehypeRaw);
128+
}
129+
130+
plugins.push(
120131
[
121132
rehypeSanitize,
122133
{
@@ -129,8 +140,10 @@ const MarkdownRendererComponent = forwardRef<HTMLDivElement, MarkdownRendererPro
129140
} satisfies SanitizeSchema,
130141
],
131142
annotateCodeBlocks,
132-
];
133-
}, []);
143+
);
144+
145+
return plugins;
146+
}, [disableRawHtml]);
134147

135148
const renderPre = useCallback(({ children, node, ...rest }: React.JSX.IntrinsicElements['pre'] & { node?: Element }) => {
136149
if (node?.properties && node.properties.isBlock === true) {

0 commit comments

Comments
 (0)