function addMention(buffer, matches, state) { let username = matches[1] || matches[2]; let { getURL, mentionLookup, formatUsername } = state.md.options.discourse; let type = mentionLookup && mentionLookup(username); let tag = "a"; let className = "mention"; let href = null; if (type === "user") { href = getURL("/u/") + username.toLowerCase(); } else if (type === "group") { href = getURL("/groups/") + username; className = "mention-group"; } else { tag = "span"; } let token = new state.Token("mention_open", tag, 1); token.attrs = [["class", className]]; if (href) { token.attrs.push(["href", href]); } buffer.push(token); if (formatUsername) { username = formatUsername(username); } token = new state.Token("text", "", 0); token.content = "@" + username; buffer.push(token); token = new state.Token("mention_close", tag, -1); buffer.push(token); } export function setup(helper) { helper.registerOptions((opts, siteSettings) => { opts.features.mentions = !!siteSettings.enable_mentions; }); helper.registerPlugin(md => { const rule = { matcher: /@(\w[\w.-]{0,58}\w)|@(\w)/, onMatch: addMention }; md.core.textPostProcess.ruler.push("mentions", rule); }); }