gamja-old/lib/linkify.js

65 lines
1.5 KiB
JavaScript
Raw Normal View History

import { anchorme, html } from "./index.js";
2020-06-25 11:26:40 -04:00
2021-05-31 22:39:35 -04:00
function linkifyChannel(text, transformChannel) {
// Don't match punctuation at the end of the channel name
const channelRegex = /(?:^|\s)(#[^\s]+[^\s.?!():;])/gid;
2021-05-31 22:39:35 -04:00
var children = [];
var match;
2021-05-31 22:39:35 -04:00
var last = 0;
while ((match = channelRegex.exec(text)) !== null) {
var channel = match[1];
var [start, end] = match.indices[1];
2021-05-31 22:39:35 -04:00
children.push(text.substring(last, start));
children.push(transformChannel(channel));
last = end;
2021-05-31 22:39:35 -04:00
}
children.push(text.substring(last));
return children;
}
export default function linkify(text, onChannelClick) {
function transformChannel(channel) {
function onClick(event) {
event.preventDefault();
onChannelClick(channel);
}
return html`
<a
href="irc:///${encodeURIComponent(channel)}"
onClick=${onClick}
>${channel}</a>`;
}
2020-06-25 11:26:40 -04:00
var links = anchorme.list(text);
var children = [];
var last = 0;
links.forEach((match) => {
2021-05-31 22:39:35 -04:00
const prefix = text.substring(last, match.start)
children.push(...linkifyChannel(prefix, transformChannel));
2020-06-25 11:26:40 -04:00
var proto = match.protocol || "https://";
if (match.isEmail) {
proto = "mailto:";
}
var url = match.string;
if (!url.startsWith(proto)) {
url = proto + url;
}
children.push(html`<a href=${url} target="_blank" rel="noreferrer noopener">${match.string}</a>`);
last = match.end;
});
2021-05-31 22:39:35 -04:00
const suffix = text.substring(last)
children.push(...linkifyChannel(suffix, transformChannel));
2020-06-25 11:26:40 -04:00
return children;
}