User:Liangent/PhiLiP's mw.api.js
外观
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google Chrome、Firefox、Microsoft Edge及Safari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
/**
* 简单的API读写实现,避免重复使用代码
*
* Maintainer: [[User:PhiLiP]]
*/
mw.api = { /* cache */
cache: {},
pass: function () {},
normalized: {},
/**
* Send an API request to server and retrieve the result
*
* @param query: the query to be sent
* @param ready: optional, callback function when API response is ready for using
*/
request: function (method, query, ready) {
if (typeof method != 'string' || !$.inArray(method, ['get', 'post'])) {
ready = query;
query = method;
method = 'get';
}
ready = ready || mw.api.pass;
query.format = 'json';
$[method](wgScriptPath + '/api.php', query, ready, 'json');
},
/**
* Get raw text of pages
*
* @param pages: require page(s), string or array
* @param ready: optional, callback function receive raw content
* @param purge: purge the cache? boolean
*/
raw: function (pages, ready, purge) {
if (typeof pages == 'string') {
pages = [pages];
}
if (typeof ready == 'boolean') {
purge = ready;
ready = mw.api.pass;
}
ready = ready || mw.api.pass;
purge = purge || false;
var _raw_from_cache = function (pages) {
var ret = {};
var pagelen = pages.length;
for (var id = 0; id < pagelen; id++) {
var page = pages[id];
var title = mw.api.normalized[page] || page;
if (typeof mw.api.cache[title] == 'object') {
ret[page] = mw.api.cache[title]['*'];
}
}
return ret;
}
var ready_data = {};
var titles = [];
if (!purge) {
$.extend(ready_data, _raw_from_cache(pages));
var pagelen = pages.length;
for (var id = 0; id < pagelen; id++) {
var page = pages[id];
if (!ready_data[page]) {
titles.push(page);
}
}
} else {
titles = pages;
}
if (titles.length) {
mw.api.request({
'action': 'query',
'prop': 'revisions',
'titles': titles.join('|'),
'rvprop': 'timestamp|content'
}, function (data) {
if (data.query.normalized) {
normlen = data.query.normalized.length;
for (var normid = 0; normid < normlen; normid++) {
var norm = data.query.normalized[normid];
mw.api.normalized[norm.from] = norm.to;
}
}
for (var pageid in data.query.pages) {
var page = data.query.pages[pageid];
var cache = mw.api.cache[page.title] = {};
cache.missing = pageid < 0;
if (cache.missing) {
cache.timestamp = null;
cache['*'] = null;
} else {
$.extend(cache, page.revisions[0]);
}
}
$.extend(ready_data, _raw_from_cache(titles));
ready(ready_data);
});
} else {
ready(ready_data);
}
},
/**
* Edit a page with content
*/
edit: function (page, text, summary, ready) {
page = mw.api.normalized[page] || page;
if (typeof summary == 'function') {
ready = summary;
summary = '';
} else {
summary = summary || '';
ready = ready || mw.api.pass;
}
// request an edit token
mw.api.request({
'action': 'query',
'prop': 'info',
'intoken': 'edit',
'titles': page
}, function (data) {
var token = '';
var starttimestamp = '';
for (var pageid in data.query.pages) {
token = data.query.pages[pageid].edittoken;
starttimestamp = data.query.pages[pageid].starttimestamp;
}
var query = {
'action': 'edit',
'title': page,
'starttimestamp': starttimestamp,
'summary': summary,
'text': text,
'token': token
};
if (mw.api.cache[page]) {
// use basetimestamp to prevent edit conflict
query.basetimestamp = mw.api.cache[page].timestamp;
}
mw.api.request('post', query, ready);
});
},
/**
* Parse a page content
*/
parse: function (page, variant, ready) {
if (typeof variant == 'function') {
ready = variant;
variant = window.wgUserVariant || false;
} else {
ready = ready || mw.api.pass;
variant = variant || window.wgUserVariant || false;
}
var query = {
'action': 'parse',
'page': page
}
if (variant) {
query.variant = variant;
}
mw.api.request(query, function (data) {
ready(data.parse.text['*'], data.parse.displaytitle, data.parse.links);
});
}
};