跳转到内容

User:Hamish/CIDRCalc.js

维基百科,自由的百科全书
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
// <nowiki>
// 右上角更多 => 計算IP區段
// 僅在貢獻(Special:Contributions/xxx)或編輯歷史頁面可用
// 初次打開窗口時可自動填入當前頁面上所有IP,按需移除或增加

(function () {
    'use strict';

    if (!(mw.config.get('wgAction') === 'history' || 
        mw.config.get('wgCanonicalSpecialPageName') === 'Contributions')
        ) {
        return;
    }

    var links = Array.from(document.querySelectorAll('a.mw-userlink'));
    var ips = links.map(link => link.textContent.trim())
            .filter(text => {
                return /^(\d{1,3}\.){3}\d{1,3}$/.test(text) || 
                    /^([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}$/.test(text);
            });
        
    ips = [...new Set(ips)]; 

    function buttonClick(e) {
        e.preventDefault();
        if ($('#previewbox').is(':hidden')) {
            $('input[name="ips"]').parents('div').eq(-3).hide();
            $('#mainbutton').val('返回');
            $('#previewbox').show();
            
            var newIps = [];
            
            $('input[name="ips"]').each(function() {
                var val = $(this).val().trim();
                if (val) {
                    newIps.push(val);
                }
            });
            
            ips = [...new Set(newIps)];
            
            e.target.previewer.beginRender(buildTemplate(), 'WP:SB');
        } else {
            $('#previewbox').hide();
            $('input[name="ips"]').parents('div').eq(-3).show();
            $('#mainbutton').val('計算');
            e.target.previewer.closePreview();
        }
    }

    function buildTemplate() {
        var template = '{{blockcalc|';
        for (var i = 0; i < ips.length; i++) {
            template += ips[i];
            if (i < ips.length - 1) {
                template += '|';
            }
        }
        template += '}}';
        return template;
    }

    function showCidrWindow() {
        var windowCidr = new Morebits.simpleWindow(600, 400);
        windowCidr.setTitle('CIDR Calculator');
        
        var form = new Morebits.quickForm();

        form.append({
            type: 'button',
            id: 'mainbutton',
            label: '計算',
            event: buttonClick
        });

        form.append({
            type: 'dyninput',
            name: 'ips',
            label: 'IPs:',
            sublabel: 'IP:',
            tooltip: 'IPV4和IPV6,可以混合使用',
            min: 2,
            max: 100, 
        });
        
        form.append({
            type: 'div',
            id: 'previewbox',
            hidden: true
        });
        
        
        
        var result = form.render();
        windowCidr.setContent(result);
        windowCidr.display();
        
        var inputs = $.find('input[name="ips"]');
        
        if (ips.length > inputs.length) {
            var moreButton = $('input[type="button"][value="更多"]')[0];
            for (var j = inputs.length; j < ips.length; j++) {
                moreButton.click();
                setTimeout(function(index) {
                    var newInputs = $.find('input[name="ips"]');
                    if (index < newInputs.length) {
                        $(newInputs[index]).val(ips[index]);
                    }
                }, 50, j);
            }
        }

        for (var i = 0; i < inputs.length && i < ips.length; i++) {
            $(inputs[i]).val(ips[i]);
        }
        result.previewer = new Morebits.wiki.preview($(result).find('#previewbox').last()[0]);
        $('#mainbutton')[0].previewer = result.previewer;
    }

    mw.loader.using(['ext.gadget.morebits'], function () {
        var $portletDiv = $('#p-cactions .vector-menu-content-list');

        if ($portletDiv.length) {
            var $mergeButton = $('<li>')
                .addClass('mw-list-item')
                .append(
                    $('<a>')
                        .attr('href', '#')
                        .text('計算IP區段')
                        .click(e => {
                            e.preventDefault();
                            showCidrWindow();
                        })
                );

            $portletDiv.append($mergeButton);
        }
    });
})();
// </nowiki>