import { linkifyjs, html } from "./index.js"; linkifyjs.options.defaults.defaultProtocol = "https"; linkifyjs.registerCustomProtocol("irc"); linkifyjs.registerCustomProtocol("ircs"); 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", { isLink: true, toHref() { return "irc:///" + this.toString(); }, }); const HASH_STATE = START_STATE.tt(POUND); const CHAN_STATE = HASH_STATE.tt(DOMAIN, Channel); HASH_STATE.tt(TLD, CHAN_STATE); HASH_STATE.tt(LOCALHOST, CHAN_STATE); HASH_STATE.tt(POUND, CHAN_STATE); CHAN_STATE.tt(UNDERSCORE, CHAN_STATE); CHAN_STATE.tt(DOMAIN, CHAN_STATE); CHAN_STATE.tt(TLD, CHAN_STATE); CHAN_STATE.tt(LOCALHOST, CHAN_STATE); const CHAN_DIVIDER_STATE = CHAN_STATE.tt(DOT); CHAN_DIVIDER_STATE.tt(UNDERSCORE, CHAN_STATE); CHAN_DIVIDER_STATE.tt(DOMAIN, CHAN_STATE); CHAN_DIVIDER_STATE.tt(TLD, CHAN_STATE); CHAN_DIVIDER_STATE.tt(LOCALHOST, CHAN_STATE); }); export default function linkify(text, onClick) { let links = linkifyjs.find(text); let children = []; let last = 0; links.forEach((match) => { if (!match.isLink) { return; } const prefix = text.substring(last, match.start) children.push(prefix); children.push(html` ${match.value} `); last = match.end; }); const suffix = text.substring(last) children.push(suffix); return children; }