Участник:T kns/cps.js

Материал из Lurkmore
Перейти к навигации Перейти к поиску

Замечание: Возможно, после публикации вам придётся очистить кэш своего браузера, чтобы увидеть изменения.

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl+F5 или Ctrl+R (⌘+R на Mac)
  • Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
  • Internet Explorer / Edge: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl+F5
  • Opera: Нажмите Ctrl+F5.
//<source lang="javascript">
//
/////// @name          cpasloader
/////// @version       0.0.3
/////// @author        hikki-zadrot
//
var cpsLoaderHtml = '<center><img src="/skins/common/images/ajax-loader.gif"></img></center>',
    cpsBarHtml = $('<div id="cpsControl"></div>'),
    cpsBarHtmlDiv = $('<div></div>');

function cpsBarHtmlMakeButton(id, fn, title, text, cls) {
    $(document).delegate('button[id="'+id+'"]', 'click', fn);
    return $('<button></button>').attr({id: id, title: title}).text(text).addClass(cls);
}

var cpsSummary = ''
    , cpsLinks = []
    , cpsSysop = false
    , cpsToken = undefined
    , cpsHref = undefined
    , cpsTitle
    , cpsRevid
    , cpsPrev
    , cpsNext
    , cpsUser
    , cpsComment
    , cpsTime
    , cpsBlocked = true
    , cpsLink
    , contentframe = (skin==='modern'?$('#mw_content'):$('#bodyContent'));

function cpsDisable(selector) { $(selector).attr('disabled', 'disabled'); }
function cpsEnable(selector) { $(selector).removeAttr('disabled'); }
function cpsSuccess(id) { return function (xml) { if ($('error', $(xml).text())[0]) $(id).css('background-color', 'red'); else $(id).css('background-color', 'lime'); } }

function cpsParseHref(href, name) {
    if (href) {
        var value = href.match(RegExp(name + '=([^&]+)'));
        if (value) return value[1];
    }
    return undefined;
}

function cpsHideAll() { $('.cpsSummaryItem').toggle(); $('#cpsEmbed, .cpsOldLink, .cpsLink').toggle(); }
function cpsHide() {$('#column-one, .portlet').show(); $('#cps').fadeOut(); }
function cpsKick() { cpsQueryDiff(cpsHref); }
function cpsClear() { $('#wpSummary').val(''); $('.cpsSummaryItem').attr('class', 'cpsSummaryItem'); }
function cpsUp() { cpsLinks[cpsLink - 1].click(); }
function cpsDown() { cpsLinks[cpsLink + 1].click(); }
function cpsLeft() { cpsQueryDiff(cpsPrev); }
function cpsRight() { cpsQueryDiff(cpsNext); }
function cpsUndo() {
    cpsDisable('#cpsUndo');
    $.get('/api.php', { titles: cpsTitle, action: 'query', prop: 'info', format: 'xmlfm' }, function (xml) {
        $.post('/api.php', { action: 'edit', title: cpsTitle, token: cpsToken, summary: 'Отмена правки ' + cpsRevid + ': ' + $('#wpSummary').val(), undo: cpsParseHref(cpsPrev, 'oldid'), undoafter: $('page', $(xml).text()).attr('lastrevid'), minor: '1' }, cpsSuccess('#cpsUndo'));
    });
}
function cpsReport() {
    cpsDisable('#cpsReport');
    $.post('/api.php', { action: 'edit', title: 'Lurkmore:Ban/public', token: cpsToken, summary: 'Auto', appendtext: '\n*{{diff|' + cpsRevid + '||' + cpsTitle + '}} -- ' + $('#wpSummary').val(), minor: '1' }, cpsSuccess('#cpsReport'));
}
function cpsBlock() {
    cpsDisable('#cpsBlock');
    $.post('/api.php', { action: 'block', user: cpsUser, token: cpsToken, expiry: $('#wpBlockExpiry option:selected').attr('value'), reason: $('#wpBlockReasonList option:selected').attr('value') + ': {{brd|' + cpsRevid + '}}', nocreate: '1', autoblock: '1' }, cpsSuccess('#cpsBlock'));
}

cpsBarHtmlDiv.append(
    cpsBarHtmlMakeButton("cpsClear", cpsClear, "Очистить поле для комментария", "Очистить"),
    $('<span class="cpsNoDiff"></span>').append(
        cpsBarHtmlMakeButton("cpsUp", cpsUp, "Переход к предыдущей ссылке на дифф", "▲"),
        cpsBarHtmlMakeButton("cpsDown", cpsDown, "Переход к следующей ссылке на дифф", "▼"),
        cpsBarHtmlMakeButton("cpsLeft", cpsLeft, "Переход к предыдущей правке этой статьи", "prev"),
        cpsBarHtmlMakeButton("cpsRight", cpsRight, "Переход к следующей правке этой статьи", "next"),
        cpsBarHtmlMakeButton("cpsKick", cpsKick, "Повторная загрузка этого диффа", "Пнуть")
    ),
    cpsBarHtmlMakeButton("cpsUndo", cpsUndo, "Будут откачены все изменения, внесённые после этой правки (кнопка желтого цвета)! Дождитесь зелёного цвета для завершения!", "Откатить"),
    cpsBarHtmlMakeButton("cpsReport", cpsReport, "Занесение ссылки на эту правку в публичную баню. В качестве описания к жалобе будет указан текст из поля ниже. Дождитесь зелёного цвета для завершения!", "Вызвать санитаров"),
    cpsBarHtmlMakeButton("cpsBlock", cpsBlock, "Ссылка на эту правку будет указана в причине блокировки. Дождитесь зелёного цвета для завершения!", "Покарать", "cpsSysop"),
    cpsBarHtmlMakeButton("cpsClose", cpsHide, "Убрать окно", "✗")
).appendTo(cpsBarHtml);

cpsBarHtml.append(
    $('<input/>').attr({id: "wpSummary", type: "text", placeholder: "Описание правки"}).css('width', '90%').keydown(function(e){e.stopPropagation()}),
    $('<div id="userSummaryButtonsA"></div>').append('<select id="wpBlockReasonList" class="cpsSysop"></select>', '<select id="wpBlockExpiry" class="cpsSysop"></select>')
)

var cpsBar = cpsBarHtml.add('<div id="cpsHeader" class="cpsLoader cpsNoDiff"></div>').add($('<div id="cpsContent"></div>').append('<div id="cpsDiff" class="cpsLoader"></div>', $('<div id="cpsList" class="cpsSysop cpsLoader"></div>').html(cpsLoaderHtml)));

var cpsEmbedHtml = $('<div id="cps"></div>').append($('<div id="cpsEmbed"></div>').append(cpsBar))
    , cpsFrameHtml = $('<div id="cps" style="display:none"></div>').append($('<div id="cpsBackground" title="УБРАТЬ"></div>').click(cpsHide), $('<div id="cpsBar"></div>').append(cpsBar.clone()))

    , cpsHeaderHtml = '\
<p><a id="cpsTitle"></a> (<a id="cpsDiffLink" title="Дифф">Д</a> | <a id="cpsHistory" title="История">И</a> | <a id="cpsEdit" title="Править">П</a>)</p>\
<p><i id="cpsTime"></i>: <a id="cpsUser" title="Страница участника"></a> (<a id="cpsTalk" title="Обсуждение участника">О</a> | <a id="cpsContribution" title="Вклад участника">В</a>)</p>\
<p><i id="cpsComment"></i></p>'
    , cpsWorkspace = /diff=\w+|=edit|=submit|=history|:ban|:contributions|:recentchanges|:watchlist|:checkuser/i;


function cpsQueryDiff(href) {
    if (href) {
        cpsHref = href;
        $('.cpsLoader').html(cpsLoaderHtml);
        $('#column-one, .portlet').hide();
        $('#cps').fadeIn();
        cpsDisable('#cps *:not(#cpsKick)');
        $.get(href + '&action=render&diffonly=1', function (xml) {
            $('#cpsHeader').html(cpsHeaderHtml);
            $('#cpsDiff').html($('.diff, .firstrevisionheader', $('<div>' + xml + '</div>'))).scrollTop(0);
            cpsParseDiff();
        });
    }
}

function cpsParseDiff() {
    cpsTitle = decodeURIComponent(cpsParseHref($('#differences-nextlink, #differences-prevlink').attr('href'), 'title')).replace(/_/g,' ');
    cpsRevid = cpsParseHref($('#mw-diff-ntitle1 a:first, #differences-nextlink').attr('href'), 'oldid');
    cpsPrev = $('#differences-prevlink').attr('href');
    cpsNext = $('#differences-nextlink').attr('href');
    cpsUser = $('.diff-ntitle .mw-userlink').text();
    cpsComment = $('.diff-ntitle .comment').html();
    cpsTime = $('#mw-diff-ntitle1 a:first')[0] ? $('#mw-diff-ntitle1 a:first').text().match(/(\d.+)/)[1] : '????';
    $('#cpsDiff .diff tr:first, #cpsDiff .firstrevisionheader').remove();
    if (cpsSysop) $.get('/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:Block/' + cpsUser, function (xml) {
        if ($('#mw-input-wpReason-other', xml).attr('value').length == 0) cpsEnable('#cpsBlock');
        $('#wpBlockReasonList').replaceWith($('#mw-input-wpReason', xml));
        $('#wpBlockExpiry').replaceWith($('#mw-input-wpExpiry', xml));
        $('#cpsList').html($('.mw-warning-with-logexcerpt ul', xml)); // to fix
        $('#cpsList .mw-logevent-actionlink, #cpsList .mw-usertoollinks').remove();
    });
    cpsDisplay();
}

function cpsDisplay() {
    cpsEnable('#cps *:not(#cpsBlock)');
    if (cpsLinks[cpsLink]) cpsLinks[cpsLink].parent().addClass('cpsUsedLink');
    $('#cps button').css('background-color', '');
    cpsClear();
    if (!cpsPrev) cpsDisable('#cpsLeft, #cpsUndo');
    if (!cpsNext) cpsDisable('#cpsRight'); else $('#cpsUndo').css('background-color', 'yellow');
    if (!cpsLinks[cpsLink - 1]) cpsDisable('#cpsUp');
    if (!cpsLinks[cpsLink + 1]) cpsDisable('#cpsDown');
    $('#cpsTime').text(cpsTime);
    $('#cpsTitle').text(cpsTitle).attr('href', '/' + encodeURI(cpsTitle));
    $('#cpsDiffLink').attr('href', '/index.php?diff=' + cpsRevid);
    $('#cpsHistory').attr('href', '/index.php?action=history&title=' + cpsTitle);
    $('#cpsEdit').attr('href', '/index.php?action=edit&title=' + cpsTitle);
    if (cpsUser) {
        $('#cpsUser').text(cpsUser).attr('href', encodeURI('/User:' + cpsUser));
        $('#cpsTalk').attr('href', encodeURI('/User_talk:' + cpsUser));
        $('#cpsContribution').attr('href', '/Special:Contributions/' + cpsUser);
    }
    else $('#cpsUser').text('Анонимус');
    $('#cpsComment').html(cpsComment);
    $('#cpsContent').css('height', ($('#cpsBar').innerHeight() - $('#cpsHeader').outerHeight() - $('#cpsControl').outerHeight() - 25) + 'px');
}

function cpsStartup() {
    var diff = false;
    if (!_is_editpage) {
        if(location.href.indexOf("diff=") == -1) importStylesheetURI('/skins/common/diff.css');
        importStylesheet('Участник:Хикки-задрот/cpscss');
        if (/diff=\w+/.exec(location.href)) {
            diff = true;
            cpsEmbedHtml.insertBefore('.diff');
            $('.cpsNoDiff').remove();
        }
        else {
            function onclick(href, i) {
                return function () {
                    cpsLink = i;
                    cpsQueryDiff(href);
                }
            }
            contentframe.append(cpsFrameHtml);
            $('a[href*="diff="]:not(:contains("текущ."), :contains("проверить"))', contentframe).each(function (i) {
                var _this = $(this), tl = $('<a class="cpsLink"></a>').text(_this.text());
//                tl.attr('href',_this.attr('href'));
                tl.on('click',onclick(this.href, i)).appendTo($('<span></span>').insertAfter(this));

                cpsLinks[i] = tl;
                _this.addClass('cpsOldLink').hide();
            });
        }
    }
    cpsDisable('#cps *:not(#cpsKick)');
    if (wgAction == 'history') $('#cpsLeft, #cpsRight').remove();
    if (cpsSysop) $('#cpsReport').remove(); else { $('.cpsSysop').remove(); $('#cpsDiff').css('height', '100%'); };
    if (cpsSummary) $('#userSummaryButtonsA').prepend(cpsSummary.replace(/#(.*)@(.*)/g, '<a class="cpsSummaryItem" title="$2">$1</a>'));
    $('.cpsSummaryItem').click(function () {
        if (!$(this).hasClass('cpsSummaryItemChosen')) {
            var text = $('#wpSummary').val();
            if (text.length > 0) text += ', ';
            $('#wpSummary').val(text + this.title);
            $(this).addClass('cpsSummaryItemChosen');
        }
    });
    if (diff) cpsParseDiff();
}
if (cpsWorkspace.exec(decodeURIComponent(location.href))) {
    cpsSysop = (($.inArray('sysop', wgUserGroups) != -1) || ($.inArray('moderator', wgUserGroups) != -1));
    $.get('/api.php', { titles: 'User:' + wgUserName + '/cps', action: 'query', prop: 'info|revisions', intoken: 'edit', rvprop: 'content', rvexpandtemplates: '1', rvlimit: '1', format: 'xmlfm' }, function (xml) {
        cpsToken = $('page', $(xml).text()).attr('edittoken');
        cpsSummary = $('rev', $(xml).text()).html();
        $('#p-tb ul').append('<li>БПС: <a href="/User:' + wgUserName + '/cps">Настроить</a> | <a onclick="cpsHideAll()" style="cursor:pointer">Скрыть</a></li>');
        cpsStartup();
    });
}
//</source>