Handle click on irc:// channel URLs inside buffers

References: https://todo.sr.ht/~emersion/gamja/71
This commit is contained in:
Simon Ser
2021-10-13 16:18:59 +02:00
parent 631f119061
commit 405bc51c26
3 changed files with 72 additions and 28 deletions
+11 -24
View File
@@ -5,11 +5,11 @@ linkifyjs.options.defaults.defaultProtocol = "https";
linkifyjs.registerCustomProtocol("irc");
linkifyjs.registerCustomProtocol("ircs");
linkifyjs.registerPlugin('ircChannel', ({ scanner, parser, utils }) => {
linkifyjs.registerPlugin("ircChannel", ({ scanner, parser, utils }) => {
const { POUND, DOMAIN, TLD, LOCALHOST, UNDERSCORE, DOT, HYPHEN } = scanner.tokens;
const START_STATE = parser.start;
const Channel = utils.createTokenClass('ircChannel', {
const Channel = utils.createTokenClass("ircChannel", {
isLink: true,
toHref() {
return "irc:///" + this.toString();
@@ -36,7 +36,7 @@ linkifyjs.registerPlugin('ircChannel', ({ scanner, parser, utils }) => {
CHAN_DIVIDER_STATE.tt(LOCALHOST, CHAN_STATE);
});
export default function linkify(text, onChannelClick) {
export default function linkify(text, onClick) {
let links = linkifyjs.find(text);
let children = [];
@@ -49,27 +49,14 @@ export default function linkify(text, onChannelClick) {
const prefix = text.substring(last, match.start)
children.push(prefix);
// TODO: handle all irc/ircs URLs
if (match.href.startsWith("irc:///")) {
function onClick(event) {
event.preventDefault();
onChannelClick(match.value);
}
children.push(html`
<a
href="${match.href}"
onClick=${onClick}
>${match.value}</a>
`);
} else {
children.push(html`
<a
href=${match.href}
target="_blank"
rel="noreferrer noopener"
>${match.value}</a>
`);
}
children.push(html`
<a
href=${match.href}
target="_blank"
rel="noreferrer noopener"
onClick=${onClick}
>${match.value}</a>
`);
last = match.end;
});