Ticket #3409: t3409_highlight_playernames_v10.patch

File t3409_highlight_playernames_v10.patch, 3.5 KB (added by elexis, 8 years ago)
  • binaries/data/mods/public/gui/common/functions_utility.js

    function sortNameIgnoreCase(x, y)  
    5454    else
    5555        return 0;
    5656}
    5757
    5858/**
     59 * Colorizes playernames in the given text and escapes the remaining text.
     60 * Requires g_PlayerAssignments and colorizePlayernameByGUID.
     61 */
     62function highlightPlayernames(text)
     63{
     64    // Check longest playernames first, in case one playername is part of another
     65    let sortedGUIDs = Object.keys(g_PlayerAssignments).sort((guidA, guidB) =>
     66        g_PlayerAssignments[guidB].name.length - g_PlayerAssignments[guidA].name.length
     67    );
     68
     69    let tmpBuffer = "";
     70    let output = "";
     71    let charIndex = 0;
     72
     73    // Replace all occurances of all playernames from left to right
     74    while (charIndex < text.length)
     75    {
     76        let replaced = false;
     77        for (let guid of sortedGUIDs)
     78        {
     79            let playername = g_PlayerAssignments[guid].name;
     80            if (text.indexOf(playername, charIndex) != charIndex)
     81                continue;
     82
     83            output += escapeText(tmpBuffer) + colorizePlayernameByGUID(guid);
     84            charIndex += playername.length;
     85            tmpBuffer = "";
     86            replaced = true;
     87            break;
     88        }
     89
     90        if (!replaced)
     91            tmpBuffer += text[charIndex++];
     92    }
     93
     94    if (tmpBuffer.length)
     95        output += escapeText(tmpBuffer);
     96
     97    return output;
     98}
     99
     100/**
    59101 * Escape tag start and escape characters, so users cannot use special formatting.
    60102 * Also limit string length to 256 characters (not counting escape characters).
    61103 */
    62104function escapeText(text)
    63105{
  • binaries/data/mods/public/gui/gamesetup/gamesetup.js

    const g_FormatChatMessage = {  
    4545    "disconnect": (msg, user) => systemMessage(sprintf(translate("%(username)s has left"), { "username": user })),
    4646    "kicked": (msg, user) => systemMessage(sprintf(translate("%(username)s has been kicked"), { "username": user })),
    4747    "banned": (msg, user) => systemMessage(sprintf(translate("%(username)s has been banned"), { "username": user })),
    4848    "chat": (msg, user) => sprintf(translate("%(username)s %(message)s"), {
    4949        "username": senderFont(sprintf(translate("<%(username)s>"), { "username": user })),
    50         "message": escapeText(msg.text || "")
     50        "message": highlightPlayernames(msg.text || "")
    5151    }),
    5252    "ready": (msg, user) => sprintf(translate("* %(username)s is ready!"), {
    5353        "username": user
    5454    }),
    5555    "not-ready": (msg, user) => sprintf(translate("* %(username)s is not ready."), {
  • binaries/data/mods/public/gui/session/messages.js

    function formatChatCommand(msg)  
    736736            translateObjectKeys(parameters, msg.translateParameters);
    737737            msg.text = sprintf(msg.text, parameters);
    738738        }
    739739    }
    740740    else
    741         msg.text = escapeText(msg.text);
     741        msg.text = highlightPlayernames(msg.text);
    742742
    743743    // GUID for players, playerID for AIs
    744744    let coloredUsername = msg.guid != -1 ? colorizePlayernameByGUID(msg.guid) : colorizePlayernameByID(msg.player);
    745745
    746746    return sprintf(g_ChatCommands[isMe ? "me" : "regular"][msg.context ? "context" : "no-context"], {