Reverse "Lastname, Firstname" on MyAnimeList
// ==UserScript==
// @name MyAnimeList Actor and Character Name Reverse
// @namespace http://tampermonkey.net/
// @version 1.7
// @description Reverse "Lastname, Firstname" on MyAnimeList
// @author Ruben Van den Broeck
// @license MIT
// @match https://myanimelist.net/*
// @run-at document-start
// ==/UserScript==
(function() {
'use strict';
const observer = new MutationObserver(mutations => {
for (const mutation of mutations) {
for (const node of mutation.addedNodes) {
if (node.nodeType === Node.ELEMENT_NODE) fixNames(node);
}
}
});
function reverseName(str) {
if (!str.includes(',')) return str;
const parts = str.split(',').map(s => s.trim());
if (parts.length === 2) return parts[1] + ' ' + parts[0];
return str;
}
function fixNames(root) {
root.querySelectorAll('h1.title-name, h1.title-name strong')
.forEach(el => el.textContent = reverseName(el.textContent.trim()));
root.querySelectorAll('td.va-t.ar.pl4.pr4 a')
.forEach(a => a.textContent = reverseName(a.textContent.trim()));
root.querySelectorAll('.js-anime-character-va .spaceit_pad a')
.forEach(a => a.textContent = reverseName(a.textContent.trim()));
root.querySelectorAll('h3.h3_characters_voice_actors a')
.forEach(a => a.textContent = reverseName(a.textContent.trim()));
root.querySelectorAll('td.borderClass[align="right"] .spaceit_pad a')
.forEach(a => a.textContent = reverseName(a.textContent.trim()));
root.querySelectorAll('td.borderClass[valign="top"] > a')
.forEach(a => a.textContent = reverseName(a.textContent.trim()));
// NEW: Character names in extended character list
root.querySelectorAll('h3.h3_character_name')
.forEach(el => el.textContent = reverseName(el.textContent.trim()));
}
observer.observe(document, { childList: true, subtree: true });
document.addEventListener('DOMContentLoaded', () => fixNames(document));
})();