MediaWiki:Common.js

MediaWiki系统消息页面

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

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Internet Explorer或Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
  • Opera:Ctrl-F5
/* 这里的任何JavaScript将为所有用户在每次页面载入时加载。 */

/* button-switch-display */
var button_switch_display_state = {};

initialize(
    function () {
        /* data-css data-js */
        $("[data-css]").each(function () {
             var $this = $(this);
             $this.css("display", "none");
             $("body").append("<style>" + $this.html().replace(/&gt;/g, ">") + "</style>");
        });
        $("[data-js]").each(function () {
             var $this = $(this);
             $this.css("display", "none");
             $("body").append("<script>" + $this.html().replace(/&gt;/g, ">").replace(/&lt;/g, "<").replace(/&amp;/g, "&") + "</script>");
        });

        button_switch_display_init();
        button_switch_display_refresh();

        locale_time();

        count_down_initialize();

        roll_initialize();

        card_icon_text_init();
    },
    function () {
        /* 调整字体大小避免溢出容器 */
        $('#nmdwsm').html("这是坏的");
        var elems = $('.font-size-flex');
        for (var iter = 0; iter < elems.length; iter++) {
            var siz = 20;
            var style_flextext = elems[iter].style.cssText;
            while ((elems[iter].scrollHeight > elems[iter].clientHeight || elems[iter].scrollWidth > elems[iter].clientWidth) && siz >= 6) {
                if (siz > 12) siz = siz - 2;
                else siz = siz - 1;
                elems[iter].style.cssText = "font-size:" + siz + "px;" + style_flextext;
                $('#nmdwsm').html("这是好的");
                $('#nmdwsm1').html(elems[iter].scrollHeight);
                $('#nmdwsm2').html(elems[iter].clientHeight);
            }
        }
        loadScript();

        skill_ac_pass_rate_init()
        chart_show_skill_ac_pass_rate_init();
    }
);

function initialize(fn_interactive, fn_complete) {
    if (document.readyState === "complete") {
        fn_interactive();
        fn_complete();
    }
    else if (document.readyState === "interactive") {
        window.addEventListener("load", function () {
            fn_complete();
        });
        fn_interactive();
    }
    else {
        document.addEventListener("readystatechange", function () {
            if (document.readyState === "interactive") fn_interactive();
            else if (document.readyState === "complete") fn_complete();
        });
    }
}

function loadScript() {
    var script = document.createElement('script');
    script.src = 'https://llhelper.github.io/wiki-scripts/dist/wiki_script.js';
    document.body.appendChild(script);
}

/* button-switch-display */
function button_switch_display_init() {
    //令没有对应按钮的属性默认为true 而不是false
    var button_switch_display_targets = $('[data-bsd-condition]');
    for (var iter = 0; iter < button_switch_display_targets.length; iter += 1) {
        var target = button_switch_display_targets[iter];
        var condition = target.getAttribute("data-bsd-condition") || "0";
        if (!condition.match(/^[0-9!&\|\(\)]+$/)) {
            console.log("button-switch-display: " + condition + " is an illegal condition string");
            return;
        }
        condition.match(/([0-9A-Za-z]+)/g).forEach(function (key) {
            button_switch_display_state[key] = true;
        })
    }
    //设置筛选的初始值
    var button_switch_display_buttons = $('[data-bsd-activate]');
    for (var iter = 0; iter < button_switch_display_buttons.length; iter += 1) {
        var button = button_switch_display_buttons[iter];
        button.setAttribute("onclick", "button_switch_display_trigger(this)");
        button.getAttribute("data-bsd-activate") || button.setAttribute("data-bsd-activate", iter.toString());
        button.getAttribute("data-bsd-activated") === "true" || button.getAttribute("data-bsd-activated") === "false" || button.setAttribute("data-bsd-activated", "false");
        button_switch_display_state[button.getAttribute("data-bsd-activate")] = eval(button.getAttribute("data-bsd-activated"));
    }
    var button_switch_display_static_buttons = $('.button-switch-display-static');
    for (var iter = 0; iter < button_switch_display_static_buttons.length; iter += 1) {
        var button = button_switch_display_static_buttons[iter];
        button.setAttribute("onclick", "button_switch_display_trigger(this)");
    }
}

function button_switch_display_refresh() {
    var button_switch_display_buttons = $('[data-bsd-activate]');
    for (var iter = 0; iter < button_switch_display_buttons.length; iter += 1) {
        var button = button_switch_display_buttons[iter];
        var button_id = button.getAttribute("data-bsd-activate");
        button.setAttribute("data-bsd-activated", button_switch_display_state[button_id]);
    }
    var button_switch_display_targets = $('[data-bsd-condition]');
    for (var iter = 0; iter < button_switch_display_targets.length; iter += 1) {
        var target = button_switch_display_targets[iter];
        var condition = target.getAttribute("data-bsd-condition") || "0";
        if (!condition.match(/^[0-9!&\|\(\)]+$/)) {
            console.log("button-switch-display: " + condition + " is an illegal condition string");
            return;
        }
        condition = condition.replace(/([0-9A-Za-z]+)/g, "button_switch_display_state[$1]");
        // console.log(target, condition);
        if (eval(condition)) {
            target.style.cssText = target.style.cssText.replace(/display:\s*none\s*;\s*/, "");
        } else {
            if (!target.style.cssText.match(/display:\s*none/))
                target.style.cssText = "display: none;" + target.style.cssText;
        }
    }
}

function button_switch_display_trigger(button) {
    var button_id = button.getAttribute("data-bsd-activate");
    var action_set_others_index = 0;
    if (button_id) {
        button.setAttribute("data-bsd-activated", (!eval(button.getAttribute("data-bsd-activated"))).toString());
        button_switch_display_state[button_id] = eval(button.getAttribute("data-bsd-activated"));
        action_set_others_index = button_switch_display_state[button_id] + 0;
    }
    var action_set_others = button.getAttribute("data-bsd-action") || "";
    if (!action_set_others.match(/^[0-9,\+\-]*(\/[0-9,\+\-]+)?$/)) {
        console.log("button-switch-display: " + action + " is an illegal action string");
        return;
    }
    eval(
        (action_set_others.split('/')[action_set_others_index] || "")
            .replace(/([0-9a-zA-Z]+)(?![0-9a-zA-Z\+\-])/g, "$1+")
            .replace(/([0-9a-zA-z]+)-/g, "button_switch_display_state[$1]=false")
            .replace(/([0-9a-zA-z]+)\+/g, "button_switch_display_state[$1]=true")
    );
    button_switch_display_refresh();
}

/* Template:LocaleTime */
function locale_time() {
    $("[data-time]").each(function () {
        var input_string = this.getAttribute("data-time");
        var date;
        if (new Number(input_string).toString() === "NaN")
            date = new Date(input_string);
        else
            date = new Date(parseInt(input_string));
        this.innerHTML = Intl.DateTimeFormat(
            {}, { year: 'numeric', month: 'numeric', day: 'numeric', hour12: false, hour: '2-digit', minute: '2-digit' }
        ).format(date)
    });
}

/* Template:CountDown */
function count_down_initialize() {
    $("[data-countdown-start]").each(function () {
        var start_time_string = this.getAttribute("data-countdown-start");
        var end_time_string = this.getAttribute("data-countdown-end");
        var type = this.getAttribute("data-countdown-type");
        var date_start, date_end, msec_start, msec_end, msec_now;
        date_start = (new Number(start_time_string).toString() === "NaN")
            ? new Date(start_time_string)
            : new Date(parseInt(start_time_string));
        if (end_time_string && end_time_string !== "0") {
            date_end = (new Number(end_time_string).toString() === "NaN")
                ? new Date(end_time_string)
                : new Date(parseInt(end_time_string));
        } else {
            date_end = date_start;
        }
        msec_start = date_start.getTime();
        msec_end = date_end.getTime();
        msec_now = new Date().getTime()
        switch (type) {
            case "year": while (msec_end - msec_now < -86400000) {
                date_start.setFullYear(date_start.getFullYear() + 1);
                date_end.setFullYear(date_end.getFullYear() + 1);
                msec_start = date_start.getTime();
                msec_end = date_end.getTime();
            } break;
        }
        var elem = this;
        if (msec_end < msec_now) {
            this.innerHTML = "已结束";
            return;
        }
        setInterval(function () {
            count_down_refresh(elem, msec_start, msec_end);
        }, 1000);
    });
}

function count_down_refresh(element, msec_start, msec_end) {
    var msec_now = new Date().getTime();
    var text = "占位 ", msec_cmp = msec_start;
    if (msec_now < msec_start) {
        text = "未开始<br>还有 ";
        msec_cmp = msec_start;
    } else if (msec_now < msec_end) {
        text = "进行中<br>还有 ";
        msec_cmp = msec_end;
    } else {
        text = "已结束";
        msec_cmp = null;
    }
    if (msec_cmp) {
        var msec_diff = msec_cmp - msec_now;
        text += Math.floor(msec_diff / 86400000) + " 天 "
            + Math.floor(msec_diff / 3600000) % 24 + " 时 "
            + Math.floor(msec_diff / 60000) % 60 + " 分 "
            + Math.floor(msec_diff / 1000) % 60 + " 秒"
    }
    element.innerHTML = text;
}

/* roll */
function roll_initialize() {
    $('[data-roll-trigger-ids]').each(function () {
        var $this = $(this);
        $this.click(function () { roll_trigger(this); });
        if ($this.attr('data-roll-trigger-auto') === 'true') roll_trigger(this);
    });
    $('[id^="roll-result-count-"]').each(function () {
        var $this = $(this);
        if (isNaN(parseInt($this.html())))
            $this.html("0");
        if (isNaN(parseInt($this.attr('data-roll-result-count-increase'))))
            $this.attr('data-roll-result-count-increase', "1");
    })
}

function roll_trigger(elem) {
    var roll_ids = $(elem).attr('data-roll-trigger-ids').split(' ');
    roll_ids.forEach(function (id) { roll_execute(id) });
}

function roll_execute(roll_id) {
    var weight_node = $('[data-roll-source-ids~="' + roll_id + '"]').first();
    var content_types = [];
    while (true) {
        var weight_list = [], weight_total = 0, weight = null;
        var child = weight_node.children();
        child.each(function () {
            weight = $(this).attr('data-weight') || null;
            if (weight) {
                weight_total += parseInt(weight);
                weight_list.push(weight_total);
            } else {
                weight_total += 0;
                weight_list.push(weight_total);
            }
        });
        if (weight_total === 0) break;

        var random = Math.random() * weight_total;
        try {
            weight_list.forEach(function (value, index) {
                if (random < value) throw index;
            });
        } catch (index) {
            weight_node = $(child[index]);
            var content_type = weight_node.attr('data-type') || "", amount = weight_node.attr('data-amount') || 1;
            content_type.split(" ").forEach(function (type) {
                if (type.length === 0) return;
                content_types.push({ content_type: type, content_amount: amount });
            })
            continue;
        }
    }

    var content = weight_node.html();
    $('#roll-result-' + roll_id).html(content);

    var counter = $('#roll-result-count-' + roll_id);
    if (counter.length) {
        var prev = parseInt(counter.html()), incr = parseInt(counter.attr('data-roll-result-count-increase'));
        counter.html(prev + incr);
    }

    content_types.forEach(function (content_type_amount) {
        var content_type = content_type_amount.content_type, content_amount = content_type_amount.content_amount;
        var content_counter = $('#roll-content-count-' + content_type);
        if (content_counter.length) {
            var prev = parseInt(content_counter.html()), incr = parseInt(content_amount);
            content_counter.html(prev + incr);
        }

        $('#roll-content-set-' + content_type).append(content);
    });
}

/* Template:CardIconText */
function card_icon_text_init() {
  var promises = $("[data-card-id]").map(function () {
    var $this = $(this);
    var image = document.createElement("img");
    var $image = $(image);
    $image.css("width", "100%");
    $image.attr("src", '/assets/icon/' + $this.attr("data-card-id") + '_1.png');
    $this.append(image);
    return new Promise(function (res) {
      $image.on("load", function () { res() });
      $image.on("error", function () { res() });
    });
  });
  Promise.all(promises).then(function () {
    $("[data-card-id]").each(function () {
      var $this = $(this);
      var image = document.createElement("img");
      var $image = $(image);
      $image.css("width", "100%");
      $image.attr("src", '/assets/icon/' + $this.attr("data-card-id") + '_2.png');
      $this.append(image);
    })
  })
}

/* 特技AC通过率计算器 */
var SkillACPassRate;

function skill_ac_pass_rate_init() {
    SkillACPassRate = /** @class */ (function () {
        function SkillACPassRate() {
        }
        SkillACPassRate.exec = function (list, demand) {
            if (demand <= 0)
                return 1.00;
            demand = Math.ceil(demand);
            //list = list.map(([r, n]) => [Math.floor(r * 10000) / 10000, Math.floor(n)]);
            list.sort(function (a, b) { return a[1] - b[1]; });
            var result = this.__calculate(list);
            if (demand)
                return 1.00 - (result[demand - 1] !== undefined ? result[demand - 1] : 1.00);
            else {
                result.unshift(0);
                return result.map(function (p) { return 1 - p; });
            }
        };
        SkillACPassRate.__calculate = function (list) {
            var _this = this;
            var complexity = 0;
            var result_length = list.reduce(function (dist_prev_length, _a, i) {
                var r = _a[0], n = _a[1];
                var dist_new_length = dist_prev_length + n;
                complexity += dist_new_length * dist_new_length;
                return dist_new_length;
            }, 1);
            // complexity too large
            if (complexity > 1919810) {
                var N_1 = 1000000, cnt_1;
                var samples = [];
                for (var i = 0; i < result_length; i++)
                    samples[i] = 0;
                for (var k = 0; k <= N_1; k += 1) {
                    cnt_1 = 0;
                    list.forEach(function (_a) {
                        var r = _a[0], n = _a[1];
                        for (var j = 0; j < n; j++)
                            cnt_1 += Math.random() < r;
                    });
                    samples[cnt_1] += 1;
                }
                var result_1 = [];
                samples.reduce(function (pv, v, i) {
                    pv += v;
                    result_1[i] = pv;
                    return pv;
                }, 0);
                return result_1.map(function (v) { return v / N_1; });
            }
            // exact value
            this.__init(list);
            var result = list.reduce(function (dist_prev, v, i) {
                var dist_i = _this.dist[i];
                var dist_new = [];
                var sum_max = dist_prev.length + dist_i.length - 1;
                for (var sum = 0; sum < sum_max; sum++) {
                    dist_new[sum] = 0;
                    for (var j = 0; j <= sum; j++) {
                        dist_new[sum] += (dist_prev[j] !== undefined ? dist_prev[j] : 1) * (dist_i[sum - j] !== undefined ? dist_i[sum - j] : 1);
                    }
                    for (var j = 0; j <= sum - 1; j++) {
                        dist_new[sum] -= (dist_prev[j] !== undefined ? dist_prev[j] : 1) * (dist_i[sum - 1 - j] !== undefined ? dist_i[sum - 1 - j] : 1);
                    }
                }
                return dist_new;
            }, [1]);
            return result;
        };
        SkillACPassRate.__init = function (list) {
            this.dist = list.map(function (_a, i) {
                var r = _a[0], n = _a[1];
                var r_rev = 1 - r;
                var pri = [1], prirev = [1];
                var p = 1, prev = 1;
                for (var i_1 = 0; i_1 <= n; i_1++) {
                    pri[i_1] = p;
                    p = p * r;
                    prirev[i_1] = prev;
                    prev = prev * r_rev;
                }
                var pacc = 0, coef = 1;
                var pacc_array = [];
                for (var i_2 = 0; i_2 <= n; i_2++) {
                    pacc += coef * pri[i_2] * prirev[n - i_2];
                    pacc_array.push(pacc);
                    coef = coef * (n - i_2) / (i_2 + 1);
                }
                return pacc_array;
            });
        };
        return SkillACPassRate;
    }());
}

/* 特技AC通过率显示 */
function chart_show_skill_ac_pass_rate_init() {
    $('[data-ac-type="9"]').each(function () {
        var $this = $(this);
        var data_appeal_chance_start = parseInt($this.attr('data-start')), data_appeal_chance_end = parseInt($this.attr('data-end')), data_appeal_chance_skill_demand = parseInt($this.attr('data-ac-arg'));
        var appeal_chance_duration = data_appeal_chance_end - data_appeal_chance_start + 1;
        var p1 = 0.33, p2 = 0.53, p3 = 0.70;
        var v1 = SkillACPassRate.exec([[p1, appeal_chance_duration]], data_appeal_chance_skill_demand), v2 = SkillACPassRate.exec([[p2, appeal_chance_duration]], data_appeal_chance_skill_demand), v3 = SkillACPassRate.exec([[p3, appeal_chance_duration]], data_appeal_chance_skill_demand);
        $this.append("<div><span>".concat(p1 * 100, "%</span><span>").concat(Math.round(v1 * 100), "%</span><span>").concat(p2 * 100, "%</span><span>").concat(Math.round(v2 * 100), "%</span><span>").concat(p3 * 100, "%</span><span>").concat(Math.round(v3 * 100), "%</span></div>"));
    });
}