"사용자:Gomdoli/common.js"의 두 판 사이의 차이

이 문서는 2020년 10월 27일 (화) 18:49에 마지막으로 편집되었습니다.
< 사용자:Gomdoli
잔글 (GTX1060님이 사용자:Gomdoli4696/common.js 문서를 사용자:Gomdoli/common.js 문서로 이동했습니다: "Gomdoli4696" 사용자의 이름을 "Gomdoli"(으)로 바꿀 때 문서를 자동으로 이동했습니다)
 
(다른 사용자 한 명의 중간 판 15개는 보이지 않습니다)
1번째 줄: 1번째 줄:
/* <nowiki> */
/*
/* 다음의 코드는 차단된 사용자에게 선을 그어주는 스크립트로 [[:wikipedia:ru:MediaWiki:Gadget-markblocked.js]]에서 퍼온 겁니다. 각자 js문서에 붙여넣어서 쓰세요. */
* 롤백 부가 기능 스크립트
** by [[wikipedia:ko:사용자:*devunt]], from [[wikipedia:ko:미디어위키:Gadget-RollbackComment.js]]
*/


function markBlocked( container ) {
function addExtRbLink($container) {
var contentLinks = container ?
    var $rbnode = $([]), index = {};
$( container ).find( 'a' ) :
    var wgCanonicalSpecialPageName = mw.config.get('wgCanonicalSpecialPageName');
( mw.util.$content || $( '.mw-body' ) ).find( 'a' ).add( '#ca-nstab-user a' );
    var wgAction = mw.config.get('wgAction');
    if (typeof rollbackLinksDisable == 'object' && rollbackLinksDisable instanceof Array)
if ( !markBlockedCSS ) {
        for (var i = 0; i < rollbackLinksDisable.length; i++)
markBlockedCSS = mw.util.addCSS('\
            index[rollbackLinksDisable[i]] = true;
.mediawiki .user-blocked-partial {' + ( window.mbPartialStyle || 'opacity: 0.5' ) + '}\
    if (
.mediawiki .user-blocked-temp {'   + ( window.mbTempStyle || 'opacity: 0.7; text-decoration: line-through' ) + '}\
    !('user' in index) && wgCanonicalSpecialPageName == "Contributions" ||
.mediawiki .user-blocked-indef {'  + ( window.mbIndefStyle || 'opacity: 0.4; font-style: italic; text-decoration: line-through' ) + '}\
        !('recent' in index) && wgCanonicalSpecialPageName == "Recentchanges" ||
.mediawiki .user-blocked-tipbox {' + ( window.mbTipBoxStyle || 'font-size:85%; background:#FFFFF0; border:1px solid #FEA; padding:0 0.3em; color:#AAA' ) + '}\
        !('watchlist' in index) && wgCanonicalSpecialPageName == "Watchlist" ||
');
        !('history' in index) && wgAction == "history" ||
}
        !('diff' in index) && (diffnode = document.getElementById("mw-diff-ntitle2"))
var mbTooltip = window.mbTooltip || ';$1 blocked ($2) by $3: $4 ($5 ago)';
    ) {
        $rbnode = $container.find( 'span.mw-rollback-link' );
    }
$rbnode.each( function () { addExtendedRollbackLink( this ); } );
}
function confirmRollback() {
    var url = this.href;
    var user = url.match(/[?&]from=([^&]*)/);
    if (!user) return;
    user = decodeURIComponent(user[1].replace(/\+/g, " "));
    var summary = prompt("추가할 편집 요약을 입력하세요.",
                        rollbackSummaryDefault);
    if (summary === null)
        return false;
    else if (summary === "")
        return true;
    this.href += "&summary=" + '[[특수:기여/$2|$2]]([[사용자토론:$2|토론]])의 편집을 [[특수:기여/$1|$1]]의 마지막 판으로 되돌림: '.replace(/\$2/g, user) + encodeURIComponent(summary.replace(/\$user/g, user));
    return true;
}


//get all aliases for user: & user_talk:
function rollbackAsBot() {
var userNS = [];
    this.href += "&bot=1";
for ( var ns in mw.config.get( 'wgNamespaceIds' ) ) {
    return true;
if ( mw.config.get( 'wgNamespaceIds' )[ ns ] == 2 || mw.config.get( 'wgNamespaceIds' )[ ns ] == 3 ) {
}
userNS.push( ns.replace( /_/g, ' ' ) + ':' );
}
function addExtendedRollbackLink(rbnode) {
}


//RegExp  for all titles that are  User: | User_talk: | Special:Contributions/ (localized) | Special:Contributions/ (for userscripts)
    // (+편집 요약) 버튼 추가
var userTitleRX = new RegExp( '^'
    var rblink = rbnode.getElementsByTagName("a")[0];
+ '(' + userNS.join( '|' )
    var alink = rblink.cloneNode(true);
+ '|특수:기여\\/|Special:Contributions\\/'
    alink.className = "";
+ ')'
    alink.firstChild.nodeValue = "(+편집 요약)";
+ '([^\\/#]+)$', 'i' );
    alink.onclick = confirmRollback;
 
    rbnode.insertBefore(alink, rblink.nextSibling);
//RegExp for links
    rbnode.insertBefore(document.createTextNode(" | "), alink);
var articleRX = new RegExp(
  if (userIsInGroup('sysop'))
'^(?:' + mw.config.get( 'wgServer' ) + ')?' +
{
mw.config.get( 'wgArticlePath' ).replace( '$1', '' ) + '([^#]+)'
        // 관리자라면 (+봇) 버튼 추가
);
        var blink = rblink.cloneNode(true);
var scriptRX = new RegExp(
        blink.className = "";
'^(?:' + mw.config.get( 'wgServer' ) + ')?' +
        blink.firstChild.nodeValue = "(+)";
mw.config.get( 'wgScript' ) + '\\?title=([^#&]+)'
        blink.onclick = rollbackAsBot;
);
        rbnode.insertBefore(blink, alink.nextSibling);
 
        rbnode.insertBefore(document.createTextNode(" | "), blink);
var userLinks = {};
    }
var url, ma, pgTitle;
}
 
if (typeof rollbackLinksDisable == 'undefined')
 
    rollbackLinksDisable = [];
//find all "user" links and save them in userLinks : { 'users': [<link1>, <link2>, ...], 'user2': [<link3>, <link3>, ...], ... }
if (typeof rollbackSummaryDefault == 'undefined')
contentLinks.each( function( i, lnk ) {
    rollbackSummaryDefault = "";
url = $( lnk ).attr( 'href' );
if ( !url || url.charAt( 0 ) !== '/' ) {
return;
}
if ( ma = articleRX.exec( url ) ) {
pgTitle = ma[ 1 ];
} else if ( ma = scriptRX.exec( url ) ) {
pgTitle = ma[ 1 ];
} else {
return;
}
pgTitle = decodeURIComponent( pgTitle ).replace( /_/g, ' ' );
user = userTitleRX.exec( pgTitle );
if ( !user ) {
return;
}
user = user[ 2 ];
if ( user === 'К удалению' ) {
return;
}
$( lnk ).addClass( 'userlink' );
if ( !userLinks[ user ] ) {
userLinks[ user ] = [];
}
userLinks[ user ].push (lnk );
} );
 
 
//convert users into array
var users = [];
for ( var u in userLinks ) {
users.push( u );
}
if ( users.length === 0 ) {
return;
}
 
//API request
var serverTime,
apiRequests = 0;
var waitingCSS = mw.util.addCSS( 'a.userlink {opacity:' + ( window.mbLoadingOpacity || 0.85 ) + '}' );
while ( users.length > 0 ) {
apiRequests++;
$.post(
mw.util.wikiScript( 'api' ) + '?format=json&action=query',
{
list: 'blocks',
bklimit: 100,
bkusers: users.splice( 0, 50 ).join( '|' ),
bkprop: 'user|by|timestamp|expiry|reason|flags'
//no need for 'id'
},
markLinks
);
}
 
return; //the end
 
 
//callback: receive data and mark links
function markLinks( resp, status, xhr ) {
 
serverTime = new Date( xhr.getResponseHeader('Date') );
var list, blk, tip, links, lnk, blPartial;
if ( !resp || !( list = resp.query ) || !( list = list.blocks ) ) {
return;
}
 
for ( var i = 0; i < list.length; i++ ) {
blk = list[ i ];
blPartial = '';
if ( /^in/.test( blk.expiry ) ) {
clss = 'user-blocked-indef';
blTime = blk.expiry;
} else {
clss = 'user-blocked-temp';
blTime = inHours ( parseTS( blk.expiry ) - parseTS( blk.timestamp ) );
}
if ('partial' in blk) {
clss = 'user-blocked-partial';
blPartial = ' partial';
}
tip = mbTooltip.replace( '$1', blPartial )
.replace( '$2', blTime )
.replace( '$3', blk.by )
.replace( '$4', blk.reason )
.replace( '$5', inHours ( serverTime - parseTS( blk.timestamp ) ) );
links = userLinks[ blk.user ];
for ( var k = 0; k < links.length; k++ ) {
lnk = $( links[ k ] ).addClass( clss );
if ( window.mbTipBox ) {
$( '<span class=user-blocked-tipbox>#</span>' ).attr( 'title', tip ).insertBefore( lnk );
} else {
lnk.attr( 'title', lnk.attr( 'title' ) + tip );
}
}
}
 
if ( --apiRequests === 0 ) { //last response
waitingCSS.disabled = true;
$( '#ca-showblocks' ).parent().remove(); // remove added portlet link
}
 
}
 
//--------AUX functions
 
//20081226220605 or 2008-01-26T06:34:19Z -> date
function parseTS( ts ) {
var m = ts.replace( /\D/g, '' ).match( /(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/ );
return new Date ( Date.UTC( m[ 1 ], m[ 2 ] - 1, m[ 3 ], m[ 4 ], m[ 5 ], m[ 6 ] ) );
}
 
function inHours( ms ) { //milliseconds -> "2:30" or 5,06d or 21d
var mm = Math.floor( ms / 60000 );
if ( !mm ) {
return Math.floor( ms / 1000 ) + 's';
}
var hh = Math.floor( mm / 60 );
mm = mm % 60;
var dd = Math.floor( hh / 24 );
hh = hh % 24;
if ( dd ) {
return dd + ( dd < 10 ? '.' + zz( hh ) : '' ) + 'd';
}
return hh + ':' + zz( mm );
}
 
function zz( v ) { // 6 -> '06'
if ( v <= 9 ) {
v = '0' + v;
}
return v;
}
}// -- end of main function
 
// FIXME: a global variable
var markBlockedCSS;


mw.hook( 'wikipage.content' ).add(addExtRbLink);


//start on some pages
function userIsInGroup (group)
switch ( mw.config.get( 'wgAction' ) ) {
{
case 'edit':
  var wgUserGroups = mw.config.get('wgUserGroups');
case 'submit':
  if (wgUserGroups) {
case 'delete':
    if (!group || group.length === 0) group = '*';
break;
    return wgUserGroups.join (' ').indexOf (group) >= 0;
case 'view':
  }
if ( $.inArray( mw.config.get( 'wgNamespaceNumber' ), [ 0, 10 ] ) !== -1 ) {
  return false;
break;
}
// otherwise continue with default
default: // 'history', 'purge'
// In case if the gadget is loaded directly by URL
mw.loader.using( 'mediawiki.util' ).done( function () {
if ( window.mbNoAutoStart ) {
mw.util.addPortletLink( 'p-cactions', 'javascript:markBlocked()', 'XX', 'ca-showblocks' );
} else {
mw.hook( 'wikipage.content' ).add( function () {
markBlocked();
  } );
}
} );
}
}
/* </nowiki> */

2020년 10월 27일 (화) 18:49 기준 최신판

/*
* 롤백 부가 기능 스크립트
** by [[wikipedia:ko:사용자:*devunt]], from [[wikipedia:ko:미디어위키:Gadget-RollbackComment.js]]
*/

function addExtRbLink($container) {
    var $rbnode = $([]), index = {};
    var wgCanonicalSpecialPageName = mw.config.get('wgCanonicalSpecialPageName');
    var wgAction = mw.config.get('wgAction');
    if (typeof rollbackLinksDisable == 'object' && rollbackLinksDisable instanceof Array)
        for (var i = 0; i < rollbackLinksDisable.length; i++)
            index[rollbackLinksDisable[i]] = true;
    if (
    	!('user' in index) && wgCanonicalSpecialPageName == "Contributions" ||
        !('recent' in index) && wgCanonicalSpecialPageName == "Recentchanges" ||
        !('watchlist' in index) && wgCanonicalSpecialPageName == "Watchlist" ||
        !('history' in index) && wgAction == "history" ||
        !('diff' in index) && (diffnode = document.getElementById("mw-diff-ntitle2"))
    ) {
        $rbnode = $container.find( 'span.mw-rollback-link' );
    }
	$rbnode.each( function () { addExtendedRollbackLink( this ); } );
}
 
function confirmRollback() {
    var url = this.href;
    var user = url.match(/[?&]from=([^&]*)/);
    if (!user) return;
    user = decodeURIComponent(user[1].replace(/\+/g, " "));
    var summary = prompt("추가할 편집 요약을 입력하세요.",
                         rollbackSummaryDefault);
    if (summary === null)
        return false;
    else if (summary === "")
        return true;
    this.href += "&summary=" + '[[특수:기여/$2|$2]]([[사용자토론:$2|토론]])의 편집을 [[특수:기여/$1|$1]]의 마지막 판으로 되돌림: '.replace(/\$2/g, user) + encodeURIComponent(summary.replace(/\$user/g, user));
    return true;
}

function rollbackAsBot() {
    this.href += "&bot=1";
    return true;
}
 
function addExtendedRollbackLink(rbnode) {

    // (+편집 요약) 버튼 추가
    var rblink = rbnode.getElementsByTagName("a")[0];
    var alink = rblink.cloneNode(true);
    alink.className = "";
    alink.firstChild.nodeValue = "(+편집 요약)";
    alink.onclick = confirmRollback;
    rbnode.insertBefore(alink, rblink.nextSibling);
    rbnode.insertBefore(document.createTextNode(" | "), alink);
   if (userIsInGroup('sysop'))
{
        // 관리자라면 (+봇) 버튼 추가
        var blink = rblink.cloneNode(true);
        blink.className = "";
        blink.firstChild.nodeValue = "(+봇)";
        blink.onclick = rollbackAsBot;
        rbnode.insertBefore(blink, alink.nextSibling);
        rbnode.insertBefore(document.createTextNode(" | "), blink);
    }
}
if (typeof rollbackLinksDisable == 'undefined')
    rollbackLinksDisable = [];
if (typeof rollbackSummaryDefault == 'undefined')
    rollbackSummaryDefault = "";

mw.hook( 'wikipage.content' ).add(addExtRbLink);

function userIsInGroup (group)
{
  var wgUserGroups = mw.config.get('wgUserGroups');
  if (wgUserGroups) {
    if (!group || group.length === 0) group = '*';
    return wgUserGroups.join (' ').indexOf (group) >= 0;
  }
  return false;
}