fix: render markdown links as <a> tags and convert newlines to <br> in Lexical text nodes
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 16s
Build & Deploy / 🏗️ Build (push) Has been cancelled
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been cancelled
Build & Deploy / 🧪 QA (push) Has been cancelled
Build & Deploy / ⚡ Performance & Accessibility (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 16s
Build & Deploy / 🏗️ Build (push) Has been cancelled
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been cancelled
Build & Deploy / 🧪 QA (push) Has been cancelled
Build & Deploy / ⚡ Performance & Accessibility (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
This commit is contained in:
@@ -45,6 +45,52 @@ const jsxConverters: JSXConverters = {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handle markdown-style links [text](url) from MDX migration
|
||||||
|
if (text && /\[([^\]]+)\]\(([^)]+)\)/.test(text)) {
|
||||||
|
const parts: React.ReactNode[] = [];
|
||||||
|
const remaining = text;
|
||||||
|
let key = 0;
|
||||||
|
const linkRegex = /\[([^\]]+)\]\(([^)]+)\)/g;
|
||||||
|
let match;
|
||||||
|
let lastIndex = 0;
|
||||||
|
while ((match = linkRegex.exec(remaining)) !== null) {
|
||||||
|
if (match.index > lastIndex) {
|
||||||
|
parts.push(<span key={key++}>{remaining.slice(lastIndex, match.index)}</span>);
|
||||||
|
}
|
||||||
|
parts.push(
|
||||||
|
<a
|
||||||
|
key={key++}
|
||||||
|
href={match[2]}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
className="text-primary underline decoration-primary/30 hover:decoration-primary transition-colors"
|
||||||
|
>
|
||||||
|
{match[1]}
|
||||||
|
</a>,
|
||||||
|
);
|
||||||
|
lastIndex = match.index + match[0].length;
|
||||||
|
}
|
||||||
|
if (lastIndex < remaining.length) {
|
||||||
|
parts.push(<span key={key++}>{remaining.slice(lastIndex)}</span>);
|
||||||
|
}
|
||||||
|
return <>{parts}</>;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle newlines in text nodes — convert to <br> for proper line breaks
|
||||||
|
if (text && text.includes('\n')) {
|
||||||
|
const lines = text.split('\n');
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{lines.map((line: string, i: number) => (
|
||||||
|
<span key={i}>
|
||||||
|
{line}
|
||||||
|
{i < lines.length - 1 && <br />}
|
||||||
|
</span>
|
||||||
|
))}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (node.format === 1) return <strong>{text}</strong>;
|
if (node.format === 1) return <strong>{text}</strong>;
|
||||||
if (node.format === 2) return <em>{text}</em>;
|
if (node.format === 2) return <em>{text}</em>;
|
||||||
return <span>{text}</span>;
|
return <span>{text}</span>;
|
||||||
|
|||||||
Reference in New Issue
Block a user