feishin/src/renderer/utils/linkify.tsx

40 lines
1.1 KiB
TypeScript
Raw Normal View History

2024-01-15 20:46:06 -08:00
// Inspired by https://github.com/navidrome/navidrome/blob/c530ccf13854e3a840ddf63eef5e2323fbe2827d/ui/src/common/AnchorMe.js
const URL_REGEX =
/((?:https?:\/\/)?(?:[\w-]{1,32}(?:\.[\w-]{1,32})+)(?:\/[\w\-./?%&=][^.|^\s]*)?)/g;
export const replaceURLWithHTMLLinks = (text: string) => {
const urlRegex = new RegExp(URL_REGEX, 'g');
const matches = text.matchAll(urlRegex);
const elements = [];
let lastIndex = 0;
for (const match of matches) {
const position = match.index!;
if (position > lastIndex) {
elements.push(text.substring(lastIndex, position));
}
const link = match[0];
2024-08-27 08:26:34 -07:00
const prefix = link.startsWith('http') ? '' : 'https://';
2024-01-15 20:46:06 -08:00
elements.push(
<a
key={lastIndex}
2024-08-27 08:26:34 -07:00
href={prefix + link}
2024-01-15 20:46:06 -08:00
rel="noopener noreferrer"
target="_blank"
>
{link}
</a>,
);
lastIndex = position + link.length;
}
if (text.length > lastIndex) {
elements.push(text.substring(lastIndex));
}
return elements;
};