미디어위키:Liberty.js: 두 판 사이의 차이

편집 요약 없음
편집 요약 없음
1번째 줄: 1번째 줄:
$( function () {
'use strict';
var articleNamespaces, talkNamespaces, isArticleTab, limit;


( function () {
articleNamespaces = $( '.live-recent' ).attr( 'data-article-ns' );
'use strict';
talkNamespaces = $( '.live-recent' ).attr( 'data-talk-ns' );
var previewType = 'math';
isArticleTab = true;
var api = new mw.Rest();
limit = $( '#live-recent-list' )[ 0 ].childElementCount;
var isValidId = function ( qid ) {
 
return qid.match( /Q\d+/g ) === null;
function formatTimeAgo(time) {
};
var now = new Date();
var fetch = function ( qid ) {
var diff = now.getTime() - time.getTime();
return api.get( '/math/v0/popup/html/' + qid, {}, {
var seconds = Math.floor(diff / 1000);
Accept: 'application/json; charset=utf-8',
var minutes = Math.floor(seconds / 60);
'Accept-Language': mw.config.language
var hours = Math.floor(minutes / 60);
} );
var days = Math.floor(hours / 24);
};
var weeks = Math.floor(days / 7);
var fetchPreviewForTitle = function ( title, el ) {
var months = Math.floor(days / 30);
var deferred = $.Deferred();
var years = Math.floor(days / 365);
var qidstr = el.parentNode.parentNode.dataset.qid;
if ( isValidId( qidstr ) ) {
if (years > 0) {
return deferred.reject();
return years + "년 전";
} else if (months > 0) {
return months + "개월 전";
} else if (weeks > 0) {
return weeks + "주 전";
} else if (days > 0) {
return days + "일 전";
} else if (hours > 0) {
return hours + "시간 전";
} else if (minutes > 0) {
return minutes + "분 전";
} else {
return seconds + "초 전";
}
}
qidstr = qidstr.slice( 1 );
}
fetch( qidstr ).then( function ( body ) {
 
var model = {
function refreshLiveRecent() {
title: body.title,
var getParameter;
url: body.canonicalurl,
 
languageCode: body.pagelanguagehtmlcode,
if ( !$( '#live-recent-list' ).length || $( '#live-recent-list' ).is( ':hidden' ) ) {
languageDirection: body.pagelanguagedir,
return;
extract: body.extract,
type: previewType,
thumbnail: undefined,
pageId: body.pageId
};
deferred.resolve( model );
} );
return deferred.promise();
};
// popups require title attributes
[].forEach.call(
document.querySelectorAll( '.mwe-math-element[data-qid] img' ),
function ( node ) {
if ( isValidId( node.parentNode.parentNode.dataset.qid ) ) {
node.dataset.title = 'math-unique-identifier';
}
}
}
);
module.exports = {
type: previewType,
selector: '.mwe-math-element[data-qid] img',
gateway: {
fetch: fetch,
fetchPreviewForTitle: fetchPreviewForTitle
}
};
}() );


getParameter = {
action: 'query',
list: 'recentchanges',
rcprop: 'title|timestamp',
rcshow: '!bot|!redirect',
rctype: 'edit|new',
rclimit: limit,
format: 'json',
rcnamespace: isArticleTab ? articleNamespaces : talkNamespaces,
rctoponly: true
};
mw.loader.using( 'mediawiki.api' ).then( function () {
var api = new mw.Api();
api.get( getParameter ).then( function ( data ) {
var recentChanges, html, time, line, text;
recentChanges = data.query.recentchanges;
html = recentChanges.map( function ( item ) {
time = new Date( item.timestamp );
line = '<li class="flex justify-between"><a class="recent-item w-full flex items-center" href="' + mw.util.getUrl( item.title ) + '" title="' + item.title + '"><span class="flex-1 text-ellipsis text-nowrap overflow-hidden">';
text = '';
if ( item.type === 'new' ) {
line = line.replace('<span class="flex-1 text-ellipsis text-nowrap overflow-hidden">','<div class="flex justify-center items-center mr-1 w-3 h-3 bg-red-500 rounded-2xl text-[0.5rem] text-white font-black">N</div><span class="flex-1 text-ellipsis text-nowrap overflow-hidden">');
}
text += item.title;
if ( text.length > 9999 ) {
text = text.substr( 0, 9999 );
text += '...';
}
line += text;
line += '</span><time class="ml-4 recent-item-timestamp">' + formatTimeAgo(time) + '</time></a></li>';
return line;
} ).join( '\n' );
$( '#live-recent-list' ).html( html );
} )
.catch( function () {} );
});
}
$( '#liberty-recent-tab1' ).click( function () {
$( this ).addClass( 'active' );
$( '#liberty-recent-tab2' ).removeClass( 'active' );
isArticleTab = true;
refreshLiveRecent();
} );
$( '#liberty-recent-tab2' ).click( function () {
$( this ).addClass( 'active' );
$( '#liberty-recent-tab1' ).removeClass( 'active' );
isArticleTab = false;
refreshLiveRecent();
} );


document.addEventListener("DOMContentLoaded", function () {
setInterval( refreshLiveRecent, 5 * 60 * 1000 );
    document.querySelectorAll(".mw-collapsible-toggle").forEach(toggle => {
refreshLiveRecent();
        toggle.addEventListener("click", function (event) {
} );
            event.preventDefault();
            let table = this.closest(".mw-collapsible").querySelector("tbody");
            let currentHeight = getComputedStyle(table).maxHeight;
           
            if (currentHeight !== "0px" && currentHeight !== "none") {
                table.style.overflow = "hidden";
                table.style.maxHeight = "0px";
                table.style.opacity = "0";
                table.style.transition = "max-height 0.5s ease-out, opacity 0.3s ease-out";
            } else {
                table.style.overflow = "hidden";
                table.style.maxHeight = "0px";
                table.style.opacity = "0";
                table.style.transition = "none";
               
                setTimeout(() => {
                    table.style.maxHeight = table.scrollHeight + "px";
                    table.style.opacity = "1";
                    table.style.transition = "max-height 0.5s ease-in, opacity 0.3s ease-in";
                }, 10);
            }
        });
    });
});

2025년 2월 22일 (토) 06:27 판

$( function () {
	'use strict';
	var articleNamespaces, talkNamespaces, isArticleTab, limit;

	articleNamespaces = $( '.live-recent' ).attr( 'data-article-ns' );
	talkNamespaces = $( '.live-recent' ).attr( 'data-talk-ns' );
	isArticleTab = true;
	limit = $( '#live-recent-list' )[ 0 ].childElementCount;

	function formatTimeAgo(time) {
		var now = new Date();
		var diff = now.getTime() - time.getTime();
		var seconds = Math.floor(diff / 1000);
		var minutes = Math.floor(seconds / 60);
		var hours = Math.floor(minutes / 60);
		var days = Math.floor(hours / 24);
		var weeks = Math.floor(days / 7);
		var months = Math.floor(days / 30);
		var years = Math.floor(days / 365);
	
		if (years > 0) {
			return years + "년 전";
		} else if (months > 0) {
			return months + "개월 전";
		} else if (weeks > 0) {
			return weeks + "주 전";
		} else if (days > 0) {
			return days + "일 전";
		} else if (hours > 0) {
			return hours + "시간 전";
		} else if (minutes > 0) {
			return minutes + "분 전";
		} else {
			return seconds + "초 전";
		}
	}

	function refreshLiveRecent() {
		var getParameter;

		if ( !$( '#live-recent-list' ).length || $( '#live-recent-list' ).is( ':hidden' ) ) {
			return;
		}

		getParameter = {
			action: 'query',
			list: 'recentchanges',
			rcprop: 'title|timestamp',
			rcshow: '!bot|!redirect',
			rctype: 'edit|new',
			rclimit: limit,
			format: 'json',
			rcnamespace: isArticleTab ? articleNamespaces : talkNamespaces,
			rctoponly: true
		};

		mw.loader.using( 'mediawiki.api' ).then( function () {
			var api = new mw.Api();
			api.get( getParameter ).then( function ( data ) {
				var recentChanges, html, time, line, text;
				recentChanges = data.query.recentchanges;
				html = recentChanges.map( function ( item ) {
					time = new Date( item.timestamp );
					line = '<li class="flex justify-between"><a class="recent-item w-full flex items-center" href="' + mw.util.getUrl( item.title ) + '" title="' + item.title + '"><span class="flex-1 text-ellipsis text-nowrap overflow-hidden">';
					text = '';
					if ( item.type === 'new' ) {
						line = line.replace('<span class="flex-1 text-ellipsis text-nowrap overflow-hidden">','<div class="flex justify-center items-center mr-1 w-3 h-3 bg-red-500 rounded-2xl text-[0.5rem] text-white font-black">N</div><span class="flex-1 text-ellipsis text-nowrap overflow-hidden">');
					}
					text += item.title;
					if ( text.length > 9999 ) {	
						text = text.substr( 0, 9999 );
						text += '...';
					}
					line += text;
					line += '</span><time class="ml-4 recent-item-timestamp">' + formatTimeAgo(time) + '</time></a></li>';
					return line;
				} ).join( '\n' );
				$( '#live-recent-list' ).html( html );
			} )
			.catch( function () {} );
		});
	}

	$( '#liberty-recent-tab1' ).click( function () {
		$( this ).addClass( 'active' );
		$( '#liberty-recent-tab2' ).removeClass( 'active' );
		isArticleTab = true;
		refreshLiveRecent();
	} );

	$( '#liberty-recent-tab2' ).click( function () {
		$( this ).addClass( 'active' );
		$( '#liberty-recent-tab1' ).removeClass( 'active' );
		isArticleTab = false;
		refreshLiveRecent();
	} );

	setInterval( refreshLiveRecent, 5 * 60 * 1000 );
	refreshLiveRecent();
} );