跳转到内容

User:Liangent/PhiLiP's mw.api.js

维基百科,自由的百科全书

注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ 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);
            });
        }
    };