用户:Staf Irity/JavaScript/ProjectDivide HydraCardShow.js

来自Limbo Wiki Mirror

注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
/**
 * 原始文件改自llwiki.org/zh/User:Bhsd/widget/listen.js,以CC BY-NC-SA 4.0知识共享协议分发。
 * @Function: demo
 * @Author: SST, [LLwiki]
 */
"use strict";
/* global mw, $ */

class Card {
    ID = "Dummy ID";
    pack;
    isWhims;
    name;
    kb;
    rarity;
    skill;
    information;
    rawHTML;
    type;
    constructor(name) {
        this.name = name;
    }
    setRarity(txt){
        if (txt.indexOf("S") !== -1){this.rarity = "S";}
        else if (txt.indexOf("A") !== -1){this.rarity = "A";}
        else if (txt.indexOf("B") !== -1){this.rarity = "B";}
        else if (txt.indexOf("C") !== -1){this.rarity = "C";}
        else {this.rarity = "Undefined";}
    }
    getDisplay(){return "";}
}
class CharacterCard extends Card {
    EP;
    BP;
    type = "C";
    supports = [];
    attibutes = [];
}
class PlaceCard extends Card {
    EP;
    canMove;
    maxDamage;
    attibutes = [];
    type = "P";
}
class ActionCard extends Card {
    type = "A";
}
class counTerCard extends Card {
    type = "T";
}

var DataCard = [];
var DataSelector = {
    Rarity: {
        type: "equal",
        list: ["S","A","B","C"],
        target: "rarity"
    },
    Pack: {
        type: "equal",
        list: [],
        target: "pack"
    },
    Type: {
        type: "equal",
        hasI18n: true,
        list: ["C", "P", "A", "T"],
        listI18n: ["角色卡", "置物卡", "行动卡", "反击卡"],
        target: "type"
    },
    IsWhims: {
        type: "equal",
        hasI18n: true,
        list: [true,false],
        listI18n: ["是", "否"],
        target: "isWhims"
    },
};

function initCurrentSelector(){
    for (var key in DataSelector) {
        var value = DataSelector[key];
        value.currentList = [];
        var SelectorButtons = document.getElementById("HydraSelector_" + key).childNodes[1].childNodes;
        for(var i=0;i<SelectorButtons.length;i++){
            var isEnabled = SelectorButtons[i].classList.contains("enabled");
            if(isEnabled){value.currentList.push(value.list[i]);}
        }
    }
}
function isCardSelected(card){
    for (var key in DataSelector) {
        var value = DataSelector[key];
        if(value.currentList.length <= 0){}
        else if(value.type == "equal"){
            var compared = card[value.target];
            var selected = false;
            for (var i = 0;i < value.currentList.length;i++){
                var item = value.currentList[i];
                if(compared == item){selected = true;}
            }
            if(!selected){return false;}
        }
        else{console.log("!!! wtf is the type? " + value.type);}
    }
    return true;
}

var cardPackName = "";
function getAttitubeListFromHTML(html) {//把文本转换为属性列表,晚点记得重写。
    return [html];
}

function getNodeFromTBody(tbody,x,y){
    var X = 0;
    var trs = tbody.childNodes;
    for(var i = 0;i < trs.length;i++) {
        var node = trs[i];
        if(node.nodeName == "TR"){
            if(X == x){
                var Y = 0;
                var tds = node.childNodes;
                for(var j = 0;j < tds.length;j++) {
                    var node2 = tds[j];
                    if(node2.nodeName == "TD" || node2.nodeName == "TH"){
                        if(Y == y){return node2;}
                        Y++;
                    }
                }
            }
            X++;
        }  
    }
    return tbody.childNodes[x].childNodes[y];
}

function readData(tableNode){//格式和模板是一一对应的,改模板之前一定要记得改这个!!!
    var tbody = tableNode.childNodes[1];
    if (tableNode.classList.contains("CharacterCard")){
        //console.log(tbody.childNodes);
        var card = new CharacterCard(getNodeFromTBody(tbody,0,0).innerText);
        card.pack = cardPackName;
        card.ID = getNodeFromTBody(tbody,1,1).innerText;
        card.isWhims = (card.ID.indexOf("W") !== -1);//临时方案,记得改
        card.kb = getNodeFromTBody(tbody,1,3).innerText;
        card.attibutes = getAttitubeListFromHTML(getNodeFromTBody(tbody,2,1).innerHTML);
        card.setRarity(getNodeFromTBody(tbody,3,1).innerText);
        card.EP = getNodeFromTBody(tbody,3,3).innerHTML;
        card.BP = getNodeFromTBody(tbody,3,5).innerHTML;
        card.skill = getNodeFromTBody(tbody,5,0).innerHTML;
        card.supports = [getNodeFromTBody(tbody,5,1).innerHTML];
        card.information = getNodeFromTBody(tbody,6,0).innerHTML;

        card.rawHTML = tableNode.outerHTML;

        DataCard.push(card);
        //console.log(card);
    }
    else if (tableNode.classList.contains("PlaceCard")){
        var card = new PlaceCard(getNodeFromTBody(tbody,0,0).innerText);
        card.pack = cardPackName;
        card.ID = getNodeFromTBody(tbody,1,1).innerText;
        card.isWhims = (card.ID.indexOf("W") !== -1);//临时方案,记得改
        card.kb = getNodeFromTBody(tbody,1,3).innerText;

        card.attibutes = getAttitubeListFromHTML(getNodeFromTBody(tbody,2,1).innerHTML);
        card.canMove = getNodeFromTBody(tbody,2,3).innerHTML;

        card.setRarity(getNodeFromTBody(tbody,3,1).innerText);
        card.EP = getNodeFromTBody(tbody,3,3).innerHTML;
        card.maxDamage = getNodeFromTBody(tbody,3,5).innerHTML;

        card.skill = getNodeFromTBody(tbody,4,1).innerHTML;
        card.information = getNodeFromTBody(tbody,5,1).innerHTML;

        card.rawHTML = tableNode.outerHTML;

        DataCard.push(card);
    }
    else if (tableNode.classList.contains("ActionCard")){
        var card = new ActionCard(getNodeFromTBody(tbody,0,0).innerText);
        card.pack = cardPackName;
        card.ID = getNodeFromTBody(tbody,1,1).innerText;
        card.isWhims = (card.ID.indexOf("W") !== -1);//临时方案,记得改
        card.kb = getNodeFromTBody(tbody,1,3).innerText;
        card.setRarity(getNodeFromTBody(tbody,1,5).innerText);
        card.skill = getNodeFromTBody(tbody,2,1).innerHTML;
        card.information = getNodeFromTBody(tbody,3,1).innerHTML;

        card.rawHTML = tableNode.outerHTML;

        DataCard.push(card);
    }
    else if (tableNode.classList.contains("CounterCard")){
        var card = new counTerCard(getNodeFromTBody(tbody,0,0).innerText);
        card.pack = cardPackName;
        card.ID = getNodeFromTBody(tbody,1,1).innerText;
        card.isWhims = (card.ID.indexOf("W") !== -1);//临时方案,记得改
        card.kb = getNodeFromTBody(tbody,1,3).innerText;
        card.setRarity(getNodeFromTBody(tbody,1,5).innerText);
        card.skill = getNodeFromTBody(tbody,2,1).innerHTML;
        card.information = getNodeFromTBody(tbody,3,1).innerHTML;

        card.rawHTML = tableNode.outerHTML;

        DataCard.push(card);
    }
}

function readAllData(divNode){
    for(var i = 0;i < divNode.childNodes.length;i++) {
        var node = divNode.childNodes[i];
        //console.log(node);
        if(typeof node.classList === "undefined"){}//判断undefined
        else if(node.classList.contains("citizen-table-wrapper")){//Citizen皮肤(林百未实装)
            readData(node.childNodes[0]);
        }
        else if(node.classList.contains("content-table-wrapper")){//Timeless皮肤
            readData(node.childNodes[3].childNodes[0])
        }
        else if(node.nodeName == "TABLE"){//除了上述俩皮肤之外的其他皮肤
            readData(node);
        }
    }
}

function refresh(){
    var HydraShower = document.getElementById("HydraShower");
    var HydraTemp = document.getElementById("HydraTemp");
    var txt = ""
    initCurrentSelector();
    for(var i = 0;i < DataCard.length;i++){
        if(isCardSelected(DataCard[i])){txt += HydraTemp.childNodes[i].outerHTML;}
    }
    HydraShower.innerHTML = txt;
}

(RLQ=window.RLQ||[]).push(function(){
	mw.widget = mw.widget || {};
	if (mw.widget.HydraCardShow){return;}
	mw.widget.HydraCardShow = true;
	mw.loader.implement("lw.pagejs.pd.hcs",function (jQuery,$){
		$(document).ready(function(){
			console.log('HydraCardShow Loaded.');
            
            //Step 1.装载数据
            var HydraTarget = document.getElementById("HydraTarget");//首先获取原始的数据
            var nodeList = HydraTarget.childNodes;//然后再获得其子元素
            var current_status = false;//状态机,但是只有两种:true=已经找到了h3,在等接下来的PDBox;false=等下一个h3
            
            for(var i = 0;i < nodeList.length;i++) {
                var node = nodeList[i];
                //console.log(node);
                if(current_status) {
                    if((typeof node.classList !== "undefined") && node.classList.contains("PDBox")){
                        //console.log(i);
                        current_status = false;
                        DataSelector.Pack.list.push(cardPackName);
                        readAllData(node);//读数据,不用多解释吧
                    }
                }
                else {
                    if(node.nodeName == "H3"){//找到了h3
                        //console.log(i);
                        current_status = true;
                        //h3的架构在每个皮肤都是一样的:如果含有非ASCII字符,那么[0]是一个固定id的span,[1]是显示的文本;否则[0]是显示的文本。
                        cardPackName = node.childNodes[0].innerText == "" ? node.childNodes[1].innerText : node.childNodes[0].innerText;
                    }
                }
            }
            //Step 2.创建缓存
            var HydraTemp = document.getElementById("HydraTemp");
            for(var i = 0;i < DataCard.length;i++){
                var div = document.createElement('div');
                div.className = 'Card';
                div.innerHTML = DataCard[i].rawHTML;
                HydraTemp.appendChild(div);
            }

            //Step 3.创建选择器
            for (var key in DataSelector) {
                var value = DataSelector[key];
                value.currentList = [];//初始化
                var SelectorButton = document.getElementById("HydraSelector_" + key).childNodes[1];
                var list = (value.hasI18n === true) ? value.listI18n : value.list;
                for(var i = 0;i < value.list.length;i++){
                    var txt = list[i];
                    var button = document.createElement('span');
                    button.className = 'pd-button disabled';
                    button.innerHTML = txt;
                    SelectorButton.appendChild(button);
                }
                //if(value.type == "equal"){}
            }
            $("#HydraSelector .Buttons span.pd-button").click(function(){
                $(this).toggleClass("disabled");
                $(this).toggleClass("enabled");
                refresh();
            });

            //Step 4.刷新
            refresh();
		});
	});
});