diff --git a/pronoun-assistant/pronoun-assistant.user.js b/pronoun-assistant/pronoun-assistant.user.js index 3c78af0..9468deb 100644 --- a/pronoun-assistant/pronoun-assistant.user.js +++ b/pronoun-assistant/pronoun-assistant.user.js @@ -1,10 +1,12 @@ // ==UserScript== // @name Stack Exchange Pronoun Assistant // @namespace https://github.com/Glorfindel83/ -// @description Displays users' pronouns +// @description Displays users' pronouns (mentioned in their profiles) in chat +// @author Glorfindel +// @contributor ArtOfCode // @updateURL https://raw.githubusercontent.com/Glorfindel83/SE-Userscripts/master/pronoun-assistant/pronoun-assistant.user.js // @downloadURL https://raw.githubusercontent.com/Glorfindel83/SE-Userscripts/master/pronoun-assistant/pronoun-assistant.user.js -// @version 0.1 +// @version 0.2 // @match *://*.stackexchange.com/* // @match *://*.stackoverflow.com/* // @match *://*.superuser.com/* @@ -18,26 +20,51 @@ // @exclude *://elections.stackexchange.com/* // @exclude *://openid.stackexchange.com/* // @exclude *://stackexchange.com/* -// @grant none +// @grant GM_addStyle // @require https://gist.github.com/raw/2625891/waitForKeyElements.js // ==/UserScript== /* global $ */ -let pronouns = [ +GM_addStyle(` +.tiny-signature { + display: inline-flex; + flex-direction: row-reverse; + align-items: center; +} + +.username { + height: unset !important; +} + +.pronouns { + color: #777; +} +`) + +// List of pronouns to look out for +let allPronouns = [ "he", "him", "his", "she", "her", - "they", "them", + "they", "them", "their", "ze", "hir", "zir", "xey", "xem", "xyr" ]; +// Regex to detect instances where users put the pronouns inside parentheses etc., +// e.g. (he/him) let pronounsComponent = /^[^\w\/]*([\w\/]+)[^\w\/]*$/; + +// Keys: user IDs +// Values: either a list of DOM elements (specifically, the anchors to chat profiles) +// or a string with pronouns. var users = {}; -function addInformation(element, information) { - if (information != "") { - element.append($("" + information + "")); - } +function addPronouns(element, pronouns) { + if (pronouns == "") + return; + let usernameElement = element.find("div.username")[0]; + usernameElement.innerHTML = '' + usernameElement.innerHTML + '
' + + '' + pronouns + ''; } if (window.location.host.startsWith("chat.")) { @@ -47,7 +74,7 @@ if (window.location.host.startsWith("chat.")) { users[userID] = []; users[userID].push(jNode); $.get("https://chat.stackexchange.com/users/thumbs/" + userID + "?showUsage=true", function(data) { - var information = ""; + var pronouns = ""; if (data.user_message != null) { // Check the user's 'about' in their chat profile for pronouns (see above for the list) // joined by a forward slash. @@ -60,26 +87,29 @@ if (window.location.host.startsWith("chat.")) { for (let component of data.user_message.split(/\s+/)) { if (!component.includes("/")) continue; - var allPronouns = true; - for (let word of pronounsComponent.exec(component)[1].split("/")) { - if (!pronouns.includes(word.toLowerCase())) { - allPronouns = false; + let match = pronounsComponent.exec(component); + if (match == null) + continue; + var isAllPronouns = true; + for (let word of match[1].split("/")) { + if (!allPronouns.includes(word.toLowerCase())) { + isAllPronouns = false; break; } }; - if (allPronouns) { - information = component; + if (isAllPronouns) { + pronouns = component; break; } } } users[userID].forEach(function (element) { - addInformation(element, information); + addPronouns(element, pronouns); }); - users[userID] = information; + users[userID] = pronouns; }); } else if (typeof users[userID] == 'string') { - addInformation(jNode, users[userID]); + addPronouns(jNode, users[userID]); } else { users[userID].push(jNode); }