import { JSX } from "solid-js"; interface LinkifyProps { initialText: string; } export function Linkify(props: LinkifyProps): JSX.Element { // By naming this "initialText" we can prove to eslint that the props won't change const text = props.initialText; const links: (string | JSX.Element)[] = []; const pattern = /((https?:\/\/|www\.)\S+)/gi; let lastIndex = 0; let match; while ((match = pattern.exec(text)) !== null) { const link = match[1]; const href = link.startsWith("http") ? link : `https://${link}`; const beforeLink = text.slice(lastIndex, match.index); lastIndex = pattern.lastIndex; if (beforeLink) { links.push(beforeLink); } links.push( {link} ); } const remainingText = text.slice(lastIndex); if (remainingText) { links.push(remainingText); } return <>{links}; }