사용자:Hsl0/연구소/3.js: 두 판 사이의 차이

리버티게임, 모두가 만들어가는 자유로운 게임
imported>Hsl0
편집 요약 없음
imported>Hsl0
편집 요약 없음
 
(같은 사용자의 중간 판 10개는 보이지 않습니다)
1번째 줄: 1번째 줄:
/**
/**
  * 0. 모든 패키지가 로딩되고 DOM이 준비될때까지 기다립니다. 오류 여부는 상관없습니다.
  * @requires oojs-ui-widgets
* 1. renderer: DOM 요소를 만들거나 수정합니다.
  * @requires ext.gadget.Tasker
* 2. handler: 이벤트를 예약합니다.
  * 3. trigger: 본격적으로 작업을 수행합니다.
**/
**/
var TASKS = Symbol('tasks_queue');
registerRenderer(function createPopupButton() {
var WAITING = Symbol('waiting_queue');
$('.popuplink').each(function() {
 
var $header = $(this).find('.popuplink-header');
function Tasker() {
var widget = new OO.ui.PopupButtonWidget({
    this[TASKS] = new Set();
label: $(this).find('.popuplink-label'),
    this[WAITING] = new Set();
framed: false,
}
popup: {
Tasker.prototype.push = function push() {
head: $header.length || !('autoclose' in this.dataset),
    var tasker = this;
padded: true,
    var items = arguments;
autoClose: 'autoclose' in this.dataset,
    if(typeof items[0][Symbol.iterator] === 'function') items = items[0];
label: $header,
    else items = Array.from(items);
$content: $(this).find('.popuplink-content')
    items.forEach(function(item) {
}
        if(typeof item === 'function') tasker[TASKS].add(item);
});
        else tasker[WAITING].add(item);
$(this).html(widget.$element);
    });
});
    return this;
};
Tasker.prototype.wait = function wait() {
    var tasker = this;
    return new Promise(function(resolve) {
        function capture(queue) {
            var arr = Array.from(queue);
            queue.clear();
            return arr;
        }
 
        Promise.all(capture(tasker[WAITING])).then(function handle() {
            var captured = capture(tasker[WAITING]);
            if(captured.length) return Promise.all(captured).then(handle);
            else resolve();
        });
    });
};
Tasker.prototype.run = function run() {
    var tasker = this;
    this[TASKS].forEach(function(task) {
        if(typeof task === 'function') tasker[WAITING].add(task());
    });
    return this;
};
window.Tasker = Tasker;
 
var taskers = {
    renderer: new Tasker(),
    handler: new Tasker(),
    trigger: new Tasker()
};
function runTask() {
    var tasker = this;
    this[TASKS].forEach(function(task) {
        if(typeof task === 'string') tasker[TASKS].add(mw.loader.using(task));
        else if(typeof task === 'function') tasker[TASKS].add(task());
    });
    return this;
}
taskers.renderer.push = function() {
    Tasker.prototype.push.apply(this, arguments);
    if(documentReady && modulesReady) this.run();
    return this;
};
taskers.handler.push = function() {
    Tasker.prototype.push.apply(this, arguments);
    if(rendererDone) this.run();
    return this;
};
taskers.trigger.push = function() {
    Tasker.prototype.push.apply(this, arguments);
    if(hendlerDone) this.run();
    return this;
};
taskers.renderer.run = runTask;
taskers.handler.run = runTask;
taskers.trigger.run = runTask;
 
var documentReady = false;
var modulesReady = false;
var rendererDone = false;
var handlerDone = false;
 
window.registerRenderer = function registerRenderer() {
    var renderers = arguments;
    if(typeof renderers[0][Symbol.iterator] === 'function') renderers = renderers[0];
    taskers.renderer.push(arguments);
};
window.registerHandler = function registerHandler() {
    var handlers = arguments;
    if(typeof handlers[0][Symbol.iterator] === 'function') handlers = handlers[0];
    taskers.handler.push(arguments);
};
window.registerTrigger = function registerTrigger() {
    var triggers = arguments;
    if(typeof triggers[0][Symbol.iterator] === 'function') triggers = triggers[0];
    taskers.trigger.push(arguments);
};
 
$(function() {
    documentReady = true;
    mw.loader.using(RLPAGEMODULES).always(function() {
    modulesReady = true;
        return taskers.renderer.run().wait();
    }).always(function() {
        rendererDone = true;
        return taskers.handler.run().wait();
    }).always(function() {
        handlerDone = true;
        taskers.trigger.run();
    });
});
});

2021년 7월 24일 (토) 14:59 기준 최신판

/**
 * @requires oojs-ui-widgets
 * @requires ext.gadget.Tasker
**/
registerRenderer(function createPopupButton() {
	$('.popuplink').each(function() {
		var $header = $(this).find('.popuplink-header');
		var widget = new OO.ui.PopupButtonWidget({
			label: $(this).find('.popuplink-label'),
			framed: false,
			popup: {
				head: $header.length || !('autoclose' in this.dataset),
				padded: true,
				autoClose: 'autoclose' in this.dataset,
				label: $header,
				$content: $(this).find('.popuplink-content')
			}
		});
		$(this).html(widget.$element);
	});
});