MAL Voice Actor Filter

This script filters voice actor: "Voice Acting Roles" and anime staff: "Anime Staff Positions" by your anime list entries

目前為 2014-10-11 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// MAL Voice Actor Filter!
// version 1.2
// 2010-06-14
// Copyright (c) 2009, Bastvera <[email protected]>
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
//
// --------------------------------------------------------------------
//
// This is a Greasemonkey user script.
//
// To install, you need Greasemonkey: http://greasemonkey.mozdev.org/
// Then restart Firefox and revisit this script.
// Under Tools, there will be a new menu item to "Install User Script".
// Accept the default configuration and install.
//
// To uninstall, go to Tools/Manage User Scripts,
// select "MAL Voice Actor Filter", and click Uninstall.
//
// --------------------------------------------------------------------
//
// ==UserScript==
// @name           MAL Voice Actor Filter
// @namespace      http://thayanger.neostrada.pl
// @include        http://myanimelist.net/people/*
// @include        http://myanimelist.net/people.php?id=*
// @description    This script filters voice actor: "Voice Acting Roles" and anime staff: "Anime Staff Positions" by your anime list entries
// @author         Bastvera <[email protected]>
// @version        1.2.1
// ==/UserScript==
 
//All edit buttons in "Voice Acting Roles"
var allEdits = document.evaluate(
    "//td[@style='padding-left: 5px;']//table[1]//a[@class='Lightbox_AddEdit button_edit']",
    document,
    null,
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
    null);
//All edit buttons in "Anime Staff Positions"
var allEditsStaff = document.evaluate(
    "//td[@style='padding-left: 5px;']//table[2]//a[@class='Lightbox_AddEdit button_edit']",
    document,
    null,
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
    null);

//Correct Table check
var antyStaff = allEdits.snapshotItem(0);
antyStaff = antyStaff.parentNode.parentNode.parentNode.parentNode.parentNode.previousSibling;
var convert=antyStaff.innerHTML;
var finder = convert.search("Voice Acting Roles");
var finderStaff = convert.search("Anime Staff Positions");
	
if(finder!=-1){
	
    //Elements placing
    var checkboxAnchor = allEdits.snapshotItem(0);
    checkboxAnchor = checkboxAnchor.parentNode.parentNode.parentNode.parentNode.parentNode.previousSibling;
		
    var newElement = document.createElement('BR');
    checkboxAnchor.appendChild(newElement);
	
    var checkbox = document.createElement('input');
    checkbox.type = 'checkbox';
    checkbox.defaultChecked = false;
    checkboxAnchor.appendChild(checkbox);

    newElement = document.createElement('label');
    newElement.setAttribute('for','firstName');
    newElement.appendChild(document.createTextNode('Filter entries by your Anime List.'));
    checkboxAnchor.appendChild(newElement);
    newElement.style.fontWeight="normal";
    newElement.style.fontSize="10px";
	
    //Arrays for storing elements
    var editdiv = [];	//Edit button Div
    var moe = [];		//Char Name
    var role = [];		//Main/Support Div
	
    //Edit Entries Segments
    for (var i = 0; i < allEdits.snapshotLength; i++){
        var AnchorLink = allEdits.snapshotItem(i);
        editdiv[i] = AnchorLink.parentNode;									//Edit button Div
        role[i] = editdiv[i].parentNode.nextSibling.nextSibling.lastChild;	//Main/Support Div
        moe[i] = editdiv[i].parentNode.nextSibling.nextSibling.firstChild;	//Char Name
    }

    //Arrays for storing elements
    var editdivStaff = [];	//Edit button Div
	
    //Edit Entries Segments
    for (var i = 0; i < allEditsStaff.snapshotLength; i++){
        var AnchorLink = allEditsStaff.snapshotItem(i);
        editdivStaff[i] = AnchorLink;									//Edit button Div
    }
	
    //All add buttons in "Voice Acting Roles"
    var	allElements = document.evaluate(
        "//td[@style='padding-left: 5px;']//a[@class='Lightbox_AddEdit button_add']", //"//td[@style='padding-left: 5px;']//table[1]//a[@class='Lightbox_AddEdit button_add']",
        document,
        null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null);

    //Array with add buttons div
    var addbutton = [];
    for (i = 0; i < allElements.snapshotLength; i++){
        AnchorLink = allElements.snapshotItem(i);
        addbutton[i] = AnchorLink.parentNode.parentNode.parentNode;		//Main Div with Add button
    }

    //Div backup
    var backup = [];
    var orginal = [];
    var backpos = 0;
	
    //Get or Set status of checkbox
    var checkboxmem = GM_getValue('checkboxmem'); //Get chceckbox status
    if(checkboxmem==null){
        checkboxmem=false;
        GM_setValue('checkboxmem', checkboxmem);
        checkbox.checked=checkboxmem;
    }
    else{
        checkbox.checked=checkboxmem;
        if(checkbox.checked==true){
            HideDivs(editdivStaff);
        }
    }
		
    //Listener
    checkbox.addEventListener('change',function () {
			
        if(checkbox.checked==true){
            HideDivs(editdivStaff);
        }

        if(checkbox.checked==false){
            RestoreDivs();
            RestoreDivsStaff(editdivStaff);
        }
		
		GM_setValue('checkboxmem', checkbox.checked);
		
    },false)
}

if(finderStaff!=-1){
	
    //Elements placing
    var checkboxAnchor = allEdits.snapshotItem(0);
    checkboxAnchor = checkboxAnchor.parentNode.parentNode.parentNode.parentNode.parentNode.previousSibling;
		
    var newElement = document.createElement('BR');
    checkboxAnchor.appendChild(newElement);
	
    var checkbox = document.createElement('input');
    checkbox.type = 'checkbox';
    checkbox.defaultChecked = false;
    checkboxAnchor.appendChild(checkbox);

    newElement = document.createElement('label');
    newElement.setAttribute('for','firstName');
    newElement.appendChild(document.createTextNode('Filter entries by your Anime List.'));
    checkboxAnchor.appendChild(newElement);
    newElement.style.fontWeight="normal";
    newElement.style.fontSize="10px";

    //Arrays for storing elements
    var editdiv = [];	//Edit button Div
	
    //Edit Entries Segments
    for (var i = 0; i < allEdits.snapshotLength; i++){
        var AnchorLink = allEdits.snapshotItem(i);
        editdiv[i] = AnchorLink;									//Edit button Div
    }

    //All add buttons in "Voice Acting Roles"
    var	allElements = document.evaluate(
        "//td[@style='padding-left: 5px;']//a[@class='Lightbox_AddEdit button_add']", //"//td[@style='padding-left: 5px;']//table[1]//a[@class='Lightbox_AddEdit button_add']",
        document,
        null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null);

    //Array with add buttons div
    var addbutton = [];
    for (i = 0; i < allElements.snapshotLength; i++){
        AnchorLink = allElements.snapshotItem(i);
        addbutton[i] = AnchorLink.parentNode.parentNode.parentNode;		//Main Div with Add button
    }

    //Div backup
    var backup = [];
    var orginal = [];
    var backpos = 0;
	
    //Get or Set status of checkbox
    var checkboxmem = GM_getValue('checkboxmem'); //Get chceckbox status
    if(checkboxmem==null){
        checkboxmem=false;
        GM_setValue('checkboxmem', checkboxmem);
        checkbox.checked=checkboxmem;
    }
    else{
        checkbox.checked=checkboxmem;
        if(checkbox.checked==true)
            HideDivs(editdiv);
    }
		
    //Listener
    checkbox.addEventListener('change',function () {
			
        if(checkbox.checked==true){
            HideDivs(editdiv);
        }

        if(checkbox.checked==false){
            RestoreDivsStaff(editdiv);
        }
		
		GM_setValue('checkboxmem', checkbox.checked);
		
    },false)
}


function HideDivs(editDivStaff){
    //Hide all div with add
    for (var current in addbutton){
        addbutton[current].style.display="none";
    }

    //Hide edit Div
    var current;
    for (current in editDivStaff){
        editDivStaff[current].style.display="none";
    }
			
    for(current in moe){
                     
        var curpos = current;
        curpos++;
	
        if(editdiv[current].parentNode.parentNode.getAttribute('style')!="display: none;"){ //Modify root entries only
					
            //Div backup storage
            backup[backpos] = editdiv[current].parentNode.parentNode.cloneNode(true);
            orginal[backpos] = editdiv[current].parentNode.parentNode;
            backpos++;
					
            //Root /Main/Support text add
            var temp = role[current].innerHTML;										//Main/Support text
            temp = temp.replace(/&nbsp;/,"");										//Main/Support clear
            var line = document.createTextNode('\n'+ temp);
            editdiv[current].parentNode.appendChild(line);
					
            //Root hide elements
            role[current].style.display="none";										//Hide Main/Support Div
            editdiv[current].style.display="none";									//Hide edit and airing Div
					
            for( curpos ; curpos < allEdits.snapshotLength; curpos++){
                if(moe[curpos].href==moe[current].href){ //Compare entries by moe name ^_^
		 
                    var br = document.createElement('br');
							
                    //Add Similar anime name
                    editdiv[current].parentNode.appendChild(br);
                    var newNode=editdiv[curpos].parentNode.firstChild.cloneNode(true);
                    editdiv[current].parentNode.appendChild(newNode);
							
                    //Similar /Main/Support text add
                    temp = role[curpos].innerHTML;
                    temp = temp.replace(/&nbsp;/,"");
                    line = document.createTextNode('\n'+temp);
                    editdiv[current].parentNode.appendChild(line);
							
                    //Hide Similar Div
                    editdiv[curpos].parentNode.parentNode.style.display="none";
                }
            }
        }
    }
}

function RestoreDivsStaff(editDivStaff){

    //Unhide add entries
    for(current in addbutton){
        addbutton[current].removeAttribute('style');
    }

    for(current in editDivStaff){
        editDivStaff[current].removeAttribute('style');
    }
}
			
function RestoreDivs(){
			
    //Restore Modified Divs
    for(var current in  backup){
        orginal[current].parentNode.replaceChild(backup[current],orginal[current]);
    }
			
    //Unhide Similar
    for(current in  editdiv){
        editdiv[current].parentNode.parentNode.removeAttribute('style');
    }
			
    //Unhide add entries
    for(current in addbutton){
        addbutton[current].removeAttribute('style');
    }

    //Rescan all edit entries
    allEdits = document.evaluate(
        "//td[@style='padding-left: 5px;']//table[1]//a[@class='Lightbox_AddEdit button_edit']",
        document,
        null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null);

    for (var i = 0; i < allEdits.snapshotLength; i++){
        AnchorLink = allEdits.snapshotItem(i);
        editdiv[i] = AnchorLink.parentNode;									//Edit button Div
        role[i] = editdiv[i].parentNode.nextSibling.nextSibling.lastChild;	//Main/Support Div
        moe[i] = editdiv[i].parentNode.nextSibling.nextSibling.firstChild;	//Char Name
    }

    //Rescan all edit entries
    allEditsStaff = document.evaluate(
        "//td[@style='padding-left: 5px;']//table[2]//a[@class='Lightbox_AddEdit button_edit']",
        document,
        null,
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
        null);
			
    for (var i = 0; i < allEditsStaff.snapshotLength; i++){
        AnchorLink = allEditsStaff.snapshotItem(i);
        editdivStaff[i] = AnchorLink;									//Edit button Div
    }
			
    //Reset backups
    backup = [];
    orginal = [];
    backpos = 0;
}