利用者:Nanona15dobato/script/api.js
表示
お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。
多くの Windows や Linux のブラウザ
- Ctrl を押しながら F5 を押す。
Mac における Safari
Mac における Chrome や Firefox
- ⌘ Cmd と ⇧ Shift を押しながら R を押す。
詳細についてはWikipedia:キャッシュを消すをご覧ください。
// 日本語版Wikipedia title=Wikipedia:カスタムJS&oldid=102636628 より
// overwrites obj1
// deepMerge({a: {b: [2], c: 3}, d: {e: {f: [4, 5]}}, g: 6}, {a: {b: [7], c: 8}, d: {e: {f: [9, 10]}}, h: 11})
// => {a: {b: [2, 7], c: 8}, d: {e: {f: [4, 5, 9, 10]}}, g: 6, h: 11}
function deepMerge(obj1, obj2) {
$.each(obj2, function (key, value2) {
if (key in obj1) {
var value1 = obj1[key];
if (Array.isArray(value1)) {
if (Array.isArray(value2)) {
obj1[key] = value1.concat(value2);
} else {
value1.push(value2);
}
} else if (typeof value1 === 'object') {
if (typeof value2 === 'object') {
deepMerge(value1, value2);
} else {
obj1[key] = value2;
}
} else {
obj1[key] = value2;
}
} else {
obj1[key] = value2;
}
});
return obj1;
}
// iterate getting query api if request returned continue
// api: mw.Api
// options: Object, get options
// maxTry: integer, nullable (default 10), max of iterates count
// interval: integer, nullable (default 1000), milliseconds to sleep between each query
// deferred: jQuery.Deferred, nullable
// currentResult: Object, nullable, current query result
// returns deferred object
// deferred return value: query result (data.query)
function iterateQuery(api, options, maxTry, interval, deferred, currentResult, mode) {
if (typeof (maxTry) !== 'number') {
maxTry = 10;
}
interval = interval || 1000;
deferred = deferred || $.Deferred();
currentResult = currentResult || {
};
if (maxTry === 0) {
deferred.reject('maxTry is 0');
return deferred;
}
api.get($.extend({
action: 'query',
}, options)).done(function (data) {
console.log(data);
currentResult = deepMerge(currentResult, data.query);
if (data.continue && maxTry > 1) {
setTimeout(function () {
iterateQuery(api, $.extend(options, data.continue), maxTry - 1, interval, deferred, currentResult);
}, interval);
} else {
if (options.list === 'usercontribs') {
var retu = [currentResult, data];
console.log(retu);
deferred.resolve(retu);
} else {
deferred.resolve(currentResult);
}
}
});
return deferred.promise();
}