Improve d->m highlighting for toki pona community

This commit is contained in:
Cadence Ember
2026-08-23 02:58:00 +12:00
parent cf12293d5c
commit c7389ff2d6
2 changed files with 49 additions and 3 deletions
+8 -3
View File
@@ -107,7 +107,6 @@ function tokenise(name) {
* @returns {ProcessedJoined} * @returns {ProcessedJoined}
*/ */
function processJoined(joined) { function processJoined(joined) {
joined = joined.filter(j => !userRegex.some(rx => j.mxid.match(rx)))
return { return {
mxids: joined.map(j => { mxids: joined.map(j => {
const localpart = j.mxid.match(/@([^:]*)/) const localpart = j.mxid.match(/@([^:]*)/)
@@ -141,8 +140,14 @@ function findMention(pjr, maximumWrittenSection, baseOffset, prefix, content) {
/** @type {{mxid: string, scored: {score: number, matchedInputTokens: Token[]}}[]} */ /** @type {{mxid: string, scored: {score: number, matchedInputTokens: Token[]}}[]} */
let allItems = pjr.mxids.map(mxid => ({...mxid, scored: scoreLocalpart(mxid.localpart, maximumWrittenSection, mxid.displayname)})) let allItems = pjr.mxids.map(mxid => ({...mxid, scored: scoreLocalpart(mxid.localpart, maximumWrittenSection, mxid.displayname)}))
allItems = allItems.concat(pjr.names.map(name => ({...name, scored: scoreName(name.displaynameTokens, maximumWrittenSectionTokens)}))) allItems = allItems.concat(pjr.names.map(name => ({...name, scored: scoreName(name.displaynameTokens, maximumWrittenSectionTokens)})))
const best = allItems.sort((a, b) => b.scored.score - a.scored.score)[0] // Tiebreaker bonus for Matrix users
if (best.scored.score > 4) { // requires in smallest case perfect match of 2 characters, or in largest case a partial middle match of 5+ characters in a row for (const item of allItems) {
if (!userRegex.some(rx => item.mxid.match(rx))) item.scored.score += 1
}
const [best, secondBest] = allItems.sort((a, b) => b.scored.score - a.scored.score)
if (userRegex.some(rx => best.mxid.match(rx))) return // Discord user was best match, so it was just a written non-pinging @ for a Discord user. Don't highlight a Matrix user.
if (secondBest && secondBest.scored.score === best.scored.score) return // all tied up
if (best.scored.score > 5) { // requires in smallest case Matrix user tiebreaker + perfect match of 2 characters, or in largest case a partial middle match of 5+ characters in a row
// Highlight the relevant part of the message // Highlight the relevant part of the message
const start = baseOffset + best.scored.matchedInputTokens[0].index const start = baseOffset + best.scored.matchedInputTokens[0].index
const end = baseOffset + prefix.length + best.scored.matchedInputTokens.slice(-1)[0].end const end = baseOffset + prefix.length + best.scored.matchedInputTokens.slice(-1)[0].end
+41
View File
@@ -117,6 +117,47 @@ test("score name: finds match location", t => {
t.equal(message.slice(startLocation, endLocation), "evil lillith") t.equal(message.slice(startLocation, endLocation), "evil lillith")
}) })
test("score name: matches the correct jan", t => {
const names = [
"jan Kanoli",
"jan Mijawi",
"jan Mukin"
]
t.deepEqual(names.map(n => scoreName(tokenise(n), tokenise("jan Mijawi")).score), [
6,
18.4,
6
])
})
test("find mention: highlights nothing if a Discord user scored highest", t => {
const found = findMention(processJoined([{
mxid: "@jankanoli:matrix.org",
displayname: "jan Kanoli"
}, {
mxid: "@_ooye_jan_mijawi:cadence.moe",
displayname: "jan Mijawi"
}, {
mxid: "@_ooye_jan_mukin:cadence.moe",
displayname: "jan Mukin"
}]), "jan Mijawi, run this\n.def", 0, "@", "jan Mijawi, run this\n.def")
t.equal(found, undefined)
})
test("find mention: highlights nothing if all tied", t => {
const found = findMention(processJoined([{
mxid: "@jankanoli:matrix.org",
displayname: "jan Kanoli"
}, {
mxid: "@_ooye_jan_mijawi:cadence.moe",
displayname: "jan Mijawi"
}, {
mxid: "@_ooye_jan_mukin:cadence.moe",
displayname: "jan Mukin"
}]), "jan Misali, run this\n.def", 0, "@", "jan Misali, run this\n.def")
t.equal(found, undefined)
})
test("find mention: test various tiebreakers", t => { test("find mention: test various tiebreakers", t => {
const found = findMention(processJoined([{ const found = findMention(processJoined([{
mxid: "@emma:conduit.rory.gay", mxid: "@emma:conduit.rory.gay",