User:Emma/common.js

From Zelda Dungeon Wiki
< User:Emma
Revision as of 09:05, July 21, 2015 by Emma (talk | contribs) (Testing some scripts)
Jump to navigation Jump to search
Want an adless experience? Log in or Create an account.

Note: After saving, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: hold Shift while clicking Reload, or press either Ctrl+F5 or Ctrl+R (Command+R on a Mac)
  • Google Chrome: press Ctrl+Shift+R (Command+Shift+R on a Mac)
  • Internet Explorer: hold Ctrl while clicking Refresh, or press Ctrl+F5
  • Konqueror: click Reload or press F5
  • Opera: clear the cache in Tools → Preferences
mw.loader.using( 'mediawiki.searchSuggest', function () {
    $(document).ready( function () {
        $('#searchInput, #powerSearchText, #searchText, .mw-searchInput').off().attr('autocomplete', 'on');
        $('#simpleSearch #searchButton').attr( {'name': 'fulltext', 'value': 'Search' } );
    } );
} );
$(".mw-rollback-link").on('click', function(e) {
			var count = e.target.innerText.match(/\d/) ? e.target.innerText.match(/\d+/)[0] : null,
				message = 'Rollback ' + (count ? count + ' edits' : 'edit') + ' by ' + mw.util.getParamValue('from',e.target.href) + '?';
			if(!confirm(message)) return e.preventDefault();
});
mw.loader.implement("ext.gadget.autocomplete", function($, jQuery) {
    mw.loader.using(['jquery.ui.widget', 'jquery.ui.autocomplete', 'jquery.textSelection'], function() {
        $.fn.autoCompleteWikiText = function(options) {
            var mode = "none";
            var templateDataCache = {};
            var ctrl = $(this);
            var settings = $.extend(true, {
                positionMy: $('body').is('.rtl') ? "left top" : "right top",
                positionAt: $('body').is('.rtl') ? "left bottom" : "right bottom",
                positionOf: ctrl,
                positionOffset: "0",
                filterResponse: function(a) {
                    return a;
                },
                menuCSS: {
                    width: 'auto',
                    maxHeight: '30em',
                    'overflow-y': 'auto'
                },
                itemCSS: {
                    right: 'inherit'
                },
                onselected: function(item) {
                    var pos = ctrl.textSelection('getCaretPosition') - 1,
                        txt = ctrl.val();
                    var open, close, caretBackwards;
                    switch (mode) {
                        case "none":
                            return;
                        case "templateValue":
                            open = "|";
                            close = "";
                            caretBackwards = 0;
                            break;
                        case "templateParams":
                            open = "|";
                            close = "=";
                            caretBackwards = 0;
                            break;
                        case "template":
                            item = item.substr(mw.config.get('wgFormattedNamespaces')[10].length + 1);
                            caretBackwards = 2;
                            open = "{{";
                            close = "|}}";
                            break;
                        case "link":
                            open = "[[";
                            close =
                                "]]";
                            caretBackwards = 0;
                            if (item[item.length - 1] == ')') item += '|';
                            break;
                    }
                    var lastbegin = txt.lastIndexOf(open, pos);
                    if (txt[lastbegin + 2] == ':') item = ':' + item;
                    var newTxt = txt.substr(0, lastbegin) + open + item + close + txt.substr(pos + 1);
                    var orgScroll = ctrl.scrollTop();
                    ctrl.val(newTxt);
                    ctrl.textSelection('setSelection', {
                        start: lastbegin + (open + item + close).length - caretBackwards
                    });
                    ctrl.scrollTop(orgScroll);
                }
            }, options);

            function findLinks(res) {
                var pos = ctrl.textSelection('getCaretPosition') - 1;
                var txt = ctrl.val();
                var lastbegin = txt.lastIndexOf("[[", pos);
                var lastend = txt.lastIndexOf("]]", pos);
                var isLink = lastbegin > lastend;
                if (isLink) {
                    mode = 'link';
                    fillLinksList(res, txt.substr(lastbegin + 2, pos - lastbegin));
                } else {
                    lastbegin = txt.lastIndexOf("{{", pos);
                    lastend = txt.lastIndexOf("}}", pos);
                    var isTemplate = lastbegin > lastend;
                    if (isTemplate) {
                        var prefixName = mw.config.get('wgFormattedNamespaces')[10] + ':' + txt.substr(lastbegin + 2, pos - lastbegin - 1);
                        mode = (prefixName.indexOf('|') > -1) ? 'templateParams' : 'template';
                        fillLinksList(res, prefixName);
                    } else {
                        mode = "none";
                        res([]);
                    }
                }
            }

            function resolveTempalte(templateName) {
                var dfd = new jQuery.Deferred();
                if (!templateName) return dfd.reject().promise();
                if (templateDataCache[templateName]) return dfd.resolve().promise();
                var api = new mw.Api();
                api.get({
                    action: 'templatedata',
                    titles: templateName,
                    redirects: 1
                }).done(function(data) {
                    if (!data.pages) return dfd.reject();
                    for (var pageid in data.pages) {
                        templateDataCache[templateName] = data.pages[pageid];
                        dfd.resolve();
                    }
                    if (!templateDataCache[templateName]) dfd.reject();
                });
                return dfd.promise();
            }

            function resolveApi(queryType, queryValue) {
                var dfd = new jQuery.Deferred();
                var api = new mw.Api();
                switch (queryType) {
                    case 'users':
                        api.get({
                            action: 'query',
                            list: 'allusers',
                            auactiveusers: 1,
                            auprefix: queryValue
                        }).done(function(data) {
                            if (data && data.query && data.query.allusers) dfd.resolve($.map(data.query.allusers, function(e) {
                                return e.name;
                            }));
                            else dfd.reject();
                        });
                        break;
                    case 'pages':
                        api.get({
                            action: 'opensearch',
                            search: queryValue
                        }).done(function(data) {
                            if (data[1]) dfd.resolve(settings.filterResponse(data[1]));
                            else dfd.reject();
                        });
                        break;
                    default:
                        throw 'unexpected queryType';
                }
                return dfd.promise();
            }

            function fillLinksList(res, txt) {
                txt = $.trim(txt);
                if (txt.length <= 1 || (mode != 'templateParams' && txt.indexOf('|') > -1) || (txt.indexOf('#') > -1 && mw.config.get('wgNamespaceNumber') === 0)) res([]);
                else if (mode === 'templateParams') {
                    var templateMatch = /(.+?)\|(?:.*\|)?([^=]+$)/.exec(txt);
                    $.when(resolveTempalte(templateMatch && templateMatch[1])).done(function() {
                        var curTemplateData = templateDataCache[templateMatch[1]];
                        var suggestions = [];
                        var curParamIndex = txt.split('|').length - 1;
                        for (var paramName in curTemplateData.params) {
                            if (paramName == curParamIndex) {
                                var paramValue = templateMatch[2];
                                var dfd;
                                switch (curTemplateData.params[paramName].type) {
                                    case 'wiki-page-name':
                                        dfd = $.when(resolveApi('pages', paramValue));
                                        mode = 'templateValue';
                                        break;
                                    case 'wiki-file-name':
                                        dfd = $.when(resolveApi('pages', 'File:' + paramValue));
                                        mode = 'templateValue';
                                        break;
                                    case 'wiki-user-name':
                                        dfd = $.when(resolveApi('users', paramValue));
                                        mode = 'templateValue';
                                        break;
                                    default:
                                        return res([]);
                                }
                                return dfd.done(res).fail(function() {
                                    res([])
                                });
                            }
                            if (paramName === '1' || txt.indexOf(paramName) > -1) continue;
                            suggestions.push(paramName);
                        }
                        res(suggestions);
                    }).fail(res);
                } else if (txt.indexOf('#') > -1) {
                    var pageTitle = txt.substr(0, txt.indexOf('#'));
                    var sectionPrefix = txt.substr(txt.indexOf('#') + 1);
                    var api = new mw.Api();
                    api.get({
                        action: 'parse',
                        page: pageTitle,
                        prop: 'sections'
                    }).done(function(data) {
                        if (data && data.parse && data.parse.sections) res($(data.parse.sections).map(function() {
                            return this.line.indexOf(sectionPrefix) == 0 ? (pageTitle + '#' + this.line) : null;
                        }));
                    });
                } else {
                    $.when(resolveApi('pages', txt)).done(res).fail(function() {
                        res([])
                    });
                }
            }
            ctrl.autocomplete({
                source: function(request, response) {
                    if (fixArrowsBug(this)) response([]);
                    else findLinks(response);
                },
                focus: function() {
                    return false;
                },
                select: function(e, ui) {
                    settings.onselected(ui.item.value);
                    return false;
                },
                open: function() {
                    $(".ui-autocomplete").css(settings.menuCSS).position({
                        my: settings.positionMy,
                        at: settings.positionAt,
                        of: settings.
                        positionOf,
                        offset: settings.positionOffset,
                        collision: 'none fit'
                    }).find('li').css(settings.itemCSS);
                }
            });
            var fixed = false;

            function fixArrowsBug(self) {
                if (fixed) return false;
                fixed = true;
                ctrl.off("keydown.autocomplete");
                ctrl.off("keydown.autocomplete0");
                ctrl.on("keydown.autocomplete", function(event) {
                    var keyCode = $.ui.keyCode;
                    switch (event.keyCode) {
                        case keyCode.PAGE_UP:
                            self._move("previousPage", event);
                            break;
                        case keyCode.PAGE_DOWN:
                            self._move("nextPage", event);
                            break;
                        case keyCode.UP:
                            if (!self.menu.element.is(":visible")) return;
                            self._move("previous", event);
                            event.preventDefault();
                            break;
                        case keyCode.DOWN:
                            if (!self.menu.element.is(":visible")) return;
                            self._move("next", event);
                            event.preventDefault();
                            break;
                        case keyCode.ENTER:
                        case keyCode.NUMPAD_ENTER:
                            if (self.menu.active) {
                                event.preventDefault();
                            }
                        case keyCode.TAB:
                            if (!self.menu.active) {
                                return;
                            }
                            self.menu.select(event);
                            break;
                        case keyCode.ESCAPE:
                            self.element.val(self.term);
                            self.close(event);
                            break;
                        case keyCode.LEFT:
                        case keyCode.RIGHT:
                        case keyCode.SHIFT:
                        case keyCode.
                        CONTROL:
                        case keyCode.ALT:
                        case keyCode.COMMAND:
                        case keyCode.COMMAND_RIGHT:
                        case keyCode.INSERT:
                        case keyCode.CAPS_LOCK:
                        case keyCode.END:
                        case keyCode.HOME:
                            break;
                        default:
                            clearTimeout(self.searching);
                            self.searching = setTimeout(function() {
                                self.search(null, event);
                            }, self.options.delay);
                            break;
                    }
                });
                return true;
            }
        }
    });
    if ($.inArray(mw.config.get('wgAction'), ['edit', 'submit']) + 1) mw.loader.using(['jquery.ui.widget', 'jquery.ui.autocomplete', 'jquery.textSelection'], function() {
        $("#wpTextbox1").autoCompleteWikiText({
            positionAt: $('#wpTextbox1').prop('dir') == 'rtl' ? "left top" : "right top",
            positionOf: '#editform',
            positionOffset: "0 0",
            menuCSS: {
                background: '#E0EEF7',
                opacity: 0.8
            },
            itemCSS: {
                padding: 0,
                margin: 0
            }
        });
    });
});