今天是2024年11月20日 第47周 星期三
代人,时大变了。
我们生活在大地上,但我们的梦想超越天空。
MediaWiki:Gadget-popups-main.js
跳到导航
跳到搜索
注意:在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Internet Explorer:按住Ctrl的同时单击刷新,或按Ctrl-F5
- Opera:前往菜单 → 设置(Mac为Opera → Preferences),然后隐私和安全 → 清除浏览数据 → 缓存的图片和文件。
$(function() { var pg = { re: {}, ns: {}, string: {}, wiki: {}, user: {}, misc: {}, option: {}, optionDefault: {}, flag: {}, cache: {}, structures: {}, timer: {}, counter: {}, current: {}, fn: {}, endoflist: null }; if (window.pg) { return; } window.pg = pg; function setupTooltips(container, remove, force, popData) { log("setupTooltips, container=" + container + ", remove=" + remove); if (!container) { if (getValueOf("popupOnEditSelection") && document && document.editform && document.editform.wpTextbox1) { document.editform.wpTextbox1.onmouseup = doSelectionPopup; } container = defaultPopupsContainer(); } if (!remove && !force && container.ranSetupTooltipsAlready) { return; } container.ranSetupTooltipsAlready = !remove; var anchors; anchors = container.getElementsByTagName("A"); setupTooltipsLoop(anchors, 0, 250, 100, remove, popData); } function defaultPopupsContainer() { if (getValueOf("popupOnlyArticleLinks")) { return document.getElementById("mw_content") || document.getElementById("content") || document.getElementById("article") || document; } return document; } function setupTooltipsLoop(anchors, begin, howmany, sleep, remove, popData) { log(simplePrintf("setupTooltipsLoop(%s,%s,%s,%s,%s)", arguments)); var finish = begin + howmany; var loopend = Math.min(finish, anchors.length); var j = loopend - begin; log("setupTooltips: anchors.length=" + anchors.length + ", begin=" + begin + ", howmany=" + howmany + ", loopend=" + loopend + ", remove=" + remove); var doTooltip = remove ? removeTooltip : addTooltip; if (j > 0) { do { var a = anchors[loopend - j]; if (typeof a === "undefined" || !a || !a.href) { log("got null anchor at index " + loopend - j); continue; } doTooltip(a, popData); } while (--j); } if (finish < anchors.length) { setTimeout(function() { setupTooltipsLoop(anchors, finish, howmany, sleep, remove, popData); }, sleep); } else { if (!remove && !getValueOf("popupTocLinks")) { rmTocTooltips(); } pg.flag.finishedLoading = true; } } function rmTocTooltips() { var toc = document.getElementById("toc"); if (toc) { var tocLinks = toc.getElementsByTagName("A"); var tocLen = tocLinks.length; for (var j = 0; j < tocLen; ++j) { removeTooltip(tocLinks[j], true); } } } function addTooltip(a, popData) { if (!isPopupLink(a)) { return; } a.onmouseover = mouseOverWikiLink; a.onmouseout = mouseOutWikiLink; a.onmousedown = killPopup; a.hasPopup = true; a.popData = popData; } function removeTooltip(a) { if (!a.hasPopup) { return; } a.onmouseover = null; a.onmouseout = null; if (a.originalTitle) { a.title = a.originalTitle; } a.hasPopup = false; } function removeTitle(a) { if (!a.originalTitle) { a.originalTitle = a.title; } a.title = ""; } function restoreTitle(a) { if (a.title || !a.originalTitle) { return; } a.title = a.originalTitle; } function registerHooks(np) { var popupMaxWidth = getValueOf("popupMaxWidth"); if (typeof popupMaxWidth === "number") { var setMaxWidth = function() { np.mainDiv.style.maxWidth = popupMaxWidth + "px"; np.maxWidth = popupMaxWidth; }; np.addHook(setMaxWidth, "unhide", "before"); } np.addHook(addPopupShortcuts, "unhide", "after"); np.addHook(rmPopupShortcuts, "hide", "before"); } function removeModifierKeyHandler(a) { document.removeEventListener("keydown", a.modifierKeyHandler, false); document.removeEventListener("keyup", a.modifierKeyHandler, false); } function mouseOverWikiLink(evt) { if (!evt && window.event) { evt = window.event; } if (getValueOf("popupModifier")) { var action = getValueOf("popupModifierAction"); var key = action == "disable" ? "keyup" : "keydown"; var a = this; a.modifierKeyHandler = function(evt) { mouseOverWikiLink2(a, evt); }; document.addEventListener(key, a.modifierKeyHandler, false); } return mouseOverWikiLink2(this, evt); } function footnoteTarget(a) { var aTitle = Title.fromAnchor(a); var anch = aTitle.anchor; if (!/^(cite_note-|_note-|endnote)/.test(anch)) { return false; } var lTitle = Title.fromURL(location.href); if (lTitle.toString(true) !== aTitle.toString(true)) { return false; } var el = document.getElementById(anch); while (el && typeof el.nodeName === "string") { var nt = el.nodeName.toLowerCase(); if (nt === "li") { return el; } else if (nt === "body") { return false; } else if (el.parentNode) { el = el.parentNode; } else { return false; } } return false; } function footnotePreview(x, navpop) { setPopupHTML("<hr />" + x.innerHTML, "popupPreview", navpop.idNumber); } function modifierPressed(evt) { var mod = getValueOf("popupModifier"); if (!mod) { return false; } if (!evt && window.event) { evt = window.event; } return evt && mod && evt[mod.toLowerCase() + "Key"]; } function isCorrectModifier(a, evt) { if (!getValueOf("popupModifier")) { return true; } var action = getValueOf("popupModifierAction"); return action == "enable" && modifierPressed(evt) || action == "disable" && !modifierPressed(evt); } function mouseOverWikiLink2(a, evt) { if (!isCorrectModifier(a, evt)) { return; } if (getValueOf("removeTitles")) { removeTitle(a); } if (a == pg.current.link && a.navpopup && a.navpopup.isVisible()) { return; } pg.current.link = a; if (getValueOf("simplePopups") && !pg.option.popupStructure) { setDefault("popupStructure", "original"); } var article = new Title().fromAnchor(a); pg.current.article = article; if (!a.navpopup) { a.navpopup = newNavpopup(a, article); pg.current.linksHash[a.href] = a.navpopup; pg.current.links.push(a); } if (a.navpopup.pending === null || a.navpopup.pending !== 0) { simplePopupContent(a, article); } a.navpopup.showSoonIfStable(a.navpopup.delay); clearInterval(pg.timer.checkPopupPosition); pg.timer.checkPopupPosition = setInterval(checkPopupPosition, 600); if (getValueOf("simplePopups")) { if (getValueOf("popupPreviewButton") && !a.simpleNoMore) { var d = document.createElement("div"); d.className = "popupPreviewButtonDiv"; var s = document.createElement("span"); d.appendChild(s); s.className = "popupPreviewButton"; s["on" + getValueOf("popupPreviewButtonEvent")] = function() { a.simpleNoMore = true; d.style.display = "none"; nonsimplePopupContent(a, article); }; s.innerHTML = popupString("show preview"); setPopupHTML(d, "popupPreview", a.navpopup.idNumber); } } if (a.navpopup.pending !== 0) { nonsimplePopupContent(a, article); } } function simplePopupContent(a, article) { a.navpopup.hasPopupMenu = false; a.navpopup.setInnerHTML(popupHTML(a)); fillEmptySpans({ navpopup: a.navpopup }); if (getValueOf("popupDraggable")) { var dragHandle = getValueOf("popupDragHandle") || null; if (dragHandle && dragHandle != "all") { dragHandle += a.navpopup.idNumber; } setTimeout(function() { a.navpopup.makeDraggable(dragHandle); }, 150); } if (getValueOf("popupRedlinkRemoval") && a.className == "new") { setPopupHTML("<br>" + popupRedlinkHTML(article), "popupRedlink", a.navpopup.idNumber); } } function debugData(navpopup) { if (getValueOf("popupDebugging") && navpopup.idNumber) { setPopupHTML("idNumber=" + navpopup.idNumber + ", pending=" + navpopup.pending, "popupError", navpopup.idNumber); } } function newNavpopup(a, article) { var navpopup = new Navpopup(); navpopup.fuzz = 5; navpopup.delay = getValueOf("popupDelay") * 1e3; navpopup.idNumber = ++pg.idNumber; navpopup.parentAnchor = a; navpopup.parentPopup = a.popData && a.popData.owner; navpopup.article = article; registerHooks(navpopup); return navpopup; } function shouldShowNonSimple(a) { return !getValueOf("simplePopups") || a.simpleNoMore; } function shouldShow(a, option) { if (shouldShowNonSimple(a)) { return getValueOf(option); } else { return typeof window[option] != "undefined" && window[option]; } } function nonsimplePopupContent(a, article) { var diff = null, history = null; var params = parseParams(a.href); var oldid = typeof params.oldid == "undefined" ? null : params.oldid; if (shouldShow(a, "popupPreviewDiffs")) { diff = params.diff; } if (shouldShow(a, "popupPreviewHistory")) { history = params.action == "history"; } a.navpopup.pending = 0; var referenceElement = footnoteTarget(a); if (referenceElement) { footnotePreview(referenceElement, a.navpopup); } else if (diff || diff === 0) { loadDiff(article, oldid, diff, a.navpopup); } else if (history) { loadAPIPreview("history", article, a.navpopup); } else if (shouldShowNonSimple(a) && pg.re.contribs.test(a.href)) { loadAPIPreview("contribs", article, a.navpopup); } else if (shouldShowNonSimple(a) && pg.re.backlinks.test(a.href)) { loadAPIPreview("backlinks", article, a.navpopup); } else if (article.namespaceId() == pg.nsImageId && (shouldShow(a, "imagePopupsForImages") || !anchorContainsImage(a))) { loadAPIPreview("imagepagepreview", article, a.navpopup); loadImage(article, a.navpopup); } else { if (article.namespaceId() == pg.nsCategoryId && shouldShow(a, "popupCategoryMembers")) { loadAPIPreview("category", article, a.navpopup); } else if ((article.namespaceId() == pg.nsUserId || article.namespaceId() == pg.nsUsertalkId) && shouldShow(a, "popupUserInfo")) { loadAPIPreview("userinfo", article, a.navpopup); } if (shouldShowNonSimple(a)) startArticlePreview(article, oldid, a.navpopup); } } function pendingNavpopTask(navpop) { if (navpop && navpop.pending === null) { navpop.pending = 0; } ++navpop.pending; debugData(navpop); } function completedNavpopTask(navpop) { if (navpop && navpop.pending) { --navpop.pending; } debugData(navpop); } function startArticlePreview(article, oldid, navpop) { navpop.redir = 0; loadPreview(article, oldid, navpop); } function loadPreview(article, oldid, navpop) { if (!navpop.redir) { navpop.originalArticle = article; } article.oldid = oldid; loadAPIPreview("revision", article, navpop); } function loadPreviewFromRedir(redirMatch, navpop) { var target = new Title().fromWikiText(redirMatch[2]); if (navpop.article.anchor) { target.anchor = navpop.article.anchor; } navpop.redir++; navpop.redirTarget = target; var warnRedir = redirLink(target, navpop.article); setPopupHTML(warnRedir, "popupWarnRedir", navpop.idNumber); navpop.article = target; fillEmptySpans({ redir: true, redirTarget: target, navpopup: navpop }); return loadPreview(target, null, navpop); } function insertPreview(download) { if (!download.owner) { return; } var redirMatch = pg.re.redirect.exec(download.data); if (download.owner.redir === 0 && redirMatch) { loadPreviewFromRedir(redirMatch, download.owner); return; } if (download.owner.visible || !getValueOf("popupLazyPreviews")) { insertPreviewNow(download); } else { var id = download.owner.redir ? "PREVIEW_REDIR_HOOK" : "PREVIEW_HOOK"; download.owner.addHook(function() { insertPreviewNow(download); return true; }, "unhide", "after", id); } } function insertPreviewNow(download) { if (!download.owner) { return; } var wikiText = download.data; var navpop = download.owner; var art = navpop.redirTarget || navpop.originalArticle; makeFixDabs(wikiText, navpop); if (getValueOf("popupSummaryData")) { getPageInfo(wikiText, download); setPopupTrailer(getPageInfo(wikiText, download), navpop.idNumber); } var imagePage = ""; if (art.namespaceId() == pg.nsImageId) { imagePage = art.toString(); } else { imagePage = getValidImageFromWikiText(wikiText); } if (imagePage) { loadImage(Title.fromWikiText(imagePage), navpop); } if (getValueOf("popupPreviews")) { insertArticlePreview(download, art, navpop); } } function insertArticlePreview(download, art, navpop) { if (download && typeof download.data == typeof "") { if (art.namespaceId() == pg.nsTemplateId && getValueOf("popupPreviewRawTemplates")) { var h = '<hr /><span style="font-family: monospace;">' + download.data.entify().split("\\n").join("<br />\\n") + "</span>"; setPopupHTML(h, "popupPreview", navpop.idNumber); } else { var p = prepPreviewmaker(download.data, art, navpop); p.showPreview(); } } } function prepPreviewmaker(data, article, navpop) { var d = anchorize(data, article.anchorString()); var urlBase = joinPath([pg.wiki.articlebase, article.urlString()]); var p = new Previewmaker(d, urlBase, navpop); return p; } function anchorize(d, anch) { if (!anch) { return d; } var anchRe = RegExp("(?:=+\\s*" + literalizeRegex(anch).replace(/[_ ]/g, "[_ ]") + "\\s*=+|\\{\\{\\s*" + getValueOf("popupAnchorRegexp") + "\\s*(?:\\|[^|}]*)*?\\s*" + literalizeRegex(anch) + "\\s*(?:\\|[^}]*)?}})"); var match = d.match(anchRe); if (match && match.length > 0 && match[0]) { return d.substring(d.indexOf(match[0])); } var lines = d.split("\n"); for (var i = 0; i < lines.length; ++i) { lines[i] = lines[i].replace(RegExp("[[]{2}([^|\\]]*?[|])?(.*?)[\\]]{2}", "g"), "$2").replace(/'''([^'])/g, "$1").replace(RegExp("''([^'])", "g"), "$1"); if (lines[i].match(anchRe)) { return d.split("\n").slice(i).join("\n").replace(RegExp("^[^=]*"), ""); } } return d; } function killPopup() { removeModifierKeyHandler(this); if (getValueOf("popupShortcutKeys")) { rmPopupShortcuts(); } if (!pg) { return; } if (pg.current.link && pg.current.link.navpopup) { pg.current.link.navpopup.banish(); } pg.current.link = null; abortAllDownloads(); if (pg.timer.checkPopupPosition) { clearInterval(pg.timer.checkPopupPosition); pg.timer.checkPopupPosition = null; } return true; } function Drag() { this.startCondition = null; this.endHook = null; } Drag.prototype.fixE = function(e) { if (typeof e == "undefined") { e = window.event; } if (typeof e.layerX == "undefined") { e.layerX = e.offsetX; } if (typeof e.layerY == "undefined") { e.layerY = e.offsetY; } return e; }; Drag.prototype.init = function(o, oRoot) { var dragObj = this; this.obj = o; o.onmousedown = function(e) { dragObj.start.apply(dragObj, [e]); }; o.dragging = false; o.popups_draggable = true; o.hmode = true; o.vmode = true; o.root = oRoot ? oRoot : o; if (isNaN(parseInt(o.root.style.left, 10))) { o.root.style.left = "0px"; } if (isNaN(parseInt(o.root.style.top, 10))) { o.root.style.top = "0px"; } o.root.onthisStart = function() {}; o.root.onthisEnd = function() {}; o.root.onthis = function() {}; }; Drag.prototype.start = function(e) { var o = this.obj; e = this.fixE(e); if (this.startCondition && !this.startCondition(e)) { return; } var y = parseInt(o.vmode ? o.root.style.top : o.root.style.bottom, 10); var x = parseInt(o.hmode ? o.root.style.left : o.root.style.right, 10); o.root.onthisStart(x, y); o.lastMouseX = e.clientX; o.lastMouseY = e.clientY; var dragObj = this; o.onmousemoveDefault = document.onmousemove; o.dragging = true; document.onmousemove = function(e) { dragObj.drag.apply(dragObj, [e]); }; document.onmouseup = function(e) { dragObj.end.apply(dragObj, [e]); }; return false; }; Drag.prototype.drag = function(e) { e = this.fixE(e); var o = this.obj; var ey = e.clientY; var ex = e.clientX; var y = parseInt(o.vmode ? o.root.style.top : o.root.style.bottom, 10); var x = parseInt(o.hmode ? o.root.style.left : o.root.style.right, 10); var nx, ny; nx = x + (ex - o.lastMouseX) * (o.hmode ? 1 : -1); ny = y + (ey - o.lastMouseY) * (o.vmode ? 1 : -1); this.obj.root.style[o.hmode ? "left" : "right"] = nx + "px"; this.obj.root.style[o.vmode ? "top" : "bottom"] = ny + "px"; this.obj.lastMouseX = ex; this.obj.lastMouseY = ey; this.obj.root.onthis(nx, ny); return false; }; Drag.prototype.end = function() { document.onmousemove = this.obj.onmousemoveDefault; document.onmouseup = null; this.obj.dragging = false; if (this.endHook) { this.endHook(parseInt(this.obj.root.style[this.obj.hmode ? "left" : "right"], 10), parseInt(this.obj.root.style[this.obj.vmode ? "top" : "bottom"], 10)); } }; pg.structures.original = {}; pg.structures.original.popupLayout = function() { return ["popupError", "popupImage", "popupTopLinks", "popupTitle", "popupUserData", "popupData", "popupOtherLinks", "popupRedir", ["popupWarnRedir", "popupRedirTopLinks", "popupRedirTitle", "popupRedirData", "popupRedirOtherLinks"], "popupMiscTools", ["popupRedlink"], "popupPrePreviewSep", "popupPreview", "popupSecondPreview", "popupPreviewMore", "popupPostPreview", "popupFixDab"]; }; pg.structures.original.popupRedirSpans = function() { return ["popupRedir", "popupWarnRedir", "popupRedirTopLinks", "popupRedirTitle", "popupRedirData", "popupRedirOtherLinks"]; }; pg.structures.original.popupTitle = function(x) { log("defaultstructure.popupTitle"); if (!getValueOf("popupNavLinks")) { return navlinkStringToHTML("<b><<mainlink>></b>", x.article, x.params); } return ""; }; pg.structures.original.popupTopLinks = function(x) { log("defaultstructure.popupTopLinks"); if (getValueOf("popupNavLinks")) { return navLinksHTML(x.article, x.hint, x.params); } return ""; }; pg.structures.original.popupImage = function(x) { log("original.popupImage, x.article=" + x.article + ", x.navpop.idNumber=" + x.navpop.idNumber); return imageHTML(x.article, x.navpop.idNumber); }; pg.structures.original.popupRedirTitle = pg.structures.original.popupTitle; pg.structures.original.popupRedirTopLinks = pg.structures.original.popupTopLinks; function copyStructure(oldStructure, newStructure) { pg.structures[newStructure] = {}; for (var prop in pg.structures[oldStructure]) { pg.structures[newStructure][prop] = pg.structures[oldStructure][prop]; } } copyStructure("original", "nostalgia"); pg.structures.nostalgia.popupTopLinks = function(x) { var str = ""; str += "<b><<mainlink|shortcut= >></b>"; str += "if(user){<br><<contribs|shortcut=c>>"; str += "if(wikimedia){*<<count|shortcut=#>>}"; str += "if(ipuser){}else{*<<email|shortcut=E>>}if(admin){*<<block|shortcut=b>>}}"; var editstr = "<<edit|shortcut=e>>"; var editOldidStr = "if(oldid){<<editOld|shortcut=e>>|<<revert|shortcut=v|rv>>|<<edit|cur>>}else{" + editstr + "}"; var historystr = "<<history|shortcut=h>>"; var watchstr = "<<unwatch|unwatchShort>>|<<watch|shortcut=w|watchThingy>>"; str += "<br>if(talk){" + editOldidStr + "|<<new|shortcut=+>>" + "*" + historystr + "*" + watchstr + "*" + "<b><<article|shortcut=a>></b>|<<editArticle|edit>>" + "}else{" + editOldidStr + "*" + historystr + "*" + watchstr + "*" + "<b><<talk|shortcut=t>></b>|<<editTalk|edit>>|<<newTalk|shortcut=+|new>>}"; str += "<br><<whatLinksHere|shortcut=l>>*<<relatedChanges|shortcut=r>>"; str += "if(admin){<br>}else{*}<<move|shortcut=m>>"; str += "if(admin){*<<unprotect|unprotectShort>>|<<protect|shortcut=p>>*" + "<<undelete|undeleteShort>>|<<delete|shortcut=d>>}"; return navlinkStringToHTML(str, x.article, x.params); }; pg.structures.nostalgia.popupRedirTopLinks = pg.structures.nostalgia.popupTopLinks; copyStructure("original", "fancy"); pg.structures.fancy.popupTitle = function(x) { return navlinkStringToHTML("<font size=+0><<mainlink>></font>", x.article, x.params); }; pg.structures.fancy.popupTopLinks = function(x) { var hist = "<<history|shortcut=h|hist>>|<<lastEdit|shortcut=/|last>>|<<editors|shortcut=E|eds>>"; var watch = "<<unwatch|unwatchShort>>|<<watch|shortcut=w|watchThingy>>"; var move = "<<move|shortcut=m|move>>"; return navlinkStringToHTML("if(talk){" + "<<edit|shortcut=e>>|<<new|shortcut=+|+>>*" + hist + "*" + "<<article|shortcut=a>>|<<editArticle|edit>>" + "*" + watch + "*" + move + "}else{<<edit|shortcut=e>>*" + hist + "*<<talk|shortcut=t|>>|<<editTalk|edit>>|<<newTalk|shortcut=+|new>>" + "*" + watch + "*" + move + "}<br>", x.article, x.params); }; pg.structures.fancy.popupOtherLinks = function(x) { var admin = "<<unprotect|unprotectShort>>|<<protect|shortcut=p>>*<<undelete|undeleteShort>>|<<delete|shortcut=d|del>>"; var user = "<<contribs|shortcut=c>>if(wikimedia){|<<count|shortcut=#|#>>}"; user += "if(ipuser){|<<arin>>}else{*<<email|shortcut=E|" + popupString("email") + ">>}if(admin){*<<block|shortcut=b>>}"; var normal = "<<whatLinksHere|shortcut=l|links here>>*<<relatedChanges|shortcut=r|related>>"; return navlinkStringToHTML("<br>if(user){" + user + "*}if(admin){" + admin + "if(user){<br>}else{*}}" + normal, x.article, x.params); }; pg.structures.fancy.popupRedirTitle = pg.structures.fancy.popupTitle; pg.structures.fancy.popupRedirTopLinks = pg.structures.fancy.popupTopLinks; pg.structures.fancy.popupRedirOtherLinks = pg.structures.fancy.popupOtherLinks; copyStructure("fancy", "fancy2"); pg.structures.fancy2.popupTopLinks = function(x) { return "<br>" + pg.structures.fancy.popupTopLinks(x).replace(RegExp("<br>$", "i"), ""); }; pg.structures.fancy2.popupLayout = function() { return ["popupError", "popupImage", "popupTitle", "popupUserData", "popupData", "popupTopLinks", "popupOtherLinks", "popupRedir", ["popupWarnRedir", "popupRedirTopLinks", "popupRedirTitle", "popupRedirData", "popupRedirOtherLinks"], "popupMiscTools", ["popupRedlink"], "popupPrePreviewSep", "popupPreview", "popupSecondPreview", "popupPreviewMore", "popupPostPreview", "popupFixDab"]; }; copyStructure("original", "menus"); pg.structures.menus.popupLayout = function() { return ["popupError", "popupImage", "popupTopLinks", "popupTitle", "popupOtherLinks", "popupRedir", ["popupWarnRedir", "popupRedirTopLinks", "popupRedirTitle", "popupRedirData", "popupRedirOtherLinks"], "popupUserData", "popupData", "popupMiscTools", ["popupRedlink"], "popupPrePreviewSep", "popupPreview", "popupSecondPreview", "popupPreviewMore", "popupPostPreview", "popupFixDab"]; }; pg.structures.menus.popupTopLinks = function(x, shorter) { var s = []; var dropdiv = '<div class="popup_drop">'; var enddiv = "</div>"; var hist = "<<history|shortcut=h>>"; if (!shorter) { hist = "<menurow>" + hist + "|<<historyfeed|rss>>|<<editors|shortcut=E>></menurow>"; } var lastedit = "<<lastEdit|shortcut=/|show last edit>>"; var thank = "if(diff){<<thank|send thanks>>}"; var jsHistory = "<<lastContrib|last set of edits>><<sinceMe|changes since mine>>"; var linkshere = "<<whatLinksHere|shortcut=l|what links here>>"; var related = "<<relatedChanges|shortcut=r|related changes>>"; var search = "<menurow><<search|shortcut=s>>if(wikimedia){|<<globalsearch|shortcut=g|global>>}" + "|<<google|shortcut=G|web>></menurow>"; var watch = "<menurow><<unwatch|unwatchShort>>|<<watch|shortcut=w|watchThingy>></menurow>"; var protect = "<menurow><<unprotect|unprotectShort>>|" + "<<protect|shortcut=p>>|<<protectlog|log>></menurow>"; var del = "<menurow><<undelete|undeleteShort>>|<<delete|shortcut=d>>|" + "<<deletelog|log>></menurow>"; var move = "<<move|shortcut=m|move page>>"; var nullPurge = "<menurow><<nullEdit|shortcut=n|null edit>>|<<purge|shortcut=P>></menurow>"; var viewOptions = "<menurow><<view|shortcut=v>>|<<render|shortcut=S>>|<<raw>></menurow>"; var editRow = "if(oldid){" + "<menurow><<edit|shortcut=e>>|<<editOld|shortcut=e|this revision>></menurow>" + "<menurow><<revert|shortcut=v>>|<<undo>></menurow>" + "}else{<<edit|shortcut=e>>}"; var markPatrolled = "if(rcid){<<markpatrolled|mark patrolled>>}"; var newTopic = "if(talk){<<new|shortcut=+|new topic>>}"; var protectDelete = "if(admin){" + protect + del + "}"; if (getValueOf("popupActionsMenu")) { s.push("<<mainlink>>*" + dropdiv + menuTitle("actions")); } else { s.push(dropdiv + "<<mainlink>>"); } s.push("<menu>"); s.push(editRow + markPatrolled + newTopic + hist + lastedit + thank); if (!shorter) { s.push(jsHistory); } s.push(move + linkshere + related); if (!shorter) { s.push(nullPurge + search); } if (!shorter) { s.push(viewOptions); } s.push("<hr />" + watch + protectDelete); s.push("<hr />" + "if(talk){<<article|shortcut=a|view article>><<editArticle|edit article>>}" + "else{<<talk|shortcut=t|talk page>><<editTalk|edit talk>>" + "<<newTalk|shortcut=+|new topic>>}</menu>" + enddiv); var email = "<<email|shortcut=E|email user>>"; var contribs = "if(wikimedia){<menurow>}<<contribs|shortcut=c|contributions>>if(wikimedia){</menurow>}" + "if(admin){<menurow><<deletedContribs>></menurow>}"; s.push("if(user){*" + dropdiv + menuTitle("user")); s.push("<menu>"); s.push("<menurow><<userPage|shortcut=u|user page>>|<<userSpace|space>></menurow>"); s.push("<<userTalk|shortcut=t|user talk>><<editUserTalk|edit user talk>>" + "<<newUserTalk|shortcut=+|leave comment>>"); if (!shorter) { s.push("if(ipuser){<<arin>>}else{" + email + "}"); } else { s.push("if(ipuser){}else{" + email + "}"); } s.push("<hr />" + contribs + "<<userlog|shortcut=L|user log>>"); s.push("if(wikimedia){<<count|shortcut=#|edit counter>>}"); s.push("if(admin){<menurow><<unblock|unblockShort>>|<<block|shortcut=b|block user>></menurow>}"); s.push("<<blocklog|shortcut=B|block log>>"); s.push("</menu>" + enddiv + "}"); if (getValueOf("popupSetupMenu") && !x.navpop.hasPopupMenu) { x.navpop.hasPopupMenu = true; s.push("*" + dropdiv + menuTitle("popupsMenu") + "<menu>"); s.push("<<togglePreviews|toggle previews>>"); s.push("<<purgePopups|reset>>"); s.push("<<disablePopups|disable>>"); s.push("</menu>" + enddiv); } return navlinkStringToHTML(s.join(""), x.article, x.params); }; function menuTitle(s) { return '<a href="#" noPopup=1>' + popupString(s) + "</a>"; } pg.structures.menus.popupRedirTitle = pg.structures.menus.popupTitle; pg.structures.menus.popupRedirTopLinks = pg.structures.menus.popupTopLinks; copyStructure("menus", "shortmenus"); pg.structures.shortmenus.popupTopLinks = function(x) { return pg.structures.menus.popupTopLinks(x, true); }; pg.structures.shortmenus.popupRedirTopLinks = pg.structures.shortmenus.popupTopLinks; pg.structures.lite = {}; pg.structures.lite.popupLayout = function() { return ["popupTitle", "popupPreview"]; }; pg.structures.lite.popupTitle = function(x) { log(x.article + ": structures.lite.popupTitle"); return '<div><span class="popup_mainlink"><b>' + x.article.toString() + "</b></span></div>"; }; function substitute(data, cmdBody) { var fromRe = RegExp(cmdBody.from, cmdBody.flags); return data.replace(fromRe, cmdBody.to); } function execCmds(data, cmdList) { for (var i = 0; i < cmdList.length; ++i) { data = cmdList[i].action(data, cmdList[i]); } return data; } function parseCmd(str) { if (!str.length) { return []; } var p = false; switch (str.charAt(0)) { case "s": p = parseSubstitute(str); break; default: return false; } if (p) { return [p].concat(parseCmd(p.remainder)); } return false; } function unEscape(str, sep) { return str.split("\\\\").join("\\").split("\\" + sep).join(sep).split("\\n").join("\n"); } function parseSubstitute(str) { var from, to, flags, tmp; if (str.length < 4) { return false; } var sep = str.charAt(1); str = str.substring(2); tmp = skipOver(str, sep); if (tmp) { from = tmp.segment; str = tmp.remainder; } else { return false; } tmp = skipOver(str, sep); if (tmp) { to = tmp.segment; str = tmp.remainder; } else { return false; } flags = ""; if (str.length) { tmp = skipOver(str, ";") || skipToEnd(str, ";"); if (tmp) { flags = tmp.segment; str = tmp.remainder; } } return { action: substitute, from: from, to: to, flags: flags, remainder: str }; } function skipOver(str, sep) { var endSegment = findNext(str, sep); if (endSegment < 0) { return false; } var segment = unEscape(str.substring(0, endSegment), sep); return { segment: segment, remainder: str.substring(endSegment + 1) }; } function skipToEnd(str, sep) { return { segment: str, remainder: "" }; } function findNext(str, ch) { for (var i = 0; i < str.length; ++i) { if (str.charAt(i) == "\\") { i += 2; } if (str.charAt(i) == ch) { return i; } } return -1; } function setCheckbox(param, box) { var val = mw.util.getParamValue(param); if (val) { switch (val) { case "1": case "yes": case "true": box.checked = true; break; case "0": case "no": case "false": box.checked = false; } } } function autoEdit() { setupPopups(function() { if (mw.util.getParamValue("autoimpl") !== popupString("autoedit_version")) { return false; } if (mw.util.getParamValue("autowatchlist") && mw.util.getParamValue("actoken") === autoClickToken()) { pg.fn.modifyWatchlist(mw.util.getParamValue("title"), mw.util.getParamValue("action")); } if (!document.editform) { return false; } if (autoEdit.alreadyRan) { return false; } autoEdit.alreadyRan = true; var cmdString = mw.util.getParamValue("autoedit"); if (cmdString) { try { var editbox = document.editform.wpTextbox1; var cmdList = parseCmd(cmdString); var input = editbox.value; var output = execCmds(input, cmdList); editbox.value = output; } catch (dang) { return; } if (typeof wikEdUseWikEd != "undefined") { if (wikEdUseWikEd === true) { WikEdUpdateFrame(); } } } setCheckbox("autominor", document.editform.wpMinoredit); setCheckbox("autowatch", document.editform.wpWatchthis); var rvid = mw.util.getParamValue("autorv"); if (rvid) { var url = pg.wiki.apiwikibase + "?action=query&format=json&formatversion=2&prop=revisions&revids=" + rvid; startDownload(url, null, autoEdit2); } else { autoEdit2(); } }); } function autoEdit2(d) { var summary = mw.util.getParamValue("autosummary"); var summaryprompt = mw.util.getParamValue("autosummaryprompt"); var summarynotice = ""; if (d && d.data && mw.util.getParamValue("autorv")) { var s = getRvSummary(summary, d.data); if (s === false) { summaryprompt = true; summarynotice = popupString("Failed to get revision information, please edit manually.\n\n"); summary = simplePrintf(summary, [mw.util.getParamValue("autorv"), "(unknown)", "(unknown)"]); } else { summary = s; } } if (summaryprompt) { var txt = summarynotice + popupString("Enter a non-empty edit summary or press cancel to abort"); var response = prompt(txt, summary); if (response) { summary = response; } else { return; } } if (summary) { document.editform.wpSummary.value = summary; } setTimeout(autoEdit3, 100); } function autoClickToken() { return mw.user.sessionId(); } function autoEdit3() { if (mw.util.getParamValue("actoken") != autoClickToken()) { return; } var btn = mw.util.getParamValue("autoclick"); if (btn) { if (document.editform && document.editform[btn]) { var button = document.editform[btn]; var msg = tprintf("The %s button has been automatically clicked. Please wait for the next page to load.", [button.value]); bannerMessage(msg); document.title = "(" + document.title + ")"; button.click(); } else { alert(tprintf("Could not find button %s. Please check the settings in your javascript file.", [btn])); } } } function bannerMessage(s) { var headings = document.getElementsByTagName("h1"); if (headings) { var div = document.createElement("div"); div.innerHTML = "<font size=+1><b>" + s + "</b></font>"; headings[0].parentNode.insertBefore(div, headings[0]); } } function getRvSummary(template, json) { try { var o = getJsObj(json); var edit = anyChild(o.query.pages).revisions[0]; var timestamp = edit.timestamp.split(/[A-Z]/g).join(" ").replace(/^ *| *$/g, ""); return simplePrintf(template, [edit.revid, timestamp, edit.userhidden ? "(hidden)" : edit.user]); } catch (badness) { return false; } } function Downloader(url) { if (typeof XMLHttpRequest != "undefined") { this.http = new XMLHttpRequest(); } this.url = url; this.id = null; this.lastModified = null; this.callbackFunction = null; this.onFailure = null; this.aborted = false; this.method = "GET"; this.async = true; } new Downloader(); Downloader.prototype.send = function(x) { if (!this.http) { return null; } return this.http.send(x); }; Downloader.prototype.abort = function() { if (!this.http) { return null; } this.aborted = true; return this.http.abort(); }; Downloader.prototype.getData = function() { if (!this.http) { return null; } return this.http.responseText; }; Downloader.prototype.setTarget = function() { if (!this.http) { return null; } this.http.open(this.method, this.url, this.async); this.http.setRequestHeader("Api-User-Agent", pg.misc.userAgent); }; Downloader.prototype.getReadyState = function() { if (!this.http) { return null; } return this.http.readyState; }; pg.misc.downloadsInProgress = {}; Downloader.prototype.start = function() { if (!this.http) { return; } pg.misc.downloadsInProgress[this.id] = this; this.http.send(null); }; Downloader.prototype.getLastModifiedDate = function() { if (!this.http) { return null; } var lastmod = null; try { lastmod = this.http.getResponseHeader("Last-Modified"); } catch (err) {} if (lastmod) { return new Date(lastmod); } return null; }; Downloader.prototype.setCallback = function(f) { if (!this.http) { return; } this.http.onreadystatechange = f; }; Downloader.prototype.getStatus = function() { if (!this.http) { return null; } return this.http.status; }; function newDownload(url, id, callback, onfailure) { var d = new Downloader(url); if (!d.http) { return "ohdear"; } d.id = id; d.setTarget(); if (!onfailure) { onfailure = 2; } var f = function() { if (d.getReadyState() == 4) { delete pg.misc.downloadsInProgress[this.id]; try { if (d.getStatus() == 200) { d.data = d.getData(); d.lastModified = d.getLastModifiedDate(); callback(d); } else if (typeof onfailure == typeof 1) { if (onfailure > 0) { newDownload(url, id, callback, onfailure - 1); } } else if ($.isFunction(onfailure)) { onfailure(d, url, id, callback); } } catch (somerr) {} } }; d.setCallback(f); return d; } function fakeDownload(url, id, callback, data, lastModified, owner) { var d = newDownload(url, callback); d.owner = owner; d.id = id; d.data = data; d.lastModified = lastModified; return callback(d); } function startDownload(url, id, callback) { var d = newDownload(url, id, callback); if (typeof d == typeof "") { return d; } d.start(); return d; } function abortAllDownloads() { for (var x in pg.misc.downloadsInProgress) { try { pg.misc.downloadsInProgress[x].aborted = true; pg.misc.downloadsInProgress[x].abort(); delete pg.misc.downloadsInProgress[x]; } catch (e) {} } } var Insta = {}; function setupLivePreview() { Insta.conf = { baseUrl: "", user: {}, wiki: { lang: pg.wiki.lang, interwiki: pg.wiki.interwiki, default_thumb_width: 180 }, paths: { articles: pg.wiki.articlePath + "/", math: "/math/", images: "//upload.wikimedia.org/wikipedia/en/", images_fallback: "//upload.wikimedia.org/wikipedia/commons/" }, locale: { user: mw.config.get("wgFormattedNamespaces")[pg.nsUserId], image: mw.config.get("wgFormattedNamespaces")[pg.nsImageId], category: mw.config.get("wgFormattedNamespaces")[pg.nsCategoryId], months: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] } }; Insta.conf.user.name = Insta.conf.user.name || "Wikipedian"; Insta.conf.user.signature = "[[" + Insta.conf.locale.user + ":" + Insta.conf.user.name + "|" + Insta.conf.user.name + "]]"; Insta.BLOCK_IMAGE = new RegExp("^\\[\\[(?:File|Image|" + Insta.conf.locale.image + "):.*?\\|.*?(?:frame|thumbnail|thumb|none|right|left|center)", "i"); } Insta.dump = function(from, to) { if (typeof from == "string") { from = document.getElementById(from); } if (typeof to == "string") { to = document.getElementById(to); } to.innerHTML = this.convert(from.value); }; Insta.convert = function(wiki) { var ll = typeof wiki == "string" ? wiki.replace(/\r/g, "").split(/\n/) : wiki, o = "", p = 0, $r; function remain() { return ll.length; } function sh() { return ll.shift(); } function ps(s) { o += s; } function f() { var i = 1, a = arguments, f = a[0], o = "", c, p; for (; i < a.length; i++) { if ((p = f.indexOf("?")) + 1) { i -= c = f.charAt(p + 1) == "?" ? 1 : 0; o += f.substring(0, p) + (c ? "?" : a[i]); f = f.substr(p + 1 + c); } else { break; } } return o + f; } function html_entities(s) { return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">"); } function htmlescape_text(s) { return s.replace(/</g, "<").replace(/>/g, ">").replace(/:/g, ":").replace(/\[/g, "[").replace(/]/g, "]"); } function htmlescape_attr(s) { return htmlescape_text(s).replace(/'/g, "'").replace(/"/g, """); } function str_imatch(a, b) { for (var i = 0, l = Math.min(a.length, b.length); i < l; i++) { if (a.charAt(i) != b.charAt(i)) { break; } } return i; } function $(c) { return typeof c == "string" ? ll[0].substr(0, c.length) == c : $r = ll[0].match(c); } function $$(c) { return ll[0] == c; } function _(p) { return ll[0].charAt(p); } function endl(s) { ps(s); sh(); } function parse_list() { var prev = ""; while (remain() && $(/^([*#:;]+)(.*)$/)) { var l_match = $r; sh(); var ipos = str_imatch(prev, l_match[1]); for (var prevPos = prev.length - 1; prevPos >= ipos; prevPos--) { var pi = prev.charAt(prevPos); if (pi == "*") { ps("</ul>"); } else if (pi == "#") { ps("</ol>"); } else if ($.inArray(l_match[1].charAt(prevPos), ["", "*", "#"])) { ps("</dl>"); } } for (var matchPos = ipos; matchPos < l_match[1].length; matchPos++) { var li = l_match[1].charAt(matchPos); if (li == "*") { ps("<ul>"); } else if (li == "#") { ps("<ol>"); } else if ($.inArray(prev.charAt(matchPos), ["", "*", "#"])) { ps("<dl>"); } } switch (l_match[1].charAt(l_match[1].length - 1)) { case "*": case "#": ps("<li>" + parse_inline_nowiki(l_match[2])); break; case ";": ps("<dt>"); var dt_match = l_match[2].match(/(.*?)(:.*?)$/); if (dt_match) { ps(parse_inline_nowiki(dt_match[1])); ll.unshift(dt_match[2]); } else ps(parse_inline_nowiki(l_match[2])); break; case ":": ps("<dd>" + parse_inline_nowiki(l_match[2])); } prev = l_match[1]; } for (var i = prev.length - 1; i >= 0; i--) { ps(f("</?>", prev.charAt(i) == "*" ? "ul" : prev.charAt(i) == "#" ? "ol" : "dl")); } } function parse_table() { endl(f("<table>", $(/^\{\|( .*)$/) ? $r[1] : "")); for (; remain();) if ($("|")) switch (_(1)) { case "}": endl("</table>"); return; case "-": endl(f("<tr>", $(/\|-*(.*)/)[1])); break; default: parse_table_data(); } else if ($("!")) { parse_table_data(); } else { sh(); } } function parse_table_data() { var td_line, match_i; var td_match = sh().match(/^(\|\+|\||!)((?:([^[|]*?)\|(?!\|))?(.*))$/); if (td_match[1] == "|+") ps("<caption"); else ps("<t" + (td_match[1] == "|" ? "d" : "h")); if (typeof td_match[3] != "undefined") { match_i = 4; } else match_i = 2; ps(">"); if (td_match[1] != "|+") { td_line = td_match[match_i].split(td_match[1] == "|" ? "||" : /(?:\|\||!!)/); ps(parse_inline_nowiki(td_line.shift())); while (td_line.length) ll.unshift(td_match[1] + td_line.pop()); } else ps(td_match[match_i]); var tc = 0, td = []; while (remain()) { td.push(sh()); if ($("|")) { if (!tc) break; else if (_(1) == "}") tc--; } else if (!tc && $("!")) break; else if ($("{|")) tc++; } if (td.length) ps(Insta.convert(td)); } function parse_pre() { ps("<pre>"); do { endl(parse_inline_nowiki(ll[0].substring(1)) + "\n"); } while (remain() && $(" ")); ps("</pre>"); } function parse_block_image() { ps(parse_image(sh())); } function parse_image(str) { var tag = str.substring(str.indexOf(":") + 1, str.length - 2); var width; var attr = [], filename, caption = ""; var thumb = 0, frame = 0, center = 0; var align = ""; if (tag.match(/\|/)) { var nesting = 0; var last_attr; for (var i = tag.length - 1; i > 0; i--) { if (tag.charAt(i) == "|" && !nesting) { last_attr = tag.substr(i + 1); tag = tag.substring(0, i); break; } else switch (tag.substr(i - 1, 2)) { case "]]": nesting++; i--; break; case "[[": nesting--; i--; } } attr = tag.split(/\s*\|\s*/); attr.push(last_attr); filename = attr.shift(); var w_match; for (; attr.length; attr.shift()) { w_match = attr[0].match(/^(\d*)(?:[px]*\d*)?px$/); if (w_match) width = w_match[1]; else switch (attr[0]) { case "thumb": case "thumbnail": thumb = true; frame = true; break; case "frame": frame = true; break; case "none": case "right": case "left": center = false; align = attr[0]; break; case "center": center = true; align = "none"; break; default: if (attr.length == 1) caption = attr[0]; } } } else filename = tag; return ""; } function parse_inline_nowiki(str) { var start, lastend = 0; var substart = 0, nestlev = 0, open, close, subloop; var html = ""; while (-1 != (start = str.indexOf("<nowiki>", substart))) { html += parse_inline_wiki(str.substring(lastend, start)); start += 8; substart = start; subloop = true; do { open = str.indexOf("<nowiki>", substart); close = str.indexOf("</nowiki>", substart); if (close <= open || open == -1) { if (close == -1) { return html + html_entities(str.substr(start)); } substart = close + 9; if (nestlev) { nestlev--; } else { lastend = substart; html += html_entities(str.substring(start, lastend - 9)); subloop = false; } } else { substart = open + 8; nestlev++; } } while (subloop); } return html + parse_inline_wiki(str.substr(lastend)); } function parse_inline_images(str) { var start, substart = 0, nestlev = 0; var loop, close, open, wiki, html; while (-1 != (start = str.indexOf("[[", substart))) { if (str.substr(start + 2).match(RegExp("^(Image|File|" + Insta.conf.locale.image + "):", "i"))) { loop = true; substart = start; do { substart += 2; close = str.indexOf("]]", substart); open = str.indexOf("[[", substart); if (close <= open || open == -1) { if (close == -1) return str; substart = close; if (nestlev) { nestlev--; } else { wiki = str.substring(start, close + 2); html = parse_image(wiki); str = str.replace(wiki, html); substart = start + html.length; loop = false; } } else { substart = open; nestlev++; } } while (loop); } else break; } return str; } function parse_inline_formatting(str) { var em, st, i, li, o = ""; while ((i = str.indexOf("''", li)) + 1) { o += str.substring(li, i); li = i + 2; if (str.charAt(i + 2) == "'") { li++; st = !st; o += st ? "<strong>" : "</strong>"; } else { em = !em; o += em ? "<em>" : "</em>"; } } return o + str.substr(li); } function parse_inline_wiki(str) { str = parse_inline_images(str); str = parse_inline_formatting(str); str = str.replace(/<(?:)math>(.*?)<\/math>/gi, ""); var date = new Date(); var minutes = date.getUTCMinutes(); if (minutes < 10) minutes = "0" + minutes; date = f("?:?, ? ? ? (UTC)", date.getUTCHours(), minutes, date.getUTCDate(), Insta.conf.locale.months[date.getUTCMonth()], date.getUTCFullYear()); return str.replace(/~{5}(?!~)/g, date).replace(/~{4}(?!~)/g, Insta.conf.user.name + " " + date).replace(/~{3}(?!~)/g, Insta.conf.user.name).replace(RegExp("\\[\\[:((?:" + Insta.conf.locale.category + "|Image|File|" + Insta.conf.locale.image + "|" + Insta.conf.wiki.interwiki + "):[^|]*?)\\]\\](\\w*)", "gi"), function($0, $1, $2) { return f("<a href='?'>?</a>", Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($1) + htmlescape_text($2)); }).replace(RegExp("\\[\\[(?:" + Insta.conf.locale.category + "|" + Insta.conf.wiki.interwiki + "):.*?\\]\\]", "gi"), "").replace(RegExp("\\[\\[:((?:" + Insta.conf.locale.category + "|Image|File|" + Insta.conf.locale.image + "|" + Insta.conf.wiki.interwiki + "):.*?)\\|([^\\]]+?)\\]\\](\\w*)", "gi"), function($0, $1, $2, $3) { return f("<a href='?'>?</a>", Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($2) + htmlescape_text($3)); }).replace(/\[\[(\/[^|]*?)\]\]/g, function($0, $1) { return f("<a href='?'>?</a>", Insta.conf.baseUrl + htmlescape_attr($1), htmlescape_text($1)); }).replace(/\[\[(\/.*?)\|(.+?)\]\]/g, function($0, $1, $2) { return f("<a href='?'>?</a>", Insta.conf.baseUrl + htmlescape_attr($1), htmlescape_text($2)); }).replace(/\[\[([^[|]*?)\]\](\w*)/g, function($0, $1, $2) { return f("<a href='?'>?</a>", Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($1) + htmlescape_text($2)); }).replace(/\[\[([^[]*?)\|([^\]]+?)\]\](\w*)/g, function($0, $1, $2, $3) { return f("<a href='?'>?</a>", Insta.conf.paths.articles + htmlescape_attr($1), htmlescape_text($2) + htmlescape_text($3)); }).replace(/\[\[([^\]]*?:)?(.*?)( *\(.*?\))?\|\]\]/g, function($0, $1, $2, $3) { return f("<a href='?'>?</a>", Insta.conf.paths.articles + htmlescape_attr($1) + htmlescape_attr($2) + htmlescape_attr($3), htmlescape_text($2)); }).replace(/\[(https?|news|ftp|mailto|gopher|irc):(\/*)([^\]]*?) (.*?)\]/g, function($0, $1, $2, $3, $4) { return f("<a class='external' href='?:?'>?</a>", htmlescape_attr($1), htmlescape_attr($2) + htmlescape_attr($3), htmlescape_text($4)); }).replace(/\[http:\/\/(.*?)\]/g, function($0, $1) { return f("<a class='external' href='http://?'>[#]</a>", htmlescape_attr($1)); }).replace(/\[(news|ftp|mailto|gopher|irc):(\/*)(.*?)\]/g, function($0, $1, $2, $3) { return f("<a class='external' href='?:?'>?:?</a>", htmlescape_attr($1), htmlescape_attr($2) + htmlescape_attr($3), htmlescape_text($1), htmlescape_text($2) + htmlescape_text($3)); }).replace(/(^| )(https?|news|ftp|mailto|gopher|irc):(\/*)([^ $]*[^.,!?;: $])/g, function($0, $1, $2, $3, $4) { return f("?<a class='external' href='?:?'>?:?</a>", htmlescape_text($1), htmlescape_attr($2), htmlescape_attr($3) + htmlescape_attr($4), htmlescape_text($2), htmlescape_text($3) + htmlescape_text($4)); }).replace("__NOTOC__", "").replace("__NOEDITSECTION__", ""); } for (; remain();) if ($(/^(={1,6})(.*)\1(.*)$/)) { p = 0; endl(f("<h?>?</h?>?", $r[1].length, parse_inline_nowiki($r[2]), $r[1].length, $r[3])); } else if ($(/^[*#:;]/)) { p = 0; parse_list(); } else if ($(" ")) { p = 0; parse_pre(); } else if ($("{|")) { p = 0; parse_table(); } else if ($(/^----+$/)) { p = 0; endl("<hr />"); } else if ($(Insta.BLOCK_IMAGE)) { p = 0; parse_block_image(); } else { if ($$("")) { p = remain() > 1 && ll[1] === ""; if (p) endl("<p><br>"); } else { if (!p) { ps("<p>"); p = 1; } ps(parse_inline_nowiki(ll[0]) + " "); } sh(); } return o; }; function wiki2html(txt, baseurl) { Insta.conf.baseUrl = baseurl; return Insta.convert(txt); } function popupFilterPageSize(data) { return formatBytes(data.length); } function popupFilterCountLinks(data) { var num = countLinks(data); return String(num) + " " + (num != 1 ? popupString("wikiLinks") : popupString("wikiLink")); } function popupFilterCountImages(data) { var num = countImages(data); return String(num) + " " + (num != 1 ? popupString("images") : popupString("image")); } function popupFilterCountCategories(data) { var num = countCategories(data); return String(num) + " " + (num != 1 ? popupString("categories") : popupString("category")); } function popupFilterLastModified(data, download) { var lastmod = download.lastModified; //var now = new Date(); var age = moment(lastmod);// now - lastmod; if (lastmod && getValueOf("popupLastModified")) { return tprintf("%s old", [formatAge(age)]).replace(RegExp(" ", "g"), " "); } return ""; } function formatAge(age) { var now = moment(); var isBefore = age.isBefore(now); var monthsHave31Days = [0, 2, 4, 6, 7, 9, 11]; // 月份从0开始 var year = isBefore ? now.year() - age.year() : age.year() - now.year(), month = isBefore ? now.month() - age.month() : age.month() - now.month(), day = isBefore ? now.date() - age.date() : age.date() - now.date(), hour = isBefore ? now.hour() - age.hour() : age.hour() - now.hour(), minute = isBefore ? now.minute() - age.minute() : age.minute() - now.minute(), second = isBefore ? now.second() - age.second() : age.second() - now.second(); if (second < 0) { minute--; second += 60; } if (minute < 0) { hour--; minute += 60; } if (hour < 0) { day--; hour += 24; } if (day < 0) { month--; if (monthsHave31Days.includes((isBefore ? age : now).month())) { day += 31; } else if ((isBefore ? age : now).month() === 1) { if ((isBefore ? age : now).year() % 4 === 0) { day += 29; } else { day += 28; } } else { day += 30; } } if (month < 0) { year--; month += 12; } var result = ""; if (year > 0) { result += addunit(year, "year"); } if (month > 0) { result += addunit(month, "month"); } else if (result !== "") { result += addunit(0, "month"); } if (day > 0) { result += addunit(day, "day"); } else if (result !== "") { result += addunit(0, "day"); } if (hour > 0) { result += addunit(hour, "hour"); } else if (result !== "") { result += addunit(0, "hour"); } if (minute > 0) { result += addunit(minute, "minute"); } else if (result !== "") { result += addunit(0, "minute"); } if (second > 0) { result += addunit(second, "second"); } else if (result !== "") { result += addunit(0, "second"); } return result.replace(/(\d) /g, "$1"); } function addunit(num, str) { return "" + num + " " + (num != 1 ? popupString(str + "s") : popupString(str)); } function runPopupFilters(list, data, download) { var ret = []; for (var i = 0; i < list.length; ++i) { if (list[i] && typeof list[i] == "function") { var s = list[i](data, download, download.owner.article); if (s) { ret.push(s); } } } return ret; } function getPageInfo(data, download) { if (!data || data.length === 0) { return popupString("Empty page"); } var popupFilters = getValueOf("popupFilters") || []; var extraPopupFilters = getValueOf("extraPopupFilters") || []; var pageInfoArray = runPopupFilters(popupFilters.concat(extraPopupFilters), data, download); var pageInfo = pageInfoArray.join(popupString("comma")); if (pageInfo !== "") { pageInfo = upcaseFirst(pageInfo); } return pageInfo; } function countLinks(wikiText) { return wikiText.split("[[").length - 1; } function countImages(wikiText) { return (wikiText.parenSplit(pg.re.image).length - 1) / (pg.re.imageBracketCount + 1); } function countCategories(wikiText) { return (wikiText.parenSplit(pg.re.category).length - 1) / (pg.re.categoryBracketCount + 1); } function popupFilterStubDetect(data, download, article) { var counts = stubCount(data, article); if (counts.real) { return popupString("stub"); } if (counts.sect) { return popupString("section stub"); } return ""; } function popupFilterDisambigDetect(data, download, article) { if (!getValueOf("popupAllDabsStubs") && article.namespace()) { return ""; } return isDisambig(data, article) ? popupString("disambig") : ""; } function formatBytes(num) { return num > 949 ? Math.round(num / 100) / 10 + popupString("kB") : num + " " + popupString("bytes"); } function Stringwrapper() { this.indexOf = function(x) { return this.toString().indexOf(x); }; this.toString = function() { return this.value; }; this.parenSplit = function(x) { return this.toString().parenSplit(x); }; this.substring = function(x, y) { if (typeof y == "undefined") { return this.toString().substring(x); } return this.toString().substring(x, y); }; this.split = function(x) { return this.toString().split(x); }; this.replace = function(x, y) { return this.toString().replace(x, y); }; } function Title(val) { this.value = null; this.anchor = ""; this.setUtf(val); } Title.prototype = new Stringwrapper(); Title.prototype.toString = function(omitAnchor) { return this.value + (!omitAnchor && this.anchor ? "#" + this.anchorString() : ""); }; Title.prototype.anchorString = function() { if (!this.anchor) { return ""; } var split = this.anchor.parenSplit(/((?:[.][0-9A-F]{2})+)/); var len = split.length; for (var j = 1; j < len; j += 2) { split[j] = decodeURIComponent(split[j].split(".").join("%")).split("_").join(" "); } return split.join(""); }; Title.prototype.urlAnchor = function() { var split = this.anchor.parenSplit("/((?:[%][0-9A-F]{2})+)/"); var len = split.length; for (var j = 1; j < len; j += 2) { split[j] = split[j].split("%").join("."); } return split.join(""); }; Title.prototype.anchorFromUtf = function(str) { this.anchor = encodeURIComponent(str.split(" ").join("_")).split("%3A").join(":").split("'").join("%27").split("%").join("."); }; Title.fromURL = function(h) { return new Title().fromURL(h); }; Title.prototype.fromURL = function(h) { if (typeof h != "string") { this.value = null; return this; } var splitted = h.split("?"); splitted[0] = splitted[0].split("&").join("%26"); h = splitted.join("?"); var contribs = pg.re.contribs.exec(h); if (contribs) { if (contribs[1] == "title=") { contribs[3] = contribs[3].split("+").join(" "); } var u = new Title(contribs[3]); this.setUtf(this.decodeNasties(mw.config.get("wgFormattedNamespaces")[pg.nsUserId] + ":" + u.stripNamespace())); return this; } var email = pg.re.email.exec(h); if (email) { this.setUtf(this.decodeNasties(mw.config.get("wgFormattedNamespaces")[pg.nsUserId] + ":" + new Title(email[3]).stripNamespace())); return this; } var backlinks = pg.re.backlinks.exec(h); if (backlinks) { this.setUtf(this.decodeNasties(new Title(backlinks[3]))); return this; } var specialdiff = pg.re.specialdiff.exec(h); if (specialdiff) { this.setUtf(this.decodeNasties(new Title(mw.config.get("wgFormattedNamespaces")[pg.nsSpecialId] + ":Diff"))); return this; } var m = pg.re.main.exec(h); if (m === null) { this.value = null; } else { var fromBotInterface = /[?](.+[&])?title=/.test(h); if (fromBotInterface) { m[2] = m[2].split("+").join("_"); } var extracted = m[2] + (m[3] ? "#" + m[3] : ""); if (pg.flag.isSafari && /%25[0-9A-Fa-f]{2}/.test(extracted)) { this.setUtf(decodeURIComponent(unescape(extracted))); } else { this.setUtf(this.decodeNasties(extracted)); } } return this; }; Title.prototype.decodeNasties = function(txt) { var ret = this.decodeEscapes(decodeURI(txt)); ret = ret.replace(/[_ ]*$/, ""); return ret; }; Title.prototype.decodeEscapes = function(txt) { var split = txt.parenSplit(/((?:[%][0-9A-Fa-f]{2})+)/); var len = split.length; for (var i = 1; i < len; i = i + 2) { split[i] = unescape(split[i]); } return split.join(""); }; Title.fromAnchor = function(a) { return new Title().fromAnchor(a); }; Title.prototype.fromAnchor = function(a) { if (!a) { this.value = null; return this; } return this.fromURL(a.href); }; Title.fromWikiText = function(txt) { return new Title().fromWikiText(txt); }; Title.prototype.fromWikiText = function(txt) { txt = myDecodeURI(txt); this.setUtf(txt); return this; }; Title.prototype.hintValue = function() { if (!this.value) { return ""; } return safeDecodeURI(this.value); }; Title.prototype.toUserName = function(withNs) { if (this.namespaceId() != pg.nsUserId && this.namespaceId() != pg.nsUsertalkId) { this.value = null; return; } this.value = (withNs ? mw.config.get("wgFormattedNamespaces")[pg.nsUserId] + ":" : "") + this.stripNamespace().split("/")[0]; }; Title.prototype.userName = function(withNs) { var t = new Title(this.value); t.toUserName(withNs); if (t.value) { return t; } return null; }; Title.prototype.toTalkPage = function() { if (this.value === null) { return null; } var namespaceId = this.namespaceId(); if (namespaceId >= 0 && namespaceId % 2 === 0) { var localizedNamespace = mw.config.get("wgFormattedNamespaces")[namespaceId + 1]; if (typeof localizedNamespace !== "undefined") { if (localizedNamespace === "") { this.value = this.stripNamespace(); } else { this.value = localizedNamespace.split(" ").join("_") + ":" + this.stripNamespace(); } return this.value; } } this.value = null; return null; }; Title.prototype.namespace = function() { return mw.config.get("wgFormattedNamespaces")[this.namespaceId()]; }; Title.prototype.namespaceId = function() { var n = this.value.indexOf(":"); if (n < 0) { return 0; } var namespaceId = mw.config.get("wgNamespaceIds")[this.value.substring(0, n).split(" ").join("_").toLowerCase()]; if (typeof namespaceId == "undefined") return 0; return namespaceId; }; Title.prototype.talkPage = function() { var t = new Title(this.value); t.toTalkPage(); if (t.value) { return t; } return null; }; Title.prototype.isTalkPage = function() { if (this.talkPage() === null) { return true; } return false; }; Title.prototype.toArticleFromTalkPage = function() { if (this.value === null) { return null; } var namespaceId = this.namespaceId(); if (namespaceId >= 0 && namespaceId % 2 == 1) { var localizedNamespace = mw.config.get("wgFormattedNamespaces")[namespaceId - 1]; if (typeof localizedNamespace !== "undefined") { if (localizedNamespace === "") { this.value = this.stripNamespace(); } else { this.value = localizedNamespace.split(" ").join("_") + ":" + this.stripNamespace(); } return this.value; } } this.value = null; return null; }; Title.prototype.articleFromTalkPage = function() { var t = new Title(this.value); t.toArticleFromTalkPage(); if (t.value) { return t; } return null; }; Title.prototype.articleFromTalkOrArticle = function() { var t = new Title(this.value); if (t.toArticleFromTalkPage()) { return t; } return this; }; Title.prototype.isIpUser = function() { return pg.re.ipUser.test(this.userName()); }; Title.prototype.stripNamespace = function() { var n = this.value.indexOf(":"); if (n < 0) { return this.value; } var namespaceId = this.namespaceId(); if (namespaceId === pg.nsMainspaceId) return this.value; return this.value.substring(n + 1); }; Title.prototype.setUtf = function(value) { if (!value) { this.value = ""; return; } var anch = value.indexOf("#"); if (anch < 0) { this.value = value.split("_").join(" "); this.anchor = ""; return; } this.value = value.substring(0, anch).split("_").join(" "); this.anchor = value.substring(anch + 1); this.ns = null; }; Title.prototype.setUrl = function(urlfrag) { var anch = urlfrag.indexOf("#"); this.value = safeDecodeURI(urlfrag.substring(0, anch)); this.anchor = this.value.substring(anch + 1); }; Title.prototype.append = function(x) { this.setUtf(this.value + x); }; Title.prototype.urlString = function(x) { if (!x) { x = {}; } var v = this.toString(true); if (!x.omitAnchor && this.anchor) { v += "#" + this.urlAnchor(); } if (!x.keepSpaces) { v = v.split(" ").join("_"); } return encodeURI(v).split("&").join("%26").split("?").join("%3F").split("+").join("%2B"); }; Title.prototype.removeAnchor = function() { return new Title(this.toString(true)); }; Title.prototype.toUrl = function() { return pg.wiki.titlebase + this.urlString(); }; function parseParams(url) { var specialDiff = pg.re.specialdiff.exec(url); if (specialDiff) { var split = specialDiff[1].split("/"); if (split.length == 1) return { oldid: split[0], diff: "prev" }; else if (split.length == 2) return { oldid: split[0], diff: split[1] }; } var ret = {}; if (url.indexOf("?") == -1) { return ret; } url = url.split("#")[0]; var s = url.split("?").slice(1).join(); var t = s.split("&"); for (var i = 0; i < t.length; ++i) { var z = t[i].split("="); z.push(null); ret[z[0]] = z[1]; } if (ret.diff && typeof ret.oldid === "undefined") { ret.oldid = "prev"; } if (ret.oldid && (ret.oldid === "prev" || ret.oldid === "next" || ret.oldid === "cur")) { var helper = ret.diff; ret.diff = ret.oldid; ret.oldid = helper; } return ret; } function myDecodeURI(str) { var ret; try { ret = decodeURI(str.toString()); } catch (summat) { return str; } for (var i = 0; i < pg.misc.decodeExtras.length; ++i) { var from = pg.misc.decodeExtras[i].from; var to = pg.misc.decodeExtras[i].to; ret = ret.split(from).join(to); } return ret; } function safeDecodeURI(str) { var ret = myDecodeURI(str); return ret || str; } function isDisambig(data, article) { if (!getValueOf("popupAllDabsStubs") && article.namespace()) { return false; } return !article.isTalkPage() && pg.re.disambig.test(data); } function stubCount(data, article) { if (!getValueOf("popupAllDabsStubs") && article.namespace()) { return false; } var sectStub = 0; var realStub = 0; if (pg.re.stub.test(data)) { var s = data.parenSplit(pg.re.stub); for (var i = 1; i < s.length; i = i + 2) { if (s[i]) { ++sectStub; } else { ++realStub; } } } return { real: realStub, sect: sectStub }; } function isValidImageName(str) { return str.indexOf("{") == -1; } function isInStrippableNamespace(article) { return article.namespaceId() !== 0; } function isInMainNamespace(article) { return article.namespaceId() === 0; } function anchorContainsImage(a) { if (a === null) { return false; } var kids = a.childNodes; for (var i = 0; i < kids.length; ++i) { if (kids[i].nodeName == "IMG") { return true; } } return false; } function isPopupLink(a) { if (!markNopopupSpanLinks.done) { markNopopupSpanLinks(); } if (a.inNopopupSpan) { return false; } if (a.onmousedown || a.getAttribute("nopopup")) { return false; } var h = a.href; if (h === document.location.href + "#") { return false; } if (!pg.re.basenames.test(h)) { return false; } if (!pg.re.urlNoPopup.test(h)) { return true; } return (pg.re.email.test(h) || pg.re.contribs.test(h) || pg.re.backlinks.test(h) || pg.re.specialdiff.test(h)) && h.indexOf("&limit=") == -1; } function markNopopupSpanLinks() { if (!getValueOf("popupOnlyArticleLinks")) fixVectorMenuPopups(); var s = $(".nopopups").toArray(); for (var i = 0; i < s.length; ++i) { var as = s[i].getElementsByTagName("a"); for (var j = 0; j < as.length; ++j) { as[j].inNopopupSpan = true; } } markNopopupSpanLinks.done = true; } function fixVectorMenuPopups() { $("div.vectorMenu h3:first a:first").prop("inNopopupSpan", true); } function getPageWithCaching(url, onComplete, owner) { log("getPageWithCaching, url=" + url); var i = findInPageCache(url); var d; if (i > -1) { d = fakeDownload(url, owner.idNumber, onComplete, pg.cache.pages[i].data, pg.cache.pages[i].lastModified, owner); } else { d = getPage(url, onComplete, owner); if (d && owner && owner.addDownload) { owner.addDownload(d); d.owner = owner; } } } function getPage(url, onComplete, owner) { log("getPage"); var callback = function(d) { if (!d.aborted) { addPageToCache(d); onComplete(d); } }; return startDownload(url, owner.idNumber, callback); } function findInPageCache(url) { for (var i = 0; i < pg.cache.pages.length; ++i) { if (url == pg.cache.pages[i].url) { return i; } } return -1; } function addPageToCache(download) { log("addPageToCache " + download.url); var page = { url: download.url, data: download.data, lastModified: download.lastModified }; return pg.cache.pages.push(page); } if (String("abc".split(/(b)/)) != "a,b,c") { String.prototype.parenSplit = function(re) { re = nonGlobalRegex(re); var s = this; var m = re.exec(s); var ret = []; while (m && s) { for (var i = 0; i < m.length; ++i) { if (typeof m[i] == "undefined") m[i] = ""; } ret.push(s.substring(0, m.index)); ret = ret.concat(m.slice(1)); s = s.substring(m.index + m[0].length); m = re.exec(s); } ret.push(s); return ret; }; } else { String.prototype.parenSplit = function(re) { return this.split(re); }; String.prototype.parenSplit.isNative = true; } function nonGlobalRegex(re) { var s = re.toString(); var flags = ""; for (var j = s.length; s.charAt(j) != "/"; --j) { if (s.charAt(j) != "g") { flags += s.charAt(j); } } var t = s.substring(1, j); return RegExp(t, flags); } function getJsObj(json) { try { var json_ret = JSON.parse(json); if (json_ret.warnings) { for (var w = 0; w < json_ret.warnings.length; w++) { if (json_ret.warnings[w]["*"]) { log(json_ret.warnings[w]["*"]); } else { log(json_ret.warnings[w]["warnings"]); } } } else if (json_ret.error) { errlog(json_ret.error.code + ": " + json_ret.error.info); } return json_ret; } catch (someError) { errlog("Something went wrong with getJsObj, json=" + json); return 1; } } function anyChild(obj) { for (var p in obj) { return obj[p]; } return null; } function upcaseFirst(str) { if (typeof str != typeof "" || str === "") return ""; return str.charAt(0).toUpperCase() + str.substring(1); } function findInArray(arr, foo) { if (!arr || !arr.length) { return -1; } var len = arr.length; for (var i = 0; i < len; ++i) { if (arr[i] == foo) { return i; } } return -1; } function nextOne(array, value) { var i = findInArray(array, value); if (i < 0) { return null; } return array[i + 1]; } function literalizeRegex(str) { return mw.util.escapeRegExp(str); } String.prototype.entify = function() { return this.split("&").join("&").split("<").join("<").split(">").join(">").split('"').join("""); }; function removeNulls(val) { return val !== null; } function joinPath(list) { return list.filter(removeNulls).join("/"); } function simplePrintf(str, subs) { if (!str || !subs) { return str; } var ret = []; var s = str.parenSplit(/(%s|\$[0-9]+)/); var i = 0; do { ret.push(s.shift()); if (!s.length) { break; } var cmd = s.shift(); if (cmd == "%s") { if (i < subs.length) { ret.push(subs[i]); } else { ret.push(cmd); } ++i; } else { var j = parseInt(cmd.replace("$", ""), 10) - 1; if (j > -1 && j < subs.length) { ret.push(subs[j]); } else { ret.push(cmd); } } } while (s.length > 0); return ret.join(""); } function isString(x) { return typeof x === "string" || x instanceof String; } function isNumber(x) { return typeof x === "number" || x instanceof Number; } function isRegExp(x) { return x instanceof RegExp; } function isArray(x) { return x instanceof Array; } function isObject(x) { return x instanceof Object; } function isFunction(x) { return !isRegExp(x) && ($.isFunction(x) || x instanceof Function); } function repeatString(s, mult) { var ret = ""; for (var i = 0; i < mult; ++i) { ret += s; } return ret; } function zeroFill(s, min) { min = min || 2; var t = s.toString(); return repeatString("0", min - t.length) + t; } function map(f, o) { if (isArray(o)) { return map_array(f, o); } return map_object(f, o); } function map_array(f, o) { var ret = []; for (var i = 0; i < o.length; ++i) { ret.push(f(o[i])); } return ret; } function map_object(f, o) { var ret = {}; for (var i in o) { ret[o] = f(o[i]); } return ret; } pg.escapeQuotesHTML = function(text) { return text.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">"); }; function retargetDab(newTarget, oldTarget, friendlyCurrentArticleName, titleToEdit) { log("retargetDab: newTarget=" + newTarget + " oldTarget=" + oldTarget); return changeLinkTargetLink({ newTarget: newTarget, text: newTarget.split(" ").join(" "), hint: tprintf("disambigHint", [newTarget]), summary: simplePrintf(getValueOf("popupFixDabsSummary"), [friendlyCurrentArticleName, newTarget]), clickButton: getValueOf("popupDabsAutoClick"), minor: true, oldTarget: oldTarget, watch: getValueOf("popupWatchDisambiggedPages"), title: titleToEdit }); } function listLinks(wikitext, oldTarget, titleToEdit) { var reg = RegExp("\\[\\[([^|]*?) *(\\||\\]\\])", "gi"); var ret = []; var splitted = wikitext.parenSplit(reg); var omitRegex = RegExp("^[a-z]*:|^[Ss]pecial:|^[Ii]mage|^[Cc]ategory"); var friendlyCurrentArticleName = oldTarget.toString(); var wikPos = getValueOf("popupDabWiktionary"); for (var i = 1; i < splitted.length; i = i + 3) { if (typeof splitted[i] == typeof "string" && splitted[i].length > 0 && !omitRegex.test(splitted[i])) { ret.push(retargetDab(splitted[i], oldTarget, friendlyCurrentArticleName, titleToEdit)); } } ret = rmDupesFromSortedList(ret.sort()); if (wikPos) { var wikTarget = "wiktionary:" + friendlyCurrentArticleName.replace(RegExp("^(.+)\\s+[(][^)]+[)]\\s*$"), "$1"); var meth; if (wikPos.toLowerCase() == "first") { meth = "unshift"; } else { meth = "push"; } ret[meth](retargetDab(wikTarget, oldTarget, friendlyCurrentArticleName, titleToEdit)); } ret.push(changeLinkTargetLink({ newTarget: null, text: popupString("remove this link").split(" ").join(" "), hint: popupString("remove all links to this disambig page from this article"), clickButton: getValueOf("popupDabsAutoClick"), oldTarget: oldTarget, summary: simplePrintf(getValueOf("popupRmDabLinkSummary"), [friendlyCurrentArticleName]), watch: getValueOf("popupWatchDisambiggedPages"), title: titleToEdit })); return ret; } function rmDupesFromSortedList(list) { var ret = []; for (var i = 0; i < list.length; ++i) { if (ret.length === 0 || list[i] != ret[ret.length - 1]) { ret.push(list[i]); } } return ret; } function makeFixDab(data, navpop) { var titleToEdit = navpop.parentPopup && navpop.parentPopup.article.toString(); var list = listLinks(data, navpop.originalArticle, titleToEdit); if (list.length === 0) { log("listLinks returned empty list"); return null; } var html = "<hr />" + popupString("Click to disambiguate this link to:") + "<br>"; html += list.join(popupString("separator")); return html; } function makeFixDabs(wikiText, navpop) { if (getValueOf("popupFixDabs") && isDisambig(wikiText, navpop.article) && Title.fromURL(location.href).namespaceId() != pg.nsSpecialId && navpop.article.talkPage()) { setPopupHTML(makeFixDab(wikiText, navpop), "popupFixDab", navpop.idNumber); } } function popupRedlinkHTML(article) { return changeLinkTargetLink({ newTarget: null, text: popupString("remove this link").split(" ").join(" "), hint: popupString("remove all links to this page from this article"), clickButton: getValueOf("popupRedlinkAutoClick"), oldTarget: article.toString(), summary: simplePrintf(getValueOf("popupRedlinkSummary"), [article.toString()]) }); } function setPopupHTML(str, elementId, popupId, onSuccess, append) { if (typeof popupId === "undefined") { popupId = pg.idNumber; } var popupElement = document.getElementById(elementId + popupId); if (popupElement) { if (!append) { popupElement.innerHTML = ""; } if (isString(str)) { popupElement.innerHTML += str; } else { popupElement.appendChild(str); } if (onSuccess) { onSuccess(); } setTimeout(checkPopupPosition, 100); return true; } else { setTimeout(function() { setPopupHTML(str, elementId, popupId, onSuccess); }, 600); } return null; } function setPopupTrailer(str, id) { return setPopupHTML(str, "popupData", id); } function fillEmptySpans(args) { var redir = true; var rcid; if (typeof args != "object" || typeof args.redir == "undefined" || !args.redir) { redir = false; } var a = args.navpopup.parentAnchor; var article, hint = null, oldid = null, params = {}; if (redir && typeof args.redirTarget == typeof {}) { article = args.redirTarget; } else { article = new Title().fromAnchor(a); hint = a.originalTitle || article.hintValue(); params = parseParams(a.href); oldid = getValueOf("popupHistoricalLinks") ? params.oldid : null; rcid = params.rcid; } var x = { article: article, hint: hint, oldid: oldid, rcid: rcid, navpop: args.navpopup, params: params }; var structure = pg.structures[getValueOf("popupStructure")]; if (typeof structure != "object") { setPopupHTML("popupError", "Unknown structure (this should never happen): " + pg.option.popupStructure, args.navpopup.idNumber); return; } var spans = flatten(pg.misc.layout); var numspans = spans.length; var redirs = pg.misc.redirSpans; for (var i = 0; i < numspans; ++i) { var found = redirs && redirs.indexOf(spans[i]) !== -1; if (found && !redir || !found && redir) { continue; } var structurefn = structure[spans[i]]; var setfn = setPopupHTML; if (getValueOf("popupActiveNavlinks") && (spans[i].indexOf("popupTopLinks") === 0 || spans[i].indexOf("popupRedirTopLinks") === 0)) { setfn = setPopupTipsAndHTML; } switch (typeof structurefn) { case "function": log("running " + spans[i] + "({article:" + x.article + ", hint:" + x.hint + ", oldid: " + x.oldid + "})"); setfn(structurefn(x), spans[i], args.navpopup.idNumber); break; case "string": setfn(structurefn, spans[i], args.navpopup.idNumber); break; default: errlog("unknown thing with label " + spans[i] + " (span index was " + i + ")"); break; } } } function flatten(list, start) { var ret = []; if (typeof start == "undefined") { start = 0; } for (var i = start; i < list.length; ++i) { if (typeof list[i] == typeof []) { return ret.concat(flatten(list[i])).concat(flatten(list, i + 1)); } else { ret.push(list[i]); } } return ret; } function popupHTML(a) { getValueOf("popupStructure"); var structure = pg.structures[pg.option.popupStructure]; if (typeof structure != "object") { pg.option.popupStructure = pg.optionDefault.popupStructure; return popupHTML(a); } if (typeof structure.popupLayout != "function") { return "Bad layout"; } pg.misc.layout = structure.popupLayout(); if ($.isFunction(structure.popupRedirSpans)) { pg.misc.redirSpans = structure.popupRedirSpans(); } else { pg.misc.redirSpans = []; } return makeEmptySpans(pg.misc.layout, a.navpopup); } function makeEmptySpans(list, navpop) { var ret = ""; for (var i = 0; i < list.length; ++i) { if (typeof list[i] == typeof "") { ret += emptySpanHTML(list[i], navpop.idNumber, "div"); } else if (typeof list[i] == typeof [] && list[i].length > 0) { ret = ret.parenSplit(RegExp("(</[^>]*?>$)")).join(makeEmptySpans(list[i], navpop)); } else if (typeof list[i] == typeof {} && list[i].nodeType) { ret += emptySpanHTML(list[i].name, navpop.idNumber, list[i].nodeType); } } return ret; } function emptySpanHTML(name, id, tag, classname) { tag = tag || "span"; if (!classname) { classname = emptySpanHTML.classAliases[name]; } classname = classname || name; if (name == getValueOf("popupDragHandle")) { classname += " popupDragHandle"; } return simplePrintf('<%s id="%s" class="%s"></%s>', [tag, name + id, classname, tag]); } emptySpanHTML.classAliases = { popupSecondPreview: "popupPreview" }; function imageHTML(article, idNumber) { return simplePrintf('<a id="popupImageLink$1">' + '<img align="right" valign="top" id="popupImg$1" style="display: none;"></img>' + "</a>", [idNumber]); } function popTipsSoonFn(id, when, popData) { if (!when) { when = 250; } var popTips = function() { setupTooltips(document.getElementById(id), false, true, popData); }; return function() { setTimeout(popTips, when, popData); }; } function setPopupTipsAndHTML(html, divname, idnumber, popData) { setPopupHTML(html, divname, idnumber, getValueOf("popupSubpopups") ? popTipsSoonFn(divname + idnumber, null, popData) : null); } function fuzzyCursorOffMenus(x, y, fuzz, parent) { if (!parent) { return null; } var uls = parent.getElementsByTagName("ul"); for (var i = 0; i < uls.length; ++i) { if (uls[i].className == "popup_menu") { if (uls[i].offsetWidth > 0) return false; } } return true; } function checkPopupPosition() { if (pg.current.link && pg.current.link.navpopup) pg.current.link.navpopup.limitHorizontalPosition(); } function mouseOutWikiLink() { var a = this; removeModifierKeyHandler(a); if (a.navpopup === null || typeof a.navpopup === "undefined") return; if (!a.navpopup.isVisible()) { a.navpopup.banish(); return; } restoreTitle(a); Navpopup.tracker.addHook(posCheckerHook(a.navpopup)); } function posCheckerHook(navpop) { return function() { if (!navpop.isVisible()) { return true; } if (Navpopup.tracker.dirty) { return false; } var x = Navpopup.tracker.x, y = Navpopup.tracker.y; var mouseOverNavpop = navpop.isWithin(x, y, navpop.fuzz, navpop.mainDiv) || !fuzzyCursorOffMenus(x, y, navpop.fuzz, navpop.mainDiv); var t = getValueOf("popupHideDelay"); if (t) { t = t * 1e3; } if (!t) { if (!mouseOverNavpop) { if (navpop.parentAnchor) { restoreTitle(navpop.parentAnchor); } navpop.banish(); return true; } return false; } var d = +new Date(); if (!navpop.mouseLeavingTime) { navpop.mouseLeavingTime = d; return false; } if (mouseOverNavpop) { navpop.mouseLeavingTime = null; return false; } if (d - navpop.mouseLeavingTime > t) { navpop.mouseLeavingTime = null; navpop.banish(); return true; } return false; }; } function runStopPopupTimer(navpop) { if (!navpop.stopPopupTimer) { navpop.stopPopupTimer = setInterval(posCheckerHook(navpop), 500); navpop.addHook(function() { clearInterval(navpop.stopPopupTimer); }, "hide", "before"); } } function Previewmaker(wikiText, baseUrl, owner) { this.originalData = wikiText; this.baseUrl = baseUrl; this.owner = owner; this.maxCharacters = getValueOf("popupMaxPreviewCharacters"); this.maxSentences = getValueOf("popupMaxPreviewSentences"); this.setData(); } Previewmaker.prototype.setData = function() { var maxSize = Math.max(1e4, 2 * this.maxCharacters); this.data = this.originalData.substring(0, maxSize); }; Previewmaker.prototype.killComments = function() { this.data = this.data.replace(RegExp("^<!--[^$]*?-->\\n|\\n<!--[^$]*?-->(?=\\n)|<!--[^$]*?-->", "g"), ""); }; Previewmaker.prototype.killDivs = function() { this.data = this.data.replace(RegExp("< *div[^>]* *>[\\s\\S]*?< */ *div *>", "gi"), ""); }; Previewmaker.prototype.killGalleries = function() { this.data = this.data.replace(RegExp("< *gallery[^>]* *>[\\s\\S]*?< */ *gallery *>", "gi"), ""); }; Previewmaker.prototype.kill = function(opening, closing, subopening, subclosing, repl) { var oldk = this.data; var k = this.killStuff(this.data, opening, closing, subopening, subclosing, repl); while (k.length < oldk.length) { oldk = k; k = this.killStuff(k, opening, closing, subopening, subclosing, repl); } this.data = k; }; Previewmaker.prototype.killStuff = function(txt, opening, closing, subopening, subclosing, repl) { var op = this.makeRegexp(opening); var cl = this.makeRegexp(closing, "^"); var sb = subopening ? this.makeRegexp(subopening, "^") : null; var sc = subclosing ? this.makeRegexp(subclosing, "^") : cl; if (!op || !cl) { alert("Navigation Popups error: op or cl is null! something is wrong."); return; } if (!op.test(txt)) { return txt; } var ret = ""; var opResult = op.exec(txt); ret = txt.substring(0, opResult.index); txt = txt.substring(opResult.index + opResult[0].length); var depth = 1; while (txt.length > 0) { var removal = 0; if (depth == 1 && cl.test(txt)) { depth--; removal = cl.exec(txt)[0].length; } else if (depth > 1 && sc.test(txt)) { depth--; removal = sc.exec(txt)[0].length; } else if (sb && sb.test(txt)) { depth++; removal = sb.exec(txt)[0].length; } if (!removal) { removal = 1; } txt = txt.substring(removal); if (depth === 0) { break; } } return ret + (repl || "") + txt; }; Previewmaker.prototype.makeRegexp = function(x, prefix, suffix) { prefix = prefix || ""; suffix = suffix || ""; var reStr = ""; var flags = ""; if (isString(x)) { reStr = prefix + literalizeRegex(x) + suffix; } else if (isRegExp(x)) { var s = x.toString().substring(1); var sp = s.split("/"); flags = sp[sp.length - 1]; sp[sp.length - 1] = ""; s = sp.join("/"); s = s.substring(0, s.length - 1); reStr = prefix + s + suffix; } else { log("makeRegexp failed"); } log("makeRegexp: got reStr=" + reStr + ", flags=" + flags); return RegExp(reStr, flags); }; Previewmaker.prototype.killBoxTemplates = function() { this.kill(RegExp("[{][{][^{}\\s|]*?(float|box)[_ ](begin|start)", "i"), /[}][}]\s*/, "{{"); this.kill(RegExp("[{][{][^{}\\s|]*?(infobox|elementbox|frame)[_ ]", "i"), /[}][}]\s*/, "{{"); }; Previewmaker.prototype.killTemplates = function() { this.kill("{{", "}}", "{", "}", " "); }; Previewmaker.prototype.killTables = function() { this.kill("{|", /[|]}\s*/, "{|"); this.kill(/<table.*?>/i, /<\/table.*?>/i, /<table.*?>/i); this.data = this.data.replace(RegExp("^[|].*$", "mg"), ""); }; Previewmaker.prototype.killImages = function() { var forbiddenNamespaceAliases = []; jQuery.each(mw.config.get("wgNamespaceIds"), function(_localizedNamespaceLc, _namespaceId) { if (_namespaceId != pg.nsImageId && _namespaceId != pg.nsCategoryId) return; forbiddenNamespaceAliases.push(_localizedNamespaceLc.split(" ").join("[ _]")); }); this.kill(RegExp("[[][[]\\s*(" + forbiddenNamespaceAliases.join("|") + ")\\s*:", "i"), /\]\]\s*/, "[", "]"); }; Previewmaker.prototype.killHTML = function() { this.kill(/<ref\b[^\/>]*?>/i, /<\/ref>/i); this.data = this.data.replace(RegExp("(^|\\n) *<.*", "g"), "\n"); var splitted = this.data.parenSplit(/(<[\w\W]*?(?:>|$|(?=<)))/); var len = splitted.length; for (var i = 1; i < len; i = i + 2) { switch (splitted[i]) { case "<nowiki>": case "</nowiki>": case "<blockquote>": case "</blockquote>": break; default: splitted[i] = ""; } } this.data = splitted.join(""); }; Previewmaker.prototype.killChunks = function() { var italicChunkRegex = new RegExp("((^|\\n)\\s*:*\\s*''[^']([^']|'''|'[^']){20}(.|\\n[^\\n])*''[.!?\\s]*\\n)+", "g"); this.data = this.data.replace(italicChunkRegex, "\n"); }; Previewmaker.prototype.mopup = function() { this.data = this.data.replace(RegExp("^-{4,}", "mg"), ""); this.data = this.data.replace(RegExp("(^|\\n) *:[^\\n]*", "g"), ""); this.data = this.data.replace(RegExp("^__[A-Z_]*__ *$", "gmi"), ""); }; Previewmaker.prototype.firstBit = function() { var d = this.data; if (getValueOf("popupPreviewCutHeadings")) { this.data = this.data.replace(RegExp("\\s*(==+[^=]*==+)\\s*", "g"), "\n\n$1 "); this.data = this.data.replace(RegExp("([:;]) *\\n{2,}", "g"), "$1\n"); this.data = this.data.replace(RegExp("^[\\s\\n]*"), ""); var stuff = RegExp("^([^\\n]|\\n[^\\n\\s])*").exec(this.data); if (stuff) { d = stuff[0]; } if (!getValueOf("popupPreviewFirstParOnly")) { d = this.data; } d = d.replace(RegExp("(==+[^=]*==+)\\s*", "g"), "$1\n\n"); } d = d.parenSplit(RegExp('([!?.]+["' + "'" + "]*\\s)", "g")); d[0] = d[0].replace(RegExp("^\\s*"), ""); var notSentenceEnds = RegExp("([^.][a-z][.] *[a-z]|etc|sic|Dr|Mr|Mrs|Ms|St|no|op|cit|\\[[^\\]]*|\\s[A-Zvclm])$", "i"); d = this.fixSentenceEnds(d, notSentenceEnds); this.fullLength = d.join("").length; var n = this.maxSentences; var dd = this.firstSentences(d, n); do { dd = this.firstSentences(d, n); --n; } while (dd.length > this.maxCharacters && n !== 0); this.data = dd; }; Previewmaker.prototype.fixSentenceEnds = function(strs, reg) { for (var i = 0; i < strs.length - 2; ++i) { if (reg.test(strs[i])) { var a = []; for (var j = 0; j < strs.length; ++j) { if (j < i) a[j] = strs[j]; if (j == i) a[i] = strs[i] + strs[i + 1] + strs[i + 2]; if (j > i + 2) a[j - 2] = strs[j]; } return this.fixSentenceEnds(a, reg); } } return strs; }; Previewmaker.prototype.firstSentences = function(strs, howmany) { var t = strs.slice(0, 2 * howmany); return t.join(""); }; Previewmaker.prototype.killBadWhitespace = function() { this.data = this.data.replace(RegExp("^ *'+ *$", "gm"), ""); }; Previewmaker.prototype.makePreview = function() { if (this.owner.article.namespaceId() != pg.nsTemplateId && this.owner.article.namespaceId() != pg.nsImageId) { this.killComments(); this.killDivs(); this.killGalleries(); this.killBoxTemplates(); if (getValueOf("popupPreviewKillTemplates")) { this.killTemplates(); } else { this.killMultilineTemplates(); } this.killTables(); this.killImages(); this.killHTML(); this.killChunks(); this.mopup(); this.firstBit(); this.killBadWhitespace(); } else { this.killHTML(); } this.html = wiki2html(this.data, this.baseUrl); this.fixHTML(); this.stripLongTemplates(); }; Previewmaker.prototype.esWiki2HtmlPart = function(data) { var reLinks = /(?:\[\[([^|\]]*)(?:\|([^|\]]*))*]]([a-z]*))/gi; reLinks.lastIndex = 0; var match; var result = ""; var postfixIndex = 0; while (match = reLinks.exec(data)) { result += pg.escapeQuotesHTML(data.substring(postfixIndex, match.index)) + '<a href="' + Insta.conf.paths.articles + pg.escapeQuotesHTML(match[1]) + '">' + pg.escapeQuotesHTML((match[2] ? match[2] : match[1]) + match[3]) + "</a>"; postfixIndex = reLinks.lastIndex; } result += pg.escapeQuotesHTML(data.substring(postfixIndex)); return result; }; Previewmaker.prototype.editSummaryPreview = function() { var reAes = /\/\* *(.*?) *\*\//g; reAes.lastIndex = 0; var match; match = reAes.exec(this.data); if (match) { var prefix = this.data.substring(0, match.index - 1); var section = match[1]; var postfix = this.data.substring(reAes.lastIndex); var start = "<span class='autocomment'>"; var end = "</span>"; if (prefix.length > 0) start = this.esWiki2HtmlPart(prefix) + " " + start + "- "; if (postfix.length > 0) end = ": " + end + this.esWiki2HtmlPart(postfix); var t = new Title().fromURL(this.baseUrl); t.anchorFromUtf(section); var sectionLink = Insta.conf.paths.articles + pg.escapeQuotesHTML(t.toString(true)) + "#" + pg.escapeQuotesHTML(t.anchor); return start + '<a href="' + sectionLink + '">→</a> ' + pg.escapeQuotesHTML(section) + end; } return this.esWiki2HtmlPart(this.data); }; function previewSteps(txt) { try { txt = txt || document.editform.wpTextbox1.value; } catch (err) { if (pg.cache.pages.length > 0) { txt = pg.cache.pages[pg.cache.pages.length - 1].data; } else { alert("provide text or use an edit page"); } } txt = txt.substring(0, 1e4); var base = pg.wiki.articlebase + Title.fromURL(document.location.href).urlString(); var p = new Previewmaker(txt, base, pg.current.link.navpopup); if (this.owner.article.namespaceId() != pg.nsTemplateId) { p.killComments(); if (!confirm("done killComments(). Continue?\n---\n" + p.data)) { return; } p.killDivs(); if (!confirm("done killDivs(). Continue?\n---\n" + p.data)) { return; } p.killGalleries(); if (!confirm("done killGalleries(). Continue?\n---\n" + p.data)) { return; } p.killBoxTemplates(); if (!confirm("done killBoxTemplates(). Continue?\n---\n" + p.data)) { return; } if (getValueOf("popupPreviewKillTemplates")) { p.killTemplates(); if (!confirm("done killTemplates(). Continue?\n---\n" + p.data)) { return; } } else { p.killMultilineTemplates(); if (!confirm("done killMultilineTemplates(). Continue?\n---\n" + p.data)) { return; } } p.killTables(); if (!confirm("done killTables(). Continue?\n---\n" + p.data)) { return; } p.killImages(); if (!confirm("done killImages(). Continue?\n---\n" + p.data)) { return; } p.killHTML(); if (!confirm("done killHTML(). Continue?\n---\n" + p.data)) { return; } p.killChunks(); if (!confirm("done killChunks(). Continue?\n---\n" + p.data)) { return; } p.mopup(); if (!confirm("done mopup(). Continue?\n---\n" + p.data)) { return; } p.firstBit(); if (!confirm("done firstBit(). Continue?\n---\n" + p.data)) { return; } p.killBadWhitespace(); if (!confirm("done killBadWhitespace(). Continue?\n---\n" + p.data)) { return; } } p.html = wiki2html(p.data, base); p.fixHTML(); if (!confirm("done fixHTML(). Continue?\n---\n" + p.html)) { return; } p.stripLongTemplates(); if (!confirm("done stripLongTemplates(). Continue?\n---\n" + p.html)) { return; } alert("finished preview - end result follows.\n---\n" + p.html); } Previewmaker.prototype.fixHTML = function() { if (!this.html) return; var ret = this.html; ret = ret.replace(RegExp('(<a href="' + pg.wiki.articlePath + '/[^"]*)[?](.*?")', "g"), "$1%3F$2"); ret = ret.replace(RegExp("(<a href='" + pg.wiki.articlePath + "/[^']*)[?](.*?')", "g"), "$1%3F$2"); this.html = ret; }; Previewmaker.prototype.showPreview = function() { this.makePreview(); if (typeof this.html != typeof "") return; if (RegExp("^\\s*$").test(this.html)) return; setPopupHTML("<hr />", "popupPrePreviewSep", this.owner.idNumber); setPopupTipsAndHTML(this.html, "popupPreview", this.owner.idNumber, { owner: this.owner }); var more = this.fullLength > this.data.length ? this.moreLink() : ""; setPopupHTML(more, "popupPreviewMore", this.owner.idNumber); }; Previewmaker.prototype.moreLink = function() { var a = document.createElement("a"); a.className = "popupMoreLink"; a.innerHTML = popupString("more..."); var savedThis = this; a.onclick = function() { savedThis.maxCharacters += 2e3; savedThis.maxSentences += 20; savedThis.setData(); savedThis.showPreview(); }; return a; }; Previewmaker.prototype.stripLongTemplates = function() { this.html = this.html.replace(RegExp("^.{0,1000}[{][{][^}]*?(<(p|br)( /)?>\\s*){2,}([^{}]*?[}][}])?", "gi"), ""); this.html = this.html.split("\n").join(" "); this.html = this.html.replace(RegExp("[{][{][^}]*<pre>[^}]*[}][}]", "gi"), ""); }; Previewmaker.prototype.killMultilineTemplates = function() { this.kill("{{{", "}}}"); this.kill(RegExp("\\s*[{][{][^{}]*\\n"), "}}", "{{"); }; function loadAPIPreview(queryType, article, navpop) { var art = new Title(article).urlString(); var url = pg.wiki.apiwikibase + "?format=json&formatversion=2&action=query&"; var htmlGenerator = function() { alert("invalid html generator"); }; var usernameart = ""; switch (queryType) { case "history": url += "titles=" + art + "&prop=revisions&rvlimit=" + getValueOf("popupHistoryPreviewLimit"); htmlGenerator = APIhistoryPreviewHTML; break; case "category": url += "list=categorymembers&cmtitle=" + art; htmlGenerator = APIcategoryPreviewHTML; break; case "userinfo": var username = new Title(article).userName(); usernameart = encodeURIComponent(username); if (pg.re.ipUser.test(username)) { url += "list=blocks&bkprop=range&bkip=" + usernameart; } else { url += "list=users|usercontribs&usprop=blockinfo|groups|editcount|registration|gender&ususers=" + usernameart + "&meta=globaluserinfo&guiprop=groups|unattached&guiuser=" + usernameart + "&uclimit=1&ucprop=timestamp&ucuser=" + usernameart; } htmlGenerator = APIuserInfoPreviewHTML; break; case "contribs": usernameart = encodeURIComponent(new Title(article).userName()); url += "list=usercontribs&ucuser=" + usernameart + "&uclimit=" + getValueOf("popupContribsPreviewLimit"); htmlGenerator = APIcontribsPreviewHTML; break; case "imagepagepreview": var trail = ""; if (getValueOf("popupImageLinks")) { trail = "&list=imageusage&iutitle=" + art; } url += "titles=" + art + "&prop=revisions|imageinfo&rvprop=content" + trail; htmlGenerator = APIimagepagePreviewHTML; break; case "backlinks": url += "list=backlinks&bltitle=" + art; htmlGenerator = APIbacklinksPreviewHTML; break; case "revision": if (article.oldid) { url += "revids=" + article.oldid; } else { url += "titles=" + article.removeAnchor().urlString(); } url += "&prop=revisions|pageprops|info|images|categories&rvprop=ids|timestamp|flags|comment|user|content&cllimit=max&imlimit=max"; htmlGenerator = APIrevisionPreviewHTML; break; } pendingNavpopTask(navpop); var callback = function(d) { log("callback of API functions was hit"); showAPIPreview(queryType, htmlGenerator(article, d, navpop), navpop.idNumber, navpop, d); }; var go = function() { getPageWithCaching(url, callback, navpop); return true; }; if (navpop.visible || !getValueOf("popupLazyDownloads")) { go(); } else { navpop.addHook(go, "unhide", "before", "DOWNLOAD_" + queryType + "_QUERY_DATA"); } } function linkList(list) { list.sort(function(x, y) { return x == y ? 0 : x < y ? -1 : 1; }); var buf = []; for (var i = 0; i < list.length; ++i) { buf.push(wikiLink({ article: new Title(list[i]), text: list[i].split(" ").join(" "), action: "view" })); } return buf.join(popupString("separator")); } function getTimeOffset() { var tz = mw.user.options.get("timecorrection"); if (tz) { if (tz.indexOf("|") > -1) { return parseInt(tz.split("|")[1], 10); } else if (tz.indexOf(":") > -1) { return parseInt(tz, 10) * 60 + parseInt(tz.split(":")[1], 10); } } return 0; } function editPreviewTable(article, h, reallyContribs, timeOffset) { var html = ["<table>"]; var day = null; var curart = article; var page = null; var makeFirstColumnLinks; if (reallyContribs) { makeFirstColumnLinks = function(currentRevision) { var result = "("; result += '<a href="' + pg.wiki.titlebase + new Title(currentRevision.title).urlString() + "&diff=prev" + "&oldid=" + currentRevision.revid + '">' + popupString("diff") + "</a>"; result += " | "; result += '<a href="' + pg.wiki.titlebase + new Title(currentRevision.title).urlString() + '&action=history">' + popupString("hist") + "</a>"; result += ")"; return result; }; } else { var firstRevid = h[0].revid; makeFirstColumnLinks = function(currentRevision) { var result = "("; result += '<a href="' + pg.wiki.titlebase + new Title(curart).urlString() + "&diff=" + firstRevid + "&oldid=" + currentRevision.revid + '">' + popupString("cur") + "</a>"; result += " | "; result += '<a href="' + pg.wiki.titlebase + new Title(curart).urlString() + "&diff=prev&oldid=" + currentRevision.revid + '">' + popupString("last") + "</a>"; result += ")"; return result; }; } for (var i = 0; i < h.length; ++i) { if (reallyContribs) { page = h[i].title; curart = new Title(page); } var minor = h[i].minor ? "<b>m </b>" : ""; var editDate = adjustDate(getDateFromTimestamp(h[i].timestamp), timeOffset); var thisDay = dayFormat(editDate); var thisTime = timeFormat(editDate); if (thisDay == day) { thisDay = ""; } else { day = thisDay; } if (thisDay) { html.push('<tr><td colspan=3><span class="popup_history_date">' + thisDay + "</span></td></tr>"); } html.push('<tr class="popup_history_row_' + (i % 2 ? "odd" : "even") + '">'); html.push("<td>" + makeFirstColumnLinks(h[i]) + "</td>"); html.push("<td>" + '<a href="' + pg.wiki.titlebase + new Title(curart).urlString() + "&oldid=" + h[i].revid + '">' + thisTime + "</a></td>"); var col3url = "", col3txt = ""; if (!reallyContribs) { var user = h[i].user; if (!h[i].userhidden) { if (pg.re.ipUser.test(user)) { col3url = pg.wiki.titlebase + mw.config.get("wgFormattedNamespaces")[pg.nsSpecialId] + ":Contributions&target=" + new Title(user).urlString(); } else { col3url = pg.wiki.titlebase + mw.config.get("wgFormattedNamespaces")[pg.nsUserId] + ":" + new Title(user).urlString(); } col3txt = pg.escapeQuotesHTML(user); } else { col3url = getValueOf("popupRevDelUrl"); col3txt = pg.escapeQuotesHTML(popupString("revdel")); } } else { col3url = pg.wiki.titlebase + curart.urlString(); col3txt = pg.escapeQuotesHTML(page); } html.push("<td>" + (reallyContribs ? minor : "") + '<a href="' + col3url + '">' + col3txt + "</a></td>"); var comment = ""; var c = h[i].comment || h[i].content; if (c) { comment = new Previewmaker(c, new Title(curart).toUrl()).editSummaryPreview(); } else if (h[i].commenthidden) { comment = popupString("revdel"); } html.push("<td>" + (!reallyContribs ? minor : "") + comment + "</td>"); html.push("</tr>"); html = [html.join("")]; } html.push("</table>"); return html.join(""); } function getDateFromTimestamp(t) { var s = t.split(/[^0-9]/); switch (s.length) { case 0: return null; case 1: return new Date(s[0]); case 2: return new Date(s[0], s[1] - 1); case 3: return new Date(s[0], s[1] - 1, s[2]); case 4: return new Date(s[0], s[1] - 1, s[2], s[3]); case 5: return new Date(s[0], s[1] - 1, s[2], s[3], s[4]); case 6: return new Date(s[0], s[1] - 1, s[2], s[3], s[4], s[5]); default: return new Date(s[0], s[1] - 1, s[2], s[3], s[4], s[5], s[6]); } } function adjustDate(d, offset) { var o = offset * 60 * 1e3; return new Date(+d + o); } function dayFormat(editDate, utc) { if (utc) { return map(zeroFill, [editDate.getUTCFullYear(), editDate.getUTCMonth() + 1, editDate.getUTCDate()]).join("-"); } return map(zeroFill, [editDate.getFullYear(), editDate.getMonth() + 1, editDate.getDate()]).join("-"); } function timeFormat(editDate, utc) { if (utc) { return map(zeroFill, [editDate.getUTCHours(), editDate.getUTCMinutes(), editDate.getUTCSeconds()]).join(":"); } return map(zeroFill, [editDate.getHours(), editDate.getMinutes(), editDate.getSeconds()]).join(":"); } function showAPIPreview(queryType, html, id, navpop, download) { var target = "popupPreview"; completedNavpopTask(navpop); switch (queryType) { case "imagelinks": case "category": target = "popupPostPreview"; break; case "userinfo": target = "popupUserData"; break; case "revision": insertPreview(download); return; } setPopupTipsAndHTML(html, target, id); } function APIrevisionPreviewHTML(article, download) { try { var jsObj = getJsObj(download.data); var page = anyChild(jsObj.query.pages); if (page.missing) { download.owner = null; return; } var content = page && page.revisions && page.revisions[0].contentmodel === "wikitext" ? page.revisions[0].content : null; if (typeof content === "string") { download.data = content; download.lastModified = new Date(page.revisions[0].timestamp); } } catch (someError) { return "Revision preview failed :("; } } function APIbacklinksPreviewHTML(article, download) { try { var jsObj = getJsObj(download.data); var list = jsObj.query.backlinks; var html = []; if (!list) { return popupString("No backlinks found"); } for (var i = 0; i < list.length; i++) { var t = new Title(list[i].title); html.push('<a href="' + pg.wiki.titlebase + t.urlString() + '">' + t + "</a>"); } html = html.join(popupString("separator")); if (jsObj["continue"] && jsObj["continue"].blcontinue) { html += popupString(" and more"); } return html; } catch (someError) { return "backlinksPreviewHTML went wonky"; } } pg.fn.APIsharedImagePagePreviewHTML = function APIsharedImagePagePreviewHTML(obj) { log("APIsharedImagePagePreviewHTML"); var popupid = obj.requestid; if (obj.query && obj.query.pages) { var page = anyChild(obj.query.pages); var content = page && page.revisions && page.revisions[0].contentmodel === "wikitext" ? page.revisions[0].content : null; if (typeof content === "string") { var p = new Previewmaker(content, pg.current.link.navpopup.article, pg.current.link.navpopup); p.makePreview(); setPopupHTML(p.html, "popupSecondPreview", popupid); } } }; function APIimagepagePreviewHTML(article, download, navpop) { try { var jsObj = getJsObj(download.data); var page = anyChild(jsObj.query.pages); var content = page && page.revisions && page.revisions[0].contentmodel === "wikitext" ? page.revisions[0].content : null; var ret = ""; var alt = ""; try { alt = navpop.parentAnchor.childNodes[0].alt; } catch (e) {} if (alt) { ret = ret + "<hr /><b>" + popupString("Alt text:") + "</b> " + pg.escapeQuotesHTML(alt); } if (typeof content === "string") { var p = prepPreviewmaker(content, article, navpop); p.makePreview(); if (p.html) { ret += "<hr />" + p.html; } if (getValueOf("popupSummaryData")) { var info = getPageInfo(content, download); log(info); setPopupTrailer(info, navpop.idNumber); } } if (page && page.imagerepository == "shared") { var art = new Title(article); var encart = encodeURIComponent("File:" + art.stripNamespace()); var shared_url = pg.wiki.apicommonsbase + "?format=json&formatversion=2" + "&callback=pg.fn.APIsharedImagePagePreviewHTML" + "&requestid=" + navpop.idNumber + "&action=query&prop=revisions&rvprop=content&titles=" + encart; ret = ret + "<hr />" + popupString("Image from Commons") + ': <a href="' + pg.wiki.commonsbase + "?title=" + encart + '">' + popupString("Description page") + "</a>"; mw.loader.load(shared_url); } showAPIPreview("imagelinks", APIimagelinksPreviewHTML(article, download), navpop.idNumber, download); return ret; } catch (someError) { return "API imagepage preview failed :("; } } function APIimagelinksPreviewHTML(article, download) { try { var jsobj = getJsObj(download.data); var list = jsobj.query.imageusage; if (list) { var ret = []; for (var i = 0; i < list.length; i++) { ret.push(list[i].title); } if (ret.length === 0) { return popupString("No image links found"); } return "<h2>" + popupString("File links") + "</h2>" + linkList(ret); } else { return popupString("No image links found"); } } catch (someError) { return "Image links preview generation failed :("; } } function APIcategoryPreviewHTML(article, download) { try { var jsobj = getJsObj(download.data); var list = jsobj.query.categorymembers; var ret = []; for (var p = 0; p < list.length; p++) { ret.push(list[p].title); } if (ret.length === 0) { return popupString("Empty category"); } ret = "<h2>" + tprintf("Category members (%s shown)", [ret.length]) + "</h2>" + linkList(ret); if (jsobj["continue"] && jsobj["continue"].cmcontinue) { ret += popupString(" and more"); } return ret; } catch (someError) { return "Category preview failed :("; } } function APIuserInfoPreviewHTML(article, download) { var ret = []; var queryobj = {}; try { queryobj = getJsObj(download.data).query; } catch (someError) { return "Userinfo preview failed :("; } var user = anyChild(queryobj.users); if (user) { var globaluserinfo = queryobj.globaluserinfo; if (user.invalid === "") { ret.push(popupString("Invalid user")); } else if (user.missing === "") { ret.push(popupString("Not a registered username")); } if (user.blockedby) ret.push("<b>" + popupString("BLOCKED") + "</b>"); if (globaluserinfo && ("locked" in globaluserinfo || "hidden" in globaluserinfo)) { var lockedSulAccountIsAttachedToThis = true; for (var i = 0; globaluserinfo.unattached && i < globaluserinfo.unattached.length; i++) { if (globaluserinfo.unattached[i].wiki === mw.config.get("wgDBname")) { lockedSulAccountIsAttachedToThis = false; break; } } if (lockedSulAccountIsAttachedToThis) { if ("locked" in globaluserinfo) ret.push("<b><i>" + popupString("LOCKED") + "</i></b>"); if ("hidden" in globaluserinfo) ret.push("<b><i>" + popupString("HIDDEN") + "</i></b>"); } } if (getValueOf("popupShowGender") && user.gender) { switch (user.gender) { case "male": ret.push(popupString("♂")); break; case "female": ret.push(popupString("♀")); break; } } if (user.groups) { var ug = []; for (var j = 0; j < user.groups.length; j++) { var currentGroup = user.groups[j]; if (["*", "user", "autoconfirmed", "extendedconfirmed"].indexOf(currentGroup) === -1) { ug.push(pg.escapeQuotesHTML(popupString("group-" + user.groups[j]))); } } if (user.groups.indexOf("autoconfirmed") === -1) { ug.push("<b>" + pg.escapeQuotesHTML(popupString("group-no-autoconfirmed")) + "</b>"); } if (ug.length === 0) { ug.push(pg.escapeQuotesHTML(popupString("group-user"))); } ret.push(ug.join(popupString("separator"))); } if (globaluserinfo && globaluserinfo.groups) { var gug = []; for (var k = 0; k < globaluserinfo.groups.length; k++) { gug.push("<i>" + pg.escapeQuotesHTML(popupString("group-" + globaluserinfo.groups[k])) + "</i>"); } ret.push(gug.join(popupString("separator"))); } if (user.registration) ret.push(pg.escapeQuotesHTML((user.editcount ? user.editcount : "0") + popupString(" edits since: ") + (user.registration ? dayFormat(getDateFromTimestamp(user.registration)) : ""))); } if (queryobj.usercontribs && queryobj.usercontribs.length) { ret.push(popupString("last edit on ") + dayFormat(getDateFromTimestamp(queryobj.usercontribs[0].timestamp))); } if (queryobj.blocks) { ret.push(popupString("IP user")); for (var l = 0; l < queryobj.blocks.length; l++) { ret.push("<b>" + popupString(queryobj.blocks[l].rangestart === queryobj.blocks[l].rangeend ? "BLOCKED" : "RANGEBLOCKED") + "</b>"); } } ret = "<hr />" + ret.join(popupString("comma")); return ret; } function APIcontribsPreviewHTML(article, download, navpop) { return APIhistoryPreviewHTML(article, download, navpop, true); } function APIhistoryPreviewHTML(article, download, navpop, reallyContribs) { try { var jsobj = getJsObj(download.data); var edits = []; if (reallyContribs) { edits = jsobj.query.usercontribs; } else { edits = anyChild(jsobj.query.pages).revisions; } var ret = editPreviewTable(article, edits, reallyContribs, getTimeOffset()); return ret; } catch (someError) { return "History preview failed :-("; } } function setupDebugging() { if (window.popupDebug) { window.log = function(x) { window.console.log(x); }; window.errlog = function(x) { window.console.error(x); }; log("Initializing logger"); } else { window.log = function() {}; window.errlog = function() {}; } } function loadImage(image, navpop) { if (typeof image.stripNamespace != "function") { alert("loadImages bad"); } if (!getValueOf("popupImages")) return; if (!isValidImageName(image)) return false; var art = image.urlString(); var url = pg.wiki.apiwikibase + "?format=json&formatversion=2&action=query"; url += "&prop=imageinfo&iiprop=url|mime&iiurlwidth=" + getValueOf("popupImageSizeLarge"); url += "&titles=" + art; pendingNavpopTask(navpop); var callback = function(d) { popupsInsertImage(navpop.idNumber, navpop, d); }; var go = function() { getPageWithCaching(url, callback, navpop); return true; }; if (navpop.visible || !getValueOf("popupLazyDownloads")) { go(); } else { navpop.addHook(go, "unhide", "after", "DOWNLOAD_IMAGE_QUERY_DATA"); } } function popupsInsertImage(id, navpop, download) { log("popupsInsertImage"); var imageinfo; try { var jsObj = getJsObj(download.data); var imagepage = anyChild(jsObj.query.pages); if (typeof imagepage.imageinfo === "undefined") return; imageinfo = imagepage.imageinfo[0]; } catch (someError) { log("popupsInsertImage failed :("); return; } var popupImage = document.getElementById("popupImg" + id); if (!popupImage) { log("could not find insertion point for image"); return; } popupImage.width = getValueOf("popupImageSize"); popupImage.style.display = "inline"; if (imageinfo.thumburl) popupImage.src = imageinfo.thumburl; else if (imageinfo.mime.indexOf("image") === 0) { popupImage.src = imageinfo.url; log("a thumb could not be found, using original image"); } else log("fullsize imagethumb, but not sure if it's an image"); var a = document.getElementById("popupImageLink" + id); if (a === null) { return null; } switch (getValueOf("popupThumbAction")) { case "imagepage": if (pg.current.article.namespaceId() != pg.nsImageId) { a.href = imageinfo.descriptionurl; popTipsSoonFn("popupImage" + id)(); break; } case "sizetoggle": a.onclick = toggleSize; a.title = popupString("Toggle image size"); return; case "linkfull": a.href = imageinfo.url; a.title = popupString("Open full-size image"); return; } } function toggleSize() { var imgContainer = this; if (!imgContainer) { alert("imgContainer is null :/"); return; } var img = imgContainer.firstChild; if (!img) { alert("img is null :/"); return; } if (!img.style.width || img.style.width === "") { img.style.width = "100%"; } else { img.style.width = ""; } } function getValidImageFromWikiText(wikiText) { var matched = null; var match; var t = removeMatchesUnless(wikiText, RegExp("(<!--[\\s\\S]*?-->)"), 1, RegExp("^<!--[^[]*popup", "i")); while (match = pg.re.image.exec(t)) { var m = match[2] || match[6]; if (isValidImageName(m)) { matched = m; break; } } pg.re.image.lastIndex = 0; if (!matched) { return null; } return mw.config.get("wgFormattedNamespaces")[pg.nsImageId] + ":" + upcaseFirst(matched); } function removeMatchesUnless(str, re1, parencount, re2) { var split = str.parenSplit(re1); var c = parencount + 1; for (var i = 0; i < split.length; ++i) { if (i % c === 0 || re2.test(split[i])) { continue; } split[i] = ""; } return split.join(""); } function setNamespaces() { pg.nsSpecialId = -1; pg.nsMainspaceId = 0; pg.nsImageId = 6; pg.nsUserId = 2; pg.nsUsertalkId = 3; pg.nsCategoryId = 14; pg.nsTemplateId = 10; } function setRedirs() { var r = "redirect"; var R = "REDIRECT"; var redirLists = { ar: [R, "تحويل"], be: [r, "перанакіраваньне"], bg: [r, "пренасочване", "виж"], bs: [r, "Preusmjeri", "preusmjeri", "PREUSMJERI"], cs: [R, "PŘESMĚRUJ"], cy: [r, "ail-cyfeirio"], de: [R, "WEITERLEITUNG"], el: [R, "ΑΝΑΚΑΤΕΥΘΥΝΣΗ"], eo: [R, "ALIDIREKTU", "ALIDIREKTI"], es: [R, "REDIRECCIÓN"], et: [r, "suuna"], ga: [r, "athsheoladh"], gl: [r, "REDIRECCIÓN", "REDIRECIONAMENTO"], he: [R, "הפניה"], hu: [R, "ÁTIRÁNYÍTÁS"], is: [r, "tilvísun", "TILVÍSUN"], it: [R, "RINVIA", "Rinvia"], ja: [R, "転送"], mk: [r, "пренасочување", "види"], nds: [r, "wiederleiden"], nl: [R, "DOORVERWIJZING"], nn: [r, "omdiriger"], pl: [R, "PATRZ", "PRZEKIERUJ", "TAM"], pt: [R, "redir"], ru: [R, "ПЕРЕНАПРАВЛЕНИЕ", "ПЕРЕНАПР"], sk: [r, "presmeruj"], sr: [r, "Преусмери", "преусмери", "ПРЕУСМЕРИ", "Preusmeri", "preusmeri", "PREUSMERI"], tt: [R, "yünältü", "перенаправление", "перенапр"], uk: [R, "ПЕРЕНАПРАВЛЕННЯ", "ПЕРЕНАПР"], vi: [r, "đổi"], zh: [R, "重定向"] }; var redirList = redirLists[pg.wiki.lang] || [r, R]; pg.re.redirect = RegExp("^\\s*[#](" + redirList.join("|") + ").*?\\[{2}([^\\|\\]]*)(|[^\\]]*)?\\]{2}\\s*(.*)", "i"); } function setInterwiki() { if (pg.wiki.wikimedia) { pg.wiki.interwiki = "aa|ab|ace|af|ak|als|am|an|ang|ar|arc|arz|as|ast|av|ay|az|ba|bar|bat-smg|bcl|be|be-x-old|bg|bh|bi|bjn|bm|bn|bo|bpy|br|bs|bug|bxr|ca|cbk-zam|cdo|ce|ceb|ch|cho|chr|chy|ckb|co|cr|crh|cs|csb|cu|cv|cy|da|de|diq|dsb|dv|dz|ee|el|eml|en|eo|es|et|eu|ext|fa|ff|fi|fiu-vro|fj|fo|fr|frp|frr|fur|fy|ga|gag|gan|gd|gl|glk|gn|got|gu|gv|ha|hak|haw|he|hi|hif|ho|hr|hsb|ht|hu|hy|hz|ia|id|ie|ig|ii|ik|ilo|io|is|it|iu|ja|jbo|jv|ka|kaa|kab|kbd|kg|ki|kj|kk|kl|km|kn|ko|koi|kr|krc|ks|ksh|ku|kv|kw|ky|la|lad|lb|lbe|lg|li|lij|lmo|ln|lo|lt|ltg|lv|map-bms|mdf|mg|mh|mhr|mi|mk|ml|mn|mo|mr|mrj|ms|mt|mus|mwl|my|myv|mzn|na|nah|nap|nds|nds-nl|ne|new|ng|nl|nn|no|nov|nrm|nv|ny|oc|om|or|os|pa|pag|pam|pap|pcd|pdc|pfl|pi|pih|pl|pms|pnb|pnt|ps|pt|qu|rm|rmy|rn|ro|roa-rup|roa-tara|ru|rue|rw|sa|sah|sc|scn|sco|sd|se|sg|sh|si|simple|sk|sl|sm|sn|so|sq|sr|srn|ss|st|stq|su|sv|sw|szl|ta|te|tet|tg|th|ti|tk|tl|tn|to|tpi|tr|ts|tt|tum|tw|ty|udm|ug|uk|ur|uz|ve|vec|vi|vls|vo|wa|war|wo|wuu|xal|xh|yi|yo|za|zea|zh|zh-classical|zh-min-nan|zh-yue|zu"; pg.re.interwiki = RegExp("^" + pg.wiki.interwiki + ":"); } else { pg.wiki.interwiki = null; pg.re.interwiki = RegExp("^$"); } } function nsRe(namespaceId) { var imageNamespaceVariants = []; jQuery.each(mw.config.get("wgNamespaceIds"), function(_localizedNamespaceLc, _namespaceId) { if (_namespaceId != namespaceId) return; _localizedNamespaceLc = upcaseFirst(_localizedNamespaceLc); imageNamespaceVariants.push(mw.util.escapeRegExp(_localizedNamespaceLc).split(" ").join("[ _]")); imageNamespaceVariants.push(mw.util.escapeRegExp(encodeURI(_localizedNamespaceLc))); }); return "(?:" + imageNamespaceVariants.join("|") + ")"; } function nsReImage() { return nsRe(pg.nsImageId); } function getEditboxSelection() { var editbox; try { editbox = document.editform.wpTextbox1; } catch (dang) { return; } if (document.selection) { return document.selection.createRange().text; } var selStart = editbox.selectionStart; var selEnd = editbox.selectionEnd; return editbox.value.substring(selStart, selEnd); } function doSelectionPopup() { var sel = getEditboxSelection(); var open = sel.indexOf("[["); var pipe = sel.indexOf("|"); var close = sel.indexOf("]]"); if (open == -1 || pipe == -1 && close == -1) { return; } if (pipe != -1 && open > pipe || close != -1 && open > close) { return; } if (getValueOf("popupOnEditSelection") == "boxpreview") { return doSeparateSelectionPopup(sel); } var article = new Title(sel.substring(open + 2, pipe < 0 ? close : pipe)).urlString(); if (close > 0 && sel.substring(close + 2).indexOf("[[") >= 0) { return; } var a = document.createElement("a"); a.href = pg.wiki.titlebase + article; mouseOverWikiLink2(a); if (a.navpopup) { a.navpopup.addHook(function() { runStopPopupTimer(a.navpopup); }, "unhide", "after"); } } function doSeparateSelectionPopup(str) { var div = document.getElementById("selectionPreview"); if (!div) { div = document.createElement("div"); div.id = "selectionPreview"; try { var box = document.editform.wpTextbox1; box.parentNode.insertBefore(div, box); } catch (error) { return; } } div.innerHTML = wiki2html(str); div.ranSetupTooltipsAlready = false; popTipsSoonFn("selectionPreview")(); } function Mousetracker() { this.loopDelay = 400; this.timer = null; this.active = false; this.dirty = true; this.hooks = []; } Mousetracker.prototype.addHook = function(f) { this.hooks.push(f); }; Mousetracker.prototype.runHooks = function() { if (!this.hooks || !this.hooks.length) { return; } var remove = false; var removeObj = {}; var x = this.x, y = this.y, len = this.hooks.length; for (var i = 0; i < len; ++i) { if (this.hooks[i](x, y) === true) { remove = true; removeObj[i] = true; } } if (remove) { this.removeHooks(removeObj); } }; Mousetracker.prototype.removeHooks = function(removeObj) { var newHooks = []; var len = this.hooks.length; for (var i = 0; i < len; ++i) { if (!removeObj[i]) { newHooks.push(this.hooks[i]); } } this.hooks = newHooks; }; Mousetracker.prototype.track = function(e) { e = e || window.event; var x, y; if (e) { if (e.pageX) { x = e.pageX; y = e.pageY; } else if (typeof e.clientX != "undefined") { var left, top, docElt = document.documentElement; if (docElt) { left = docElt.scrollLeft; } left = left || document.body.scrollLeft || document.scrollLeft || 0; if (docElt) { top = docElt.scrollTop; } top = top || document.body.scrollTop || document.scrollTop || 0; x = e.clientX + left; y = e.clientY + top; } else { return; } this.setPosition(x, y); } }; Mousetracker.prototype.setPosition = function(x, y) { this.x = x; this.y = y; if (this.dirty || this.hooks.length === 0) { this.dirty = false; return; } if (typeof this.lastHook_x != "number") { this.lastHook_x = -100; this.lastHook_y = -100; } var diff = (this.lastHook_x - x) * (this.lastHook_y - y); diff = diff >= 0 ? diff : -diff; if (diff > 1) { this.lastHook_x = x; this.lastHook_y = y; if (this.dirty) { this.dirty = false; } else { this.runHooks(); } } }; Mousetracker.prototype.enable = function() { if (this.active) { return; } this.active = true; this.savedHandler = document.onmousemove; var savedThis = this; document.onmousemove = function(e) { savedThis.track.apply(savedThis, [e]); }; if (this.loopDelay) { this.timer = setInterval(function() { savedThis.runHooks(); }, this.loopDelay); } }; Mousetracker.prototype.disable = function() { if (!this.active) { return; } if ($.isFunction(this.savedHandler)) { document.onmousemove = this.savedHandler; } else { delete document.onmousemove; } if (this.timer) { clearInterval(this.timer); } this.active = false; }; function Navpopup() { this.uid = Navpopup.uid++; this.visible = false; this.noshow = false; this.hooks = { create: [], unhide: [], hide: [] }; this.hookIds = {}; this.downloads = []; this.pending = null; this.fuzz = 5; this.constrained = true; this.width = 0; this.height = 0; this.mainDiv = null; this.createMainDiv(); } Navpopup.uid = 0; Navpopup.prototype.isVisible = function() { return this.visible; }; Navpopup.prototype.reposition = function(x, y, noLimitHor) { log("reposition(" + x + "," + y + "," + noLimitHor + ")"); if (typeof x != "undefined" && x !== null) { this.left = x; } if (typeof y != "undefined" && y !== null) { this.top = y; } if (typeof this.left != "undefined" && typeof this.top != "undefined") { this.mainDiv.style.left = this.left + "px"; this.mainDiv.style.top = this.top + "px"; } if (!noLimitHor) { this.limitHorizontalPosition(); } }; Navpopup.prototype.limitHorizontalPosition = function() { if (!this.constrained || this.tooWide) { return; } this.updateDimensions(); var x = this.left; var w = this.width; var cWidth = document.body.clientWidth; if (x + w >= cWidth || x > 0 && this.maxWidth && this.width < this.maxWidth && this.height > this.width && x > cWidth - this.maxWidth) { this.mainDiv.style.left = "-10000px"; this.mainDiv.style.width = this.maxWidth + "px"; var naturalWidth = parseInt(this.mainDiv.offsetWidth, 10); var newLeft = cWidth - naturalWidth - 1; if (newLeft < 0) { newLeft = 0; this.tooWide = true; } log("limitHorizontalPosition: moving to (" + newLeft + "," + this.top + ");" + " naturalWidth=" + naturalWidth + ", clientWidth=" + cWidth); this.reposition(newLeft, null, true); } }; Navpopup.highest = 1e3; Navpopup.prototype.raise = function() { this.mainDiv.style.zIndex = Navpopup.highest + 1; ++Navpopup.highest; }; Navpopup.prototype.show = function() { if (this.noshow) { return; } this.reposition(); this.raise(); this.unhide(); }; Navpopup.prototype.showSoonIfStable = function(time) { log("showSoonIfStable, time=" + time); if (this.visible) { return; } this.noshow = false; this.stable_x = -1e4; this.stable_y = -1e4; var stableShow = function() { log("stableShow called"); var new_x = Navpopup.tracker.x, new_y = Navpopup.tracker.y; var dx = savedThis.stable_x - new_x, dy = savedThis.stable_y - new_y; var fuzz2 = 0; if (dx * dx <= fuzz2 && dy * dy <= fuzz2) { log("mouse is stable"); clearInterval(savedThis.showSoonStableTimer); savedThis.reposition.apply(savedThis, [new_x + 2, new_y + 2]); savedThis.show.apply(savedThis, []); savedThis.limitHorizontalPosition.apply(savedThis, []); return; } savedThis.stable_x = new_x; savedThis.stable_y = new_y; }; var savedThis = this; this.showSoonStableTimer = setInterval(stableShow, time / 2); }; Navpopup.prototype.banish = function() { log("banish called"); this.noshow = true; if (this.showSoonStableTimer) { log("clearing showSoonStableTimer"); clearInterval(this.showSoonStableTimer); } this.hide(); }; Navpopup.prototype.runHooks = function(key, when) { if (!this.hooks[key]) { return; } var keyHooks = this.hooks[key]; var len = keyHooks.length; for (var i = 0; i < len; ++i) { if (keyHooks[i] && keyHooks[i].when == when) { if (keyHooks[i].hook.apply(this, [])) { if (keyHooks[i].hookId) { delete this.hookIds[keyHooks[i].hookId]; } keyHooks[i] = null; } } } }; Navpopup.prototype.addHook = function(hook, key, when, uid) { when = when || "after"; if (!this.hooks[key]) { return; } var hookId = null; if (uid) { hookId = [key, when, uid].join("|"); if (this.hookIds[hookId]) { return; } this.hookIds[hookId] = true; } this.hooks[key].push({ hook: hook, when: when, hookId: hookId }); }; Navpopup.prototype.createMainDiv = function() { if (this.mainDiv) { return; } this.runHooks("create", "before"); var mainDiv = document.createElement("div"); var savedThis = this; mainDiv.onclick = function(e) { savedThis.onclickHandler(e); }; mainDiv.className = this.className ? this.className : "navpopup_maindiv"; mainDiv.id = mainDiv.className + this.uid; mainDiv.style.position = "absolute"; mainDiv.style.minWidth = "350px"; mainDiv.style.display = "none"; mainDiv.className = "navpopup"; mainDiv.navpopup = this; this.mainDiv = mainDiv; document.body.appendChild(mainDiv); this.runHooks("create", "after"); }; Navpopup.prototype.onclickHandler = function() { this.raise(); }; Navpopup.prototype.makeDraggable = function(handleName) { if (!this.mainDiv) { this.createMainDiv(); } var drag = new Drag(); if (!handleName) { drag.startCondition = function(e) { try { if (!e.shiftKey) { return false; } } catch (err) { return false; } return true; }; } var dragHandle; if (handleName) dragHandle = document.getElementById(handleName); if (!dragHandle) dragHandle = this.mainDiv; var np = this; drag.endHook = function(x, y) { Navpopup.tracker.dirty = true; np.reposition(x, y); }; drag.init(dragHandle, this.mainDiv); }; Navpopup.prototype.hide = function() { this.runHooks("hide", "before"); this.abortDownloads(); if (typeof this.visible != "undefined" && this.visible) { this.mainDiv.style.display = "none"; this.visible = false; } this.runHooks("hide", "after"); }; Navpopup.prototype.unhide = function() { this.runHooks("unhide", "before"); if (typeof this.visible != "undefined" && !this.visible) { this.mainDiv.style.display = "inline"; this.visible = true; } this.runHooks("unhide", "after"); }; Navpopup.prototype.setInnerHTML = function(html) { this.mainDiv.innerHTML = html; }; Navpopup.prototype.updateDimensions = function() { this.width = parseInt(this.mainDiv.offsetWidth, 10); this.height = parseInt(this.mainDiv.offsetHeight, 10); }; Navpopup.prototype.isWithin = function(x, y) { if (!this.visible) { return false; } this.updateDimensions(); var fuzz = this.fuzz || 0; return x + fuzz >= this.left && x - fuzz <= this.left + this.width && y + fuzz >= this.top && y - fuzz <= this.top + this.height; }; Navpopup.prototype.addDownload = function(download) { if (!download) { return; } this.downloads.push(download); }; Navpopup.prototype.abortDownloads = function() { for (var i = 0; i < this.downloads.length; ++i) { var d = this.downloads[i]; if (d && d.abort) { d.abort(); } } this.downloads = []; }; Navpopup.tracker = new Mousetracker(); function delFmt(x) { if (!x.length) { return ""; } return "<del class='popupDiff'>" + x.join("") + "</del>"; } function insFmt(x) { if (!x.length) { return ""; } return "<ins class='popupDiff'>" + x.join("") + "</ins>"; } function countCrossings(a, b, i, eject) { if (!b[i].row && b[i].row !== 0) { return -1; } var count = 0; for (var j = 0; j < a.length; ++j) { if (!a[j].row && a[j].row !== 0) { continue; } if ((j - b[i].row) * (i - a[j].row) > 0) { if (eject) { return true; } count++; } } return count; } function shortenDiffString(str, context) { var re = RegExp("(<del[\\s\\S]*?</del>|<ins[\\s\\S]*?</ins>)"); var splitted = str.parenSplit(re); var ret = [""]; for (var i = 0; i < splitted.length; i += 2) { if (splitted[i].length < 2 * context) { ret[ret.length - 1] += splitted[i]; if (i + 1 < splitted.length) { ret[ret.length - 1] += splitted[i + 1]; } continue; } else { if (i > 0) { ret[ret.length - 1] += splitted[i].substring(0, context); } if (i + 1 < splitted.length) { ret.push(splitted[i].substring(splitted[i].length - context) + splitted[i + 1]); } } } while (ret.length > 0 && !ret[0]) { ret = ret.slice(1); } return ret; } function diffString(o, n, simpleSplit) { var splitRe = RegExp("([[]{2}|[\\]]{2}|[{]{2,3}|[}]{2,3}|[|]|=|<|>|[*:]+|\\s|\\b)"); var out, i, oSplitted, nSplitted; if (simpleSplit) { oSplitted = o.split(/\b/); nSplitted = n.split(/\b/); } else { oSplitted = o.parenSplit(splitRe); nSplitted = n.parenSplit(splitRe); } for (i = 0; i < oSplitted.length; ++i) { oSplitted[i] = oSplitted[i].entify(); } for (i = 0; i < nSplitted.length; ++i) { nSplitted[i] = nSplitted[i].entify(); } out = diff(oSplitted, nSplitted); var str = ""; var acc = []; var maxOutputPair = 0; for (i = 0; i < out.n.length; ++i) { if (out.n[i].paired) { if (maxOutputPair > out.n[i].row) { out.o[out.n[i].row] = out.o[out.n[i].row].text; out.n[i] = out.n[i].text; } if (maxOutputPair < out.n[i].row) { maxOutputPair = out.n[i].row; } } } for (i = 0; i < out.o.length && !out.o[i].paired; ++i) { acc.push(out.o[i]); } str += delFmt(acc); acc = []; for (i = 0; i < out.n.length; ++i) { while (i < out.n.length && !out.n[i].paired) { acc.push(out.n[i++]); } str += insFmt(acc); acc = []; if (i < out.n.length) { str += out.n[i].text; var m = out.n[i].row + 1; while (m < out.o.length && !out.o[m].paired) { acc.push(out.o[m++]); } str += delFmt(acc); acc = []; } } return str; } var jsReservedProperties = RegExp("^(constructor|prototype|__((define|lookup)[GS]etter)__" + "|eval|hasOwnProperty|propertyIsEnumerable" + "|to(Source|String|LocaleString)|(un)?watch|valueOf)$"); function diffBugAlert(word) { if (!diffBugAlert.list[word]) { diffBugAlert.list[word] = 1; alert("Bad word: " + word + "\n\nPlease report this bug."); } } diffBugAlert.list = {}; function makeDiffHashtable(src) { var ret = {}; for (var i = 0; i < src.length; i++) { if (jsReservedProperties.test(src[i])) { src[i] += "<!-- -->"; } if (!ret[src[i]]) { ret[src[i]] = []; } try { ret[src[i]].push(i); } catch (err) { diffBugAlert(src[i]); } } return ret; } function diff(o, n) { var ns = makeDiffHashtable(n); var os = makeDiffHashtable(o); var i; for (i in ns) { if (ns[i].length == 1 && os[i] && os[i].length == 1) { n[ns[i][0]] = { text: n[ns[i][0]], row: os[i][0], paired: true }; o[os[i][0]] = { text: o[os[i][0]], row: ns[i][0], paired: true }; } } for (i = 0; i < n.length - 1; i++) { if (n[i].paired && !n[i + 1].paired && n[i].row + 1 < o.length && !o[n[i].row + 1].paired && n[i + 1] == o[n[i].row + 1]) { n[i + 1] = { text: n[i + 1], row: n[i].row + 1, paired: true }; o[n[i].row + 1] = { text: o[n[i].row + 1], row: i + 1, paired: true }; } } for (i = n.length - 1; i > 0; i--) { if (n[i].paired && !n[i - 1].paired && n[i].row > 0 && !o[n[i].row - 1].paired && n[i - 1] == o[n[i].row - 1]) { n[i - 1] = { text: n[i - 1], row: n[i].row - 1, paired: true }; o[n[i].row - 1] = { text: o[n[i].row - 1], row: i - 1, paired: true }; } } return { o: o, n: n }; } function setSiteInfo() { if (window.popupLocalDebug) { pg.wiki.hostname = "en.wikipedia.org"; } else { pg.wiki.hostname = location.hostname; } pg.wiki.wikimedia = RegExp("(wiki([pm]edia|source|books|news|quote|versity)|wiktionary|mediawiki)[.]org").test(pg.wiki.hostname); pg.wiki.wikia = RegExp("[.]wikia[.]com$", "i").test(pg.wiki.hostname); pg.wiki.isLocal = RegExp("^localhost").test(pg.wiki.hostname); pg.wiki.commons = pg.wiki.wikimedia && pg.wiki.hostname != "commons.wikimedia.org" ? "commons.wikimedia.org" : null; pg.wiki.lang = mw.config.get("wgContentLanguage"); var port = location.port ? ":" + location.port : ""; pg.wiki.sitebase = pg.wiki.hostname + port; } function setUserInfo() { var api = new mw.Api({ ajax: { headers: { "Api-User-Agent": pg.misc.userAgent } } }); var params = { action: "query", list: "users", ususers: mw.config.get("wgUserName"), usprop: "rights" }; pg.user.canReview = false; if (getValueOf("popupReview")) { api.get(params).done(function(data) { var rights = data.query.users[0].rights; pg.user.canReview = rights.indexOf("review") !== -1; }); } } function setTitleBase() { var protocol = window.popupLocalDebug ? "http:" : location.protocol; pg.wiki.articlePath = mw.config.get("wgArticlePath").replace(/\/\$1/, ""); pg.wiki.botInterfacePath = mw.config.get("wgScript"); pg.wiki.APIPath = mw.config.get("wgScriptPath") + "/api.php"; var titletail = pg.wiki.botInterfacePath + "?title="; pg.wiki.titlebase = protocol + "//" + pg.wiki.sitebase + titletail; pg.wiki.wikibase = protocol + "//" + pg.wiki.sitebase + pg.wiki.botInterfacePath; pg.wiki.apiwikibase = protocol + "//" + pg.wiki.sitebase + pg.wiki.APIPath; pg.wiki.articlebase = protocol + "//" + pg.wiki.sitebase + pg.wiki.articlePath; pg.wiki.commonsbase = protocol + "//" + pg.wiki.commons + pg.wiki.botInterfacePath; pg.wiki.apicommonsbase = protocol + "//" + pg.wiki.commons + pg.wiki.APIPath; pg.re.basenames = RegExp("^(" + map(literalizeRegex, [pg.wiki.titlebase, pg.wiki.articlebase]).join("|") + ")"); } function setMainRegex() { var reStart = "[^:]*://"; var preTitles = literalizeRegex(mw.config.get("wgScriptPath")) + "/(?:index[.]php|wiki[.]phtml)[?]title="; preTitles += "|" + literalizeRegex(pg.wiki.articlePath + "/"); var reEnd = "(" + preTitles + ")([^&?#]*)[^#]*(?:#(.+))?"; pg.re.main = RegExp(reStart + literalizeRegex(pg.wiki.sitebase) + reEnd); } function setRegexps() { setMainRegex(); var sp = nsRe(pg.nsSpecialId); pg.re.urlNoPopup = RegExp("((title=|/)" + sp + "(?:%3A|:)|section=[0-9]|^#$)"); pg.re.contribs = RegExp("(title=|/)" + sp + "(?:%3A|:)Contributions" + "(&target=|/|/" + nsRe(pg.nsUserId) + ":)(.*)"); pg.re.email = RegExp("(title=|/)" + sp + "(?:%3A|:)EmailUser" + "(&target=|/|/(?:" + nsRe(pg.nsUserId) + ":)?)(.*)"); pg.re.backlinks = RegExp("(title=|/)" + sp + "(?:%3A|:)WhatLinksHere" + "(&target=|/)([^&]*)"); pg.re.specialdiff = RegExp("/" + sp + "(?:%3A|:)Diff/([^?#]*)"); var im = nsReImage(); pg.re.image = RegExp("(^|\\[\\[)" + im + ": *([^|\\]]*[^|\\] ])" + "([^0-9\\]]*([0-9]+) *px)?|(?:\\n *[|]?|[|]) *" + "(" + getValueOf("popupImageVarsRegexp") + ")" + " *= *(?:\\[\\[ *)?(?:" + im + ":)?" + "([^|]*?)(?:\\]\\])? *[|]? *\\n", "img"); pg.re.imageBracketCount = 6; pg.re.category = RegExp("\\[\\[" + nsRe(pg.nsCategoryId) + ": *([^|\\]]*[^|\\] ]) *", "i"); pg.re.categoryBracketCount = 1; pg.re.ipUser = RegExp("^" + "(?::(?::|(?::[0-9A-Fa-f]{1,4}){1,7})|[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4}){0,6}::|[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4}){7})" + "|(((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}" + "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9]))$"); pg.re.stub = RegExp(getValueOf("popupStubRegexp"), "im"); pg.re.disambig = RegExp(getValueOf("popupDabRegexp"), "im"); pg.re.oldid = RegExp("[?&]oldid=([^&]*)"); pg.re.diff = RegExp("[?&]diff=([^&]*)"); } function setupCache() { pg.cache.pages = []; } function setMisc() { pg.current.link = null; pg.current.links = []; pg.current.linksHash = {}; setupCache(); pg.timer.checkPopupPosition = null; pg.counter.loop = 0; pg.idNumber = 0; pg.misc.decodeExtras = [{ from: "%2C", to: "," }, { from: "_", to: " " }, { from: "%24", to: "$" }, { from: "%26", to: "&" }]; pg.misc.userAgent = "Navigation popups/1.0 (" + mw.config.get("wgServerName") + ")"; } function setupPopups(callback) { if (setupPopups.completed) { if ($.isFunction(callback)) { callback(); } return; } mw.loader.using(["mediawiki.util", "mediawiki.user", "user.options"]).then(function() { setupDebugging(); setSiteInfo(); setTitleBase(); setOptions(); setUserInfo(); setNamespaces(); setInterwiki(); setRegexps(); setRedirs(); setMisc(); setupLivePreview(); setupTooltips(); log("In setupPopups(), just called setupTooltips()"); Navpopup.tracker.enable(); setupPopups.completed = true; if ($.isFunction(callback)) { callback(); } }); } function defaultNavlinkSpec() { var str = ""; str += "<b><<mainlink|shortcut= >></b>"; if (getValueOf("popupLastEditLink")) { str += "*<<lastEdit|shortcut=/>>|<<lastContrib>>|<<sinceMe>>if(oldid){|<<oldEdit>>|<<diffCur>>}"; } str += "if(user){<br><<contribs|shortcut=c>>*<<userlog|shortcut=L|log>>"; str += "if(ipuser){*<<arin>>}if(wikimedia){*<<count|shortcut=#>>}"; str += "if(ipuser){}else{*<<email|shortcut=E>>}if(admin){*<<block|shortcut=b>>|<<blocklog|log>>}}"; var editstr = "<<edit|shortcut=e>>"; var editOldidStr = "if(oldid){<<editOld|shortcut=e>>|<<revert|shortcut=v|rv>>|<<edit|cur>>}else{" + editstr + "}"; var historystr = "<<history|shortcut=h>>|<<editors|shortcut=E|>>"; var watchstr = "<<unwatch|unwatchShort>>|<<watch|shortcut=w|watchThingy>>"; str += "<br>if(talk){" + editOldidStr + "|<<new|shortcut=+>>" + "*" + historystr + "*" + watchstr + "*" + "<b><<article|shortcut=a>></b>|<<editArticle|edit>>" + "}else{" + editOldidStr + "*" + historystr + "*" + watchstr + "*" + "<b><<talk|shortcut=t>></b>|<<editTalk|edit>>|<<newTalk|shortcut=+|new>>}"; str += "<br><<whatLinksHere|shortcut=l>>*<<relatedChanges|shortcut=r>>*<<move|shortcut=m>>"; str += "if(admin){<br><<unprotect|unprotectShort>>|<<protect|shortcut=p>>|<<protectlog|log>>*" + "<<undelete|undeleteShort>>|<<delete|shortcut=d>>|<<deletelog|log>>}"; return str; } function navLinksHTML(article, hint, params) { var str = '<span class="popupNavLinks">' + defaultNavlinkSpec() + "</span>"; return navlinkStringToHTML(str, article, params); } function expandConditionalNavlinkString(s, article, z, recursionCount) { var oldid = z.oldid, rcid = z.rcid, diff = z.diff; if (typeof recursionCount != typeof 0) { recursionCount = 0; } var conditionalSplitRegex = RegExp("(;?\\s*if\\s*\\(\\s*([\\w]*)\\s*\\)\\s*\\{([^{}]*)\\}(\\s*else\\s*\\{([^{}]*?)\\}|))", "i"); var splitted = s.parenSplit(conditionalSplitRegex); var numParens = 5; var ret = splitted[0]; for (var i = 1; i < splitted.length; i = i + numParens + 1) { var testString = splitted[i + 2 - 1]; var trueString = splitted[i + 3 - 1]; var falseString = splitted[i + 5 - 1]; if (typeof falseString == "undefined" || !falseString) { falseString = ""; } var testResult = null; switch (testString) { case "user": testResult = article.userName() ? true : false; break; case "talk": testResult = article.talkPage() ? false : true; break; case "admin": testResult = getValueOf("popupAdminLinks") ? true : false; break; case "oldid": testResult = typeof oldid != "undefined" && oldid ? true : false; break; case "rcid": testResult = typeof rcid != "undefined" && rcid ? true : false; break; case "ipuser": testResult = article.isIpUser() ? true : false; break; case "mainspace_en": testResult = isInMainNamespace(article) && pg.wiki.hostname == "en.wikipedia.org"; break; case "wikimedia": testResult = pg.wiki.wikimedia ? true : false; break; case "diff": testResult = typeof diff != "undefined" && diff ? true : false; break; } switch (testResult) { case null: ret += splitted[i]; break; case true: ret += trueString; break; case false: ret += falseString; break; } ret += splitted[i + numParens]; } if (conditionalSplitRegex.test(ret) && recursionCount < 10) { return expandConditionalNavlinkString(ret, article, z, recursionCount + 1); } return ret; } function navlinkStringToArray(s, article, params) { s = expandConditionalNavlinkString(s, article, params); var splitted = s.parenSplit(RegExp("<<(.*?)>>")); var ret = []; for (var i = 0; i < splitted.length; ++i) { if (i % 2) { var t = new navlinkTag(); var ss = splitted[i].split("|"); t.id = ss[0]; for (var j = 1; j < ss.length; ++j) { var sss = ss[j].split("="); if (sss.length > 1) { t[sss[0]] = sss[1]; } else { t.text = popupString(sss[0]); } } t.article = article; var oldid = params.oldid, rcid = params.rcid, diff = params.diff; if (typeof oldid !== "undefined" && oldid !== null) { t.oldid = oldid; } if (typeof rcid !== "undefined" && rcid !== null) { t.rcid = rcid; } if (typeof diff !== "undefined" && diff !== null) { t.diff = diff; } if (!t.text && t.id !== "mainlink") { t.text = popupString(t.id); } ret.push(t); } else { ret.push(splitted[i]); } } return ret; } function navlinkSubstituteHTML(s) { return s.split("*").join(getValueOf("popupNavLinkSeparator")).split("<menurow>").join('<li class="popup_menu_row">').split("</menurow>").join("</li>").split("<menu>").join('<ul class="popup_menu">').split("</menu>").join("</ul>"); } function navlinkDepth(magic, s) { return s.split("<" + magic + ">").length - s.split("</" + magic + ">").length; } function navlinkStringToHTML(s, article, params) { var p = navlinkStringToArray(s, article, params); var html = ""; var menudepth = 0; var menurowdepth = 0; for (var i = 0; i < p.length; ++i) { if (typeof p[i] == typeof "") { html += navlinkSubstituteHTML(p[i]); menudepth += navlinkDepth("menu", p[i]); menurowdepth += navlinkDepth("menurow", p[i]); } else if (typeof p[i].type != "undefined" && p[i].type == "navlinkTag") { if (menudepth > 0 && menurowdepth === 0) { html += '<li class="popup_menu_item">' + p[i].html() + "</li>"; } else { html += p[i].html(); } } } return html; } function navlinkTag() { this.type = "navlinkTag"; } navlinkTag.prototype.html = function() { this.getNewWin(); this.getPrintFunction(); var html = ""; var opening, closing; var tagType = "span"; if (!tagType) { opening = ""; closing = ""; } else { opening = "<" + tagType + ' class="popup_' + this.id + '">'; closing = "</" + tagType + ">"; } if (typeof this.print != "function") { errlog("Oh dear - invalid print function for a navlinkTag, id=" + this.id); } else { html = this.print(this); if (typeof html != typeof "") { html = ""; } else if (typeof this.shortcut != "undefined") html = addPopupShortcut(html, this.shortcut); } return opening + html + closing; }; navlinkTag.prototype.getNewWin = function() { getValueOf("popupLinksNewWindow"); if (typeof pg.option.popupLinksNewWindow[this.id] === "undefined") { this.newWin = null; } this.newWin = pg.option.popupLinksNewWindow[this.id]; }; navlinkTag.prototype.getPrintFunction = function() { if (typeof this.id != typeof "" || typeof this.article != typeof {}) { return; } this.noPopup = 1; switch (this.id) { case "contribs": case "history": case "whatLinksHere": case "userPage": case "monobook": case "userTalk": case "talk": case "article": case "lastEdit": this.noPopup = null; } switch (this.id) { case "email": case "contribs": case "block": case "unblock": case "userlog": case "userSpace": case "deletedContribs": this.article = this.article.userName(); } switch (this.id) { case "userTalk": case "newUserTalk": case "editUserTalk": case "userPage": case "monobook": case "editMonobook": case "blocklog": this.article = this.article.userName(true); case "pagelog": case "deletelog": case "protectlog": delete this.oldid; } if (this.id == "editMonobook" || this.id == "monobook") { this.article.append("/monobook.js"); } if (this.id != "mainlink") { this.article = this.article.removeAnchor(); } switch (this.id) { case "undelete": this.print = specialLink; this.specialpage = "Undelete"; this.sep = "/"; break; case "whatLinksHere": this.print = specialLink; this.specialpage = "Whatlinkshere"; break; case "relatedChanges": this.print = specialLink; this.specialpage = "Recentchangeslinked"; break; case "move": this.print = specialLink; this.specialpage = "Movepage"; break; case "contribs": this.print = specialLink; this.specialpage = "Contributions"; break; case "deletedContribs": this.print = specialLink; this.specialpage = "Deletedcontributions"; break; case "email": this.print = specialLink; this.specialpage = "EmailUser"; this.sep = "/"; break; case "block": this.print = specialLink; this.specialpage = "Blockip"; this.sep = "&ip="; break; case "unblock": this.print = specialLink; this.specialpage = "Ipblocklist"; this.sep = "&action=unblock&ip="; break; case "userlog": this.print = specialLink; this.specialpage = "Log"; this.sep = "&user="; break; case "blocklog": this.print = specialLink; this.specialpage = "Log"; this.sep = "&type=block&page="; break; case "pagelog": this.print = specialLink; this.specialpage = "Log"; this.sep = "&page="; break; case "protectlog": this.print = specialLink; this.specialpage = "Log"; this.sep = "&type=protect&page="; break; case "deletelog": this.print = specialLink; this.specialpage = "Log"; this.sep = "&type=delete&page="; break; case "userSpace": this.print = specialLink; this.specialpage = "PrefixIndex"; this.sep = "&namespace=2&prefix="; break; case "search": this.print = specialLink; this.specialpage = "Search"; this.sep = "&fulltext=Search&search="; break; case "thank": this.print = specialLink; this.specialpage = "Thanks"; this.sep = "/"; this.article.value = this.diff; break; case "unwatch": case "watch": this.print = magicWatchLink; this.action = this.id + "&autowatchlist=1&autoimpl=" + popupString("autoedit_version") + "&actoken=" + autoClickToken(); break; case "history": case "historyfeed": case "unprotect": case "protect": this.print = wikiLink; this.action = this.id; break; case "delete": this.print = wikiLink; this.action = "delete"; if (this.article.namespaceId() == pg.nsImageId) { var img = this.article.stripNamespace(); this.action += "&image=" + img; } break; case "markpatrolled": case "edit": delete this.oldid; case "view": case "purge": case "render": this.print = wikiLink; this.action = this.id; break; case "raw": this.print = wikiLink; this.action = "raw"; break; case "new": this.print = wikiLink; this.action = "edit§ion=new"; break; case "mainlink": if (typeof this.text == "undefined") { this.text = this.article.toString().entify(); } if (getValueOf("popupSimplifyMainLink") && isInStrippableNamespace(this.article)) { var s = this.text.split("/"); this.text = s[s.length - 1]; if (this.text === "" && s.length > 1) { this.text = s[s.length - 2]; } } this.print = titledWikiLink; if (typeof this.title === "undefined" && pg.current.link && typeof pg.current.link.href !== "undefined") { this.title = safeDecodeURI(pg.current.link.originalTitle ? pg.current.link.originalTitle : this.article); if (typeof this.oldid !== "undefined" && this.oldid) { this.title = tprintf("Revision %s of %s", [this.oldid, this.title]); } } this.action = "view"; break; case "userPage": case "article": case "monobook": case "editMonobook": case "editArticle": delete this.oldid; this.article = this.article.articleFromTalkOrArticle(); this.print = wikiLink; if (this.id.indexOf("edit") === 0) { this.action = "edit"; } else { this.action = "view"; } break; case "userTalk": case "talk": this.article = this.article.talkPage(); delete this.oldid; this.print = wikiLink; this.action = "view"; break; case "arin": this.print = arinLink; break; case "count": this.print = editCounterLink; break; case "google": this.print = googleLink; break; case "editors": this.print = editorListLink; break; case "globalsearch": this.print = globalSearchLink; break; case "lastEdit": this.print = titledDiffLink; this.title = popupString("Show the last edit"); this.from = "prev"; this.to = "cur"; break; case "oldEdit": this.print = titledDiffLink; this.title = popupString("Show the edit made to get revision") + " " + this.oldid; this.from = "prev"; this.to = this.oldid; break; case "editOld": this.print = wikiLink; this.action = "edit"; break; case "undo": this.print = wikiLink; this.action = "edit&undo="; break; case "revert": this.print = wikiLink; this.action = "revert"; break; case "nullEdit": this.print = wikiLink; this.action = "nullEdit"; break; case "diffCur": this.print = titledDiffLink; this.title = tprintf("Show changes since revision %s", [this.oldid]); this.from = this.oldid; this.to = "cur"; break; case "editUserTalk": case "editTalk": delete this.oldid; this.article = this.article.talkPage(); this.action = "edit"; this.print = wikiLink; break; case "newUserTalk": case "newTalk": this.article = this.article.talkPage(); this.action = "edit§ion=new"; this.print = wikiLink; break; case "lastContrib": case "sinceMe": this.print = magicHistoryLink; break; case "togglePreviews": this.text = popupString(pg.option.simplePopups ? "enable previews" : "disable previews"); case "disablePopups": case "purgePopups": this.print = popupMenuLink; break; default: this.print = function() { return "Unknown navlink type: " + this.id + ""; }; } }; function popupHandleKeypress(evt) { var keyCode = window.event ? window.event.keyCode : evt.keyCode ? evt.keyCode : evt.which; if (!keyCode || !pg.current.link || !pg.current.link.navpopup) { return; } if (keyCode == 27) { killPopup(); return false; } var letter = String.fromCharCode(keyCode); var links = pg.current.link.navpopup.mainDiv.getElementsByTagName("A"); var startLink = 0; var i, j; if (popupHandleKeypress.lastPopupLinkSelected) { for (i = 0; i < links.length; ++i) { if (links[i] == popupHandleKeypress.lastPopupLinkSelected) { startLink = i; } } } for (j = 0; j < links.length; ++j) { i = (startLink + j + 1) % links.length; if (links[i].getAttribute("popupkey") == letter) { if (evt && evt.preventDefault) evt.preventDefault(); links[i].focus(); popupHandleKeypress.lastPopupLinkSelected = links[i]; return false; } } if (document.oldPopupOnkeypress) { return document.oldPopupOnkeypress(evt); } return true; } function addPopupShortcuts() { if (document.onkeypress != popupHandleKeypress) { document.oldPopupOnkeypress = document.onkeypress; } document.onkeypress = popupHandleKeypress; } function rmPopupShortcuts() { popupHandleKeypress.lastPopupLinkSelected = null; try { if (document.oldPopupOnkeypress && document.oldPopupOnkeypress == popupHandleKeypress) { document.onkeypress = null; return; } document.onkeypress = document.oldPopupOnkeypress; } catch (nasties) {} } function addLinkProperty(html, property) { var i = html.indexOf(">"); if (i < 0) { return html; } return html.substring(0, i) + " " + property + html.substring(i); } function addPopupShortcut(html, key) { if (!getValueOf("popupShortcutKeys")) { return html; } var ret = addLinkProperty(html, 'popupkey="' + key + '"'); if (key == " ") { key = popupString("spacebar"); } return ret.replace(RegExp('^(.*?)(title=")(.*?)(".*)$', "i"), "$1$2$3 [" + key + "]$4"); } function loadDiff(article, oldid, diff, navpop) { navpop.diffData = { oldRev: {}, newRev: {} }; mw.loader.using("mediawiki.api").then(function() { var api = new mw.Api({ ajax: { headers: { "Api-User-Agent": pg.misc.userAgent } } }); var params = { action: "compare", prop: "ids|title" }; if (article.title) { params.fromtitle = article.title; } switch (diff) { case "cur": switch (oldid) { case null: case "": case "prev": params.torelative = "prev"; break; default: params.fromrev = oldid; params.torelative = "cur"; break; } break; case "prev": if (oldid) { params.fromrev = oldid; } else { params.fromtitle; } params.torelative = "prev"; break; case "next": params.fromrev = oldid || 0; params.torelative = "next"; break; default: params.fromrev = oldid || 0; params.torev = diff || 0; break; } api.get(params).then(function(data) { navpop.diffData.oldRev.revid = data.compare.fromrevid; navpop.diffData.newRev.revid = data.compare.torevid; addReviewLink(navpop, "popupMiscTools"); var go = function() { pendingNavpopTask(navpop); var url = pg.wiki.apiwikibase + "?format=json&formatversion=2&action=query&"; url += "revids=" + navpop.diffData.oldRev.revid + "|" + navpop.diffData.newRev.revid; url += "&prop=revisions&rvprop=ids|timestamp|content"; getPageWithCaching(url, doneDiff, navpop); return true; }; if (navpop.visible || !getValueOf("popupLazyDownloads")) { go(); } else { navpop.addHook(go, "unhide", "before", "DOWNLOAD_DIFFS"); } }); }); } function addReviewLink(navpop, target) { if (!pg.user.canReview) return; if (navpop.diffData.newRev.revid <= navpop.diffData.oldRev.revid) return; var api = new mw.Api({ ajax: { headers: { "Api-User-Agent": pg.misc.userAgent } } }); var params = { action: "query", prop: "info|flagged", revids: navpop.diffData.oldRev.revid, formatversion: 2 }; api.get(params).then(function(data) { var stable_revid = data.query.pages[0].flagged && data.query.pages[0].flagged.stable_revid || 0; if (stable_revid == navpop.diffData.oldRev.revid) { var a = document.createElement("a"); a.innerHTML = popupString("mark patrolled"); a.title = popupString("markpatrolledHint"); a.onclick = function() { var params = { action: "review", revid: navpop.diffData.newRev.revid, comment: tprintf("defaultpopupReviewedSummary", [navpop.diffData.oldRev.revid, navpop.diffData.newRev.revid]) }; api.postWithToken("csrf", params).done(function() { a.style.display = "none"; }).fail(function() { alert(popupString("Could not marked this edit as patrolled")); }); }; setPopupHTML(a, target, navpop.idNumber, null, true); } }); } function doneDiff(download) { if (!download.owner || !download.owner.diffData) { return; } var navpop = download.owner; completedNavpopTask(navpop); var pages, revisions = []; try { pages = getJsObj(download.data).query.pages; for (var i = 0; i < pages.length; i++) { revisions = revisions.concat(pages[i].revisions); } for (i = 0; i < revisions.length; i++) { if (revisions[i].revid == navpop.diffData.oldRev.revid) { navpop.diffData.oldRev.revision = revisions[i]; } else if (revisions[i].revid == navpop.diffData.newRev.revid) { navpop.diffData.newRev.revision = revisions[i]; } } } catch (someError) { errlog("Could not get diff"); } insertDiff(navpop); } function rmBoringLines(a, b, context) { if (typeof context == "undefined") { context = 2; } var aa = [], aaa = []; var bb = [], bbb = []; var i, j; for (i = 0; i < a.length; ++i) { if (!a[i].paired) { aa[i] = 1; } else if (countCrossings(b, a, i, true)) { aa[i] = 1; bb[a[i].row] = 1; } } for (i = 0; i < b.length; ++i) { if (bb[i] == 1) { continue; } if (!b[i].paired) { bb[i] = 1; } } for (i = 0; i < b.length; ++i) { if (bb[i] == 1) { for (j = Math.max(0, i - context); j < Math.min(b.length, i + context); ++j) { if (!bb[j]) { bb[j] = 1; aa[b[j].row] = .5; } } } } for (i = 0; i < a.length; ++i) { if (aa[i] == 1) { for (j = Math.max(0, i - context); j < Math.min(a.length, i + context); ++j) { if (!aa[j]) { aa[j] = 1; bb[a[j].row] = .5; } } } } for (i = 0; i < bb.length; ++i) { if (bb[i] > 0) { if (b[i].paired) { bbb.push(b[i].text); } else { bbb.push(b[i]); } } } for (i = 0; i < aa.length; ++i) { if (aa[i] > 0) { if (a[i].paired) { aaa.push(a[i].text); } else { aaa.push(a[i]); } } } return { a: aaa, b: bbb }; } function stripOuterCommonLines(a, b, context) { var i = 0; while (i < a.length && i < b.length && a[i] == b[i]) { ++i; } var j = a.length - 1; var k = b.length - 1; while (j >= 0 && k >= 0 && a[j] == b[k]) { --j; --k; } return { a: a.slice(Math.max(0, i - 1 - context), Math.min(a.length + 1, j + context + 1)), b: b.slice(Math.max(0, i - 1 - context), Math.min(b.length + 1, k + context + 1)) }; } function insertDiff(navpop) { var oldlines = navpop.diffData.oldRev.revision.content.split("\n"); var newlines = navpop.diffData.newRev.revision.content.split("\n"); var inner = stripOuterCommonLines(oldlines, newlines, getValueOf("popupDiffContextLines")); oldlines = inner.a; newlines = inner.b; var truncated = false; getValueOf("popupDiffMaxLines"); if (oldlines.length > pg.option.popupDiffMaxLines || newlines.length > pg.option.popupDiffMaxLines) { truncated = true; inner = stripOuterCommonLines(oldlines.slice(0, pg.option.popupDiffMaxLines), newlines.slice(0, pg.option.popupDiffMaxLines), pg.option.popupDiffContextLines); oldlines = inner.a; newlines = inner.b; } var lineDiff = diff(oldlines, newlines); var lines2 = rmBoringLines(lineDiff.o, lineDiff.n); var oldlines2 = lines2.a; var newlines2 = lines2.b; var simpleSplit = !String.prototype.parenSplit.isNative; var html = "<hr />"; if (getValueOf("popupDiffDates")) { html += diffDatesTable(navpop); html += "<hr />"; } html += shortenDiffString(diffString(oldlines2.join("\n"), newlines2.join("\n"), simpleSplit), getValueOf("popupDiffContextCharacters")).join("<hr />"); setPopupTipsAndHTML(html.split("\n").join("<br>") + (truncated ? "<hr /><b>" + popupString("Diff truncated for performance reasons") + "</b>" : ""), "popupPreview", navpop.idNumber); } function diffDatesTable(navpop) { var html = '<table class="popup_diff_dates">'; html += diffDatesTableRow(navpop.diffData.newRev.revision, tprintf("New revision")); html += diffDatesTableRow(navpop.diffData.oldRev.revision, tprintf("Old revision")); html += "</table>"; return html; } function diffDatesTableRow(revision, label) { var txt = ""; var lastModifiedDate = new Date(revision.timestamp); var datePrint = getValueOf("popupDiffDatePrinter"); if (typeof lastModifiedDate[datePrint] == "function") { var d2 = adjustDate(lastModifiedDate, getTimeOffset()); txt = dayFormat(d2, true) + " " + timeFormat(d2, true); } else { txt = tprintf("Invalid %s %s", ["popupDiffDatePrinter", datePrint]); } var revlink = generalLink({ url: mw.config.get("wgScript") + "?oldid=" + revision.revid, text: label, title: label }); return simplePrintf("<tr><td>%s</td><td>%s</td></tr>", [revlink, txt]); } function titledDiffLink(l) { return titledWikiLink({ article: l.article, action: l.to + "&oldid=" + l.from, newWin: l.newWin, noPopup: l.noPopup, text: l.text, title: l.title, actionName: "diff" }); } function wikiLink(l) { if (!(typeof l.article == typeof {} && typeof l.action == typeof "" && typeof l.text == typeof "")) return null; if (typeof l.oldid == "undefined") { l.oldid = null; } var savedOldid = l.oldid; if (!/^(edit|view|revert|render)$|^raw/.test(l.action)) { l.oldid = null; } var hint = popupString(l.action + "Hint"); var oldidData = [l.oldid, safeDecodeURI(l.article)]; var revisionString = tprintf("revision %s of %s", oldidData); log("revisionString=" + revisionString); switch (l.action) { case "edit§ion=new": hint = popupString("newSectionHint"); break; case "edit&undo=": if (l.diff && l.diff != "prev" && savedOldid) { l.action += l.diff + "&undoafter=" + savedOldid; } else if (savedOldid) { l.action += savedOldid; } hint = popupString("undoHint"); break; case "raw&ctype=text/css": hint = popupString("rawHint"); break; case "revert": var p = parseParams(pg.current.link.href); l.action = "edit&autoclick=wpSave&actoken=" + autoClickToken() + "&autoimpl=" + popupString("autoedit_version") + "&autosummary=" + revertSummary(l.oldid, p.diff); if (p.diff == "prev") { l.action += "&direction=prev"; revisionString = tprintf("the revision prior to revision %s of %s", oldidData); } if (getValueOf("popupRevertSummaryPrompt")) { l.action += "&autosummaryprompt=true"; } if (getValueOf("popupMinorReverts")) { l.action += "&autominor=true"; } log("revisionString is now " + revisionString); break; case "nullEdit": l.action = "edit&autoclick=wpSave&actoken=" + autoClickToken() + "&autoimpl=" + popupString("autoedit_version") + "&autosummary=" + popupString("nullEditSummary"); break; case "historyfeed": l.action = "history&feed=rss"; break; case "markpatrolled": l.action = "markpatrolled&rcid=" + l.rcid; } if (hint) { if (l.oldid) { hint = simplePrintf(hint, [revisionString]); } else { hint = simplePrintf(hint, [safeDecodeURI(l.article)]); } } else { hint = safeDecodeURI(l.article + "&action=" + l.action) + l.oldid ? "&oldid=" + l.oldid : ""; } return titledWikiLink({ article: l.article, action: l.action, text: l.text, newWin: l.newWin, title: hint, oldid: l.oldid, noPopup: l.noPopup, onclick: l.onclick }); } function revertSummary(oldid, diff) { var ret = ""; if (diff == "prev") { ret = getValueOf("popupQueriedRevertToPreviousSummary"); } else { ret = getValueOf("popupQueriedRevertSummary"); } return ret + "&autorv=" + oldid; } function titledWikiLink(l) { if (typeof l.article == "undefined" || typeof l.action == "undefined") { errlog("got undefined article or action in titledWikiLink"); return null; } var base = pg.wiki.titlebase + l.article.urlString(); var url = base; if (typeof l.actionName == "undefined" || !l.actionName) { l.actionName = "action"; } if (l.action != "view") { url = base + "&" + l.actionName + "=" + l.action; } if (typeof l.oldid != "undefined" && l.oldid) { url += "&oldid=" + l.oldid; } var cssClass = pg.misc.defaultNavlinkClassname; if (typeof l.className != "undefined" && l.className) { cssClass = l.className; } return generalNavLink({ url: url, newWin: l.newWin, title: typeof l.title != "undefined" ? l.title : null, text: typeof l.text != "undefined" ? l.text : null, className: cssClass, noPopup: l.noPopup, onclick: l.onclick }); } pg.fn.getLastContrib = function getLastContrib(wikipage, newWin) { getHistoryInfo(wikipage, function(x) { processLastContribInfo(x, { page: wikipage, newWin: newWin }); }); }; function processLastContribInfo(info, stuff) { if (!info.edits || !info.edits.length) { alert("Popups: an odd thing happened. Please retry."); return; } if (!info.firstNewEditor) { alert(tprintf("Only found one editor: %s made %s edits", [info.edits[0].editor, info.edits.length])); return; } var newUrl = pg.wiki.titlebase + new Title(stuff.page).urlString() + "&diff=cur&oldid=" + info.firstNewEditor.oldid; displayUrl(newUrl, stuff.newWin); } pg.fn.getDiffSinceMyEdit = function getDiffSinceMyEdit(wikipage, newWin) { getHistoryInfo(wikipage, function(x) { processDiffSinceMyEdit(x, { page: wikipage, newWin: newWin }); }); }; function processDiffSinceMyEdit(info, stuff) { if (!info.edits || !info.edits.length) { alert("Popups: something fishy happened. Please try again."); return; } var friendlyName = stuff.page.split("_").join(" "); if (!info.myLastEdit) { alert(tprintf("Couldn't find an edit by %s\nin the last %s edits to\n%s", [info.userName, getValueOf("popupHistoryLimit"), friendlyName])); return; } if (info.myLastEdit.index === 0) { alert(tprintf("%s seems to be the last editor to the page %s", [info.userName, friendlyName])); return; } var newUrl = pg.wiki.titlebase + new Title(stuff.page).urlString() + "&diff=cur&oldid=" + info.myLastEdit.oldid; displayUrl(newUrl, stuff.newWin); } function displayUrl(url, newWin) { if (newWin) { window.open(url); } else { document.location = url; } } pg.fn.purgePopups = function purgePopups() { processAllPopups(true); setupCache(); pg.option = {}; abortAllDownloads(); }; function processAllPopups(nullify, banish) { for (var i = 0; pg.current.links && i < pg.current.links.length; ++i) { if (!pg.current.links[i].navpopup) { continue; } if (nullify || banish) pg.current.links[i].navpopup.banish(); pg.current.links[i].simpleNoMore = false; if (nullify) pg.current.links[i].navpopup = null; } } pg.fn.disablePopups = function disablePopups() { processAllPopups(false, true); setupTooltips(null, true); }; pg.fn.togglePreviews = function togglePreviews() { processAllPopups(true, true); pg.option.simplePopups = !pg.option.simplePopups; abortAllDownloads(); }; function magicWatchLink(l) { l.onclick = simplePrintf("pg.fn.modifyWatchlist('%s','%s');return false;", [l.article.toString(true).split("\\").join("\\\\").split("'").join("\\'"), this.id]); return wikiLink(l); } pg.fn.modifyWatchlist = function modifyWatchlist(title, action) { var reqData = { action: "watch", formatversion: 2, titles: title, uselang: mw.config.get("wgUserLanguage") }; if (action === "unwatch") reqData.unwatch = true; var api = new mw.Api({ ajax: { headers: { "Api-User-Agent": pg.misc.userAgent } } }); var mwTitle = mw.Title.newFromText(title); var messageName; if (mwTitle && mwTitle.getNamespaceId() > 0 && mwTitle.getNamespaceId() % 2 === 1) { messageName = action === "watch" ? "addedwatchtext-talk" : "removedwatchtext-talk"; } else { messageName = action === "watch" ? "addedwatchtext" : "removedwatchtext"; } $.when(api.postWithToken("watch", reqData), mw.loader.using(["mediawiki.api", "mediawiki.jqueryMsg"]).then(function() { return api.loadMessagesIfMissing([messageName]); })).done(function() { mw.notify(mw.message(messageName, title).parseDom()); }); }; function magicHistoryLink(l) { var jsUrl = "", title = "", onClick = ""; switch (l.id) { case "lastContrib": onClick = simplePrintf("pg.fn.getLastContrib('%s',%s)", [l.article.toString(true).split("\\").join("\\\\").split("'").join("\\'"), l.newWin]); title = popupString("lastContribHint"); break; case "sinceMe": onClick = simplePrintf("pg.fn.getDiffSinceMyEdit('%s',%s)", [l.article.toString(true).split("\\").join("\\\\").split("'").join("\\'"), l.newWin]); title = popupString("sinceMeHint"); break; } jsUrl = "javascript:" + onClick; onClick += ";return false;"; return generalNavLink({ url: jsUrl, newWin: false, title: title, text: l.text, noPopup: l.noPopup, onclick: onClick }); } function popupMenuLink(l) { var jsUrl = simplePrintf("javascript:pg.fn.%s()", [l.id]); var title = popupString(simplePrintf("%sHint", [l.id])); var onClick = simplePrintf("pg.fn.%s();return false;", [l.id]); return generalNavLink({ url: jsUrl, newWin: false, title: title, text: l.text, noPopup: l.noPopup, onclick: onClick }); } function specialLink(l) { if (typeof l.specialpage == "undefined" || !l.specialpage) return null; var base = pg.wiki.titlebase + mw.config.get("wgFormattedNamespaces")[pg.nsSpecialId] + ":" + l.specialpage; if (typeof l.sep == "undefined" || l.sep === null) l.sep = "&target="; var article = l.article.urlString({ keepSpaces: l.specialpage == "Search" }); var hint = popupString(l.specialpage + "Hint"); switch (l.specialpage) { case "Log": switch (l.sep) { case "&user=": hint = popupString("userLogHint"); break; case "&type=block&page=": hint = popupString("blockLogHint"); break; case "&page=": hint = popupString("pageLogHint"); break; case "&type=protect&page=": hint = popupString("protectLogHint"); break; case "&type=delete&page=": hint = popupString("deleteLogHint"); break; default: log("Unknown log type, sep=" + l.sep); hint = "Missing hint (FIXME)"; } break; case "PrefixIndex": article += "/"; break; } if (hint) hint = simplePrintf(hint, [safeDecodeURI(l.article)]); else hint = safeDecodeURI(l.specialpage + ":" + l.article); var url = base + l.sep + article; return generalNavLink({ url: url, title: hint, text: l.text, newWin: l.newWin, noPopup: l.noPopup }); } function generalLink(l) { if (typeof l.url == "undefined") return null; var url = l.url.split('"').join("%22"); var ret = '<a href="' + url + '"'; if (typeof l.title != "undefined" && l.title) { ret += ' title="' + pg.escapeQuotesHTML(l.title) + '"'; } if (typeof l.onclick != "undefined" && l.onclick) { ret += ' onclick="' + pg.escapeQuotesHTML(l.onclick) + '"'; } if (l.noPopup) { ret += " noPopup=1"; } var newWin; if (typeof l.newWin == "undefined" || l.newWin === null) { newWin = getValueOf("popupNewWindows"); } else { newWin = l.newWin; } if (newWin) { ret += ' target="_blank"'; } if (typeof l.className != "undefined" && l.className) { ret += ' class="' + l.className + '"'; } ret += ">"; if (typeof l.text == typeof "") { ret += l.text; } ret += "</a>"; return ret; } function appendParamsToLink(linkstr, params) { var sp = linkstr.parenSplit(RegExp('(href="[^"]+?)"', "i")); if (sp.length < 2) return null; var ret = sp.shift() + sp.shift(); ret += "&" + params + '"'; ret += sp.join(""); return ret; } function changeLinkTargetLink(x) { if (x.newTarget) { log("changeLinkTargetLink: newTarget=" + x.newTarget); } if (x.oldTarget !== decodeURIComponent(x.oldTarget)) { log("This might be an input problem: " + x.oldTarget); } var cA = mw.util.escapeRegExp(x.oldTarget); var chs = cA.charAt(0).toUpperCase(); chs = "[" + chs + chs.toLowerCase() + "]"; var currentArticleRegexBit = chs + cA.substring(1); currentArticleRegexBit = currentArticleRegexBit.split(RegExp("(?:[_ ]+|%20)", "g")).join("(?:[_ ]+|%20)").split("\\(").join("(?:%28|\\()").split("\\)").join("(?:%29|\\))"); currentArticleRegexBit = "\\s*(" + currentArticleRegexBit + "(?:#[^\\[\\|]*)?)\\s*"; var title = x.title || mw.config.get("wgPageName").split("_").join(" "); var lk = titledWikiLink({ article: new Title(title), newWin: x.newWin, action: "edit", text: x.text, title: x.hint, className: "popup_change_title_link" }); var cmd = ""; if (x.newTarget) { var t = x.newTarget; var s = mw.util.escapeRegExp(x.newTarget); if (x.alsoChangeLabel) { cmd += "s~\\[\\[" + currentArticleRegexBit + "\\]\\]~[[" + t + "]]~g;"; cmd += "s~\\[\\[" + currentArticleRegexBit + "[|]~[[" + t + "|~g;"; cmd += "s~\\[\\[" + s + "\\|" + s + "\\]\\]~[[" + t + "]]~g"; } else { cmd += "s~\\[\\[" + currentArticleRegexBit + "\\]\\]~[[" + t + "|$1]]~g;"; cmd += "s~\\[\\[" + currentArticleRegexBit + "[|]~[[" + t + "|~g;"; cmd += "s~\\[\\[" + s + "\\|" + s + "\\]\\]~[[" + t + "]]~g"; } } else { cmd += "s~\\[\\[" + currentArticleRegexBit + "\\]\\]~$1~g;"; cmd += "s~\\[\\[" + currentArticleRegexBit + "[|](.*?)\\]\\]~$2~g"; } cmd = "autoedit=" + encodeURIComponent(cmd); cmd += "&autoclick=" + encodeURIComponent(x.clickButton) + "&actoken=" + encodeURIComponent(autoClickToken()); cmd += x.minor === null ? "" : "&autominor=" + encodeURIComponent(x.minor); cmd += x.watch === null ? "" : "&autowatch=" + encodeURIComponent(x.watch); cmd += "&autosummary=" + encodeURIComponent(x.summary); cmd += "&autoimpl=" + encodeURIComponent(popupString("autoedit_version")); return appendParamsToLink(lk, cmd); } function redirLink(redirMatch, article) { var ret = ""; if (getValueOf("popupAppendRedirNavLinks") && getValueOf("popupNavLinks")) { ret += "<hr />"; if (getValueOf("popupFixRedirs") && typeof autoEdit != "undefined" && autoEdit) { ret += popupString("Redirects to: (Fix "); log("redirLink: newTarget=" + redirMatch); ret += addPopupShortcut(changeLinkTargetLink({ newTarget: redirMatch, text: popupString("target"), hint: popupString("Fix this redirect, changing just the link target"), summary: simplePrintf(getValueOf("popupFixRedirsSummary"), [article.toString(), redirMatch]), oldTarget: article.toString(), clickButton: getValueOf("popupRedirAutoClick"), minor: true, watch: getValueOf("popupWatchRedirredPages") }), "R"); ret += popupString(" or "); ret += addPopupShortcut(changeLinkTargetLink({ newTarget: redirMatch, text: popupString("target & label"), hint: popupString("Fix this redirect, changing the link target and label"), summary: simplePrintf(getValueOf("popupFixRedirsSummary"), [article.toString(), redirMatch]), oldTarget: article.toString(), clickButton: getValueOf("popupRedirAutoClick"), minor: true, watch: getValueOf("popupWatchRedirredPages"), alsoChangeLabel: true }), "R"); ret += popupString(")"); } else ret += popupString("Redirects") + popupString(" to "); return ret; } else return "<br> " + popupString("Redirects") + popupString(" to ") + titledWikiLink({ article: new Title().fromWikiText(redirMatch), action: "view", text: safeDecodeURI(redirMatch), title: popupString("Bypass redirect") }); } function arinLink(l) { if (!saneLinkCheck(l)) { return null; } if (!l.article.isIpUser() || !pg.wiki.wikimedia) return null; var uN = l.article.userName(); return generalNavLink({ url: "http://ws.arin.net/cgi-bin/whois.pl?queryinput=" + encodeURIComponent(uN), newWin: l.newWin, title: tprintf("Look up %s in ARIN whois database", [uN]), text: l.text, noPopup: 1 }); } function toolDbName(cookieStyle) { var ret = mw.config.get("wgDBname"); if (!cookieStyle) { ret += "_p"; } return ret; } function saneLinkCheck(l) { if (typeof l.article != typeof {} || typeof l.text != typeof "") { return false; } return true; } function editCounterLink(l) { if (!saneLinkCheck(l)) return null; if (!pg.wiki.wikimedia) return null; var uN = l.article.userName(); var tool = getValueOf("popupEditCounterTool"); var url; var defaultToolUrl = "//tools.wmflabs.org/supercount/index.php?user=$1&project=$2.$3"; switch (tool) { case "custom": url = simplePrintf(getValueOf("popupEditCounterUrl"), [encodeURIComponent(uN), toolDbName()]); break; case "soxred": case "kate": case "interiot": case "supercount": default: var theWiki = pg.wiki.hostname.split("."); url = simplePrintf(defaultToolUrl, [encodeURIComponent(uN), theWiki[0], theWiki[1]]); } return generalNavLink({ url: url, title: tprintf("editCounterLinkHint", [uN]), newWin: l.newWin, text: l.text, noPopup: 1 }); } function globalSearchLink(l) { if (!saneLinkCheck(l)) return null; var base = "http://vs.aka-online.de/cgi-bin/globalwpsearch.pl?timeout=120&search="; var article = l.article.urlString({ keepSpaces: true }); return generalNavLink({ url: base + article, newWin: l.newWin, title: tprintf("globalSearchHint", [safeDecodeURI(l.article)]), text: l.text, noPopup: 1 }); } function googleLink(l) { if (!saneLinkCheck(l)) return null; var base = "https://www.google.com/search?q="; var article = l.article.urlString({ keepSpaces: true }); return generalNavLink({ url: base + "%22" + article + "%22", newWin: l.newWin, title: tprintf("googleSearchHint", [safeDecodeURI(l.article)]), text: l.text, noPopup: 1 }); } function editorListLink(l) { if (!saneLinkCheck(l)) return null; var article = l.article.articleFromTalkPage() || l.article; var url = "https://xtools.wmflabs.org/articleinfo/" + encodeURI(pg.wiki.hostname) + "/" + article.urlString() + "?uselang=" + mw.config.get("wgUserLanguage"); return generalNavLink({ url: url, title: tprintf("editorListHint", [article]), newWin: l.newWin, text: l.text, noPopup: 1 }); } function generalNavLink(l) { l.className = l.className === null ? "popupNavLink" : l.className; return generalLink(l); } function getHistoryInfo(wikipage, whatNext) { log("getHistoryInfo"); getHistory(wikipage, whatNext ? function(d) { whatNext(processHistory(d)); } : processHistory); } function getHistory(wikipage, onComplete) { log("getHistory"); var url = pg.wiki.apiwikibase + "?format=json&formatversion=2&action=query&prop=revisions&titles=" + new Title(wikipage).urlString() + "&rvlimit=" + getValueOf("popupHistoryLimit"); log("getHistory: url=" + url); return startDownload(url, pg.idNumber + "history", onComplete); } function processHistory(download) { var jsobj = getJsObj(download.data); try { var revisions = anyChild(jsobj.query.pages).revisions; var edits = []; for (var i = 0; i < revisions.length; ++i) { edits.push({ oldid: revisions[i].revid, editor: revisions[i].user }); } log("processed " + edits.length + " edits"); return finishProcessHistory(edits, mw.config.get("wgUserName")); } catch (someError) { log("Something went wrong with JSON business"); return finishProcessHistory([]); } } function finishProcessHistory(edits, userName) { var histInfo = {}; histInfo.edits = edits; histInfo.userName = userName; for (var i = 0; i < edits.length; ++i) { if (typeof histInfo.myLastEdit === "undefined" && userName && edits[i].editor == userName) { histInfo.myLastEdit = { index: i, oldid: edits[i].oldid, previd: i === 0 ? null : edits[i - 1].oldid }; } if (typeof histInfo.firstNewEditor === "undefined" && edits[i].editor != edits[0].editor) { histInfo.firstNewEditor = { index: i, oldid: edits[i].oldid, previd: i === 0 ? null : edits[i - 1].oldid }; } } return histInfo; } function defaultize(x) { if (pg.option[x] === null || typeof pg.option[x] == "undefined") { if (typeof window[x] != "undefined") pg.option[x] = window[x]; else pg.option[x] = pg.optionDefault[x]; } } function newOption(x, def) { pg.optionDefault[x] = def; } function setDefault(x, def) { return newOption(x, def); } function getValueOf(varName) { defaultize(varName); return pg.option[varName]; } function useDefaultOptions() { for (var p in pg.optionDefault) { pg.option[p] = pg.optionDefault[p]; if (typeof window[p] != "undefined") { delete window[p]; } } } function setOptions() { var userIsSysop = false; if (mw.config.get("wgUserGroups")) { for (var g = 0; g < mw.config.get("wgUserGroups").length; ++g) { if (mw.config.get("wgUserGroups")[g] == "sysop") userIsSysop = true; } } newOption("popupDelay", .5); newOption("popupHideDelay", .5); newOption("simplePopups", false); newOption("popupStructure", "shortmenus"); newOption("popupActionsMenu", true); newOption("popupSetupMenu", true); newOption("popupAdminLinks", userIsSysop); newOption("popupShortcutKeys", false); newOption("popupHistoricalLinks", true); newOption("popupOnlyArticleLinks", true); newOption("removeTitles", true); newOption("popupMaxWidth", 350); newOption("popupSimplifyMainLink", true); newOption("popupAppendRedirNavLinks", true); newOption("popupTocLinks", false); newOption("popupSubpopups", true); newOption("popupDragHandle", false); newOption("popupLazyPreviews", true); newOption("popupLazyDownloads", true); newOption("popupAllDabsStubs", false); newOption("popupDebugging", false); newOption("popupActiveNavlinks", true); newOption("popupModifier", false); newOption("popupModifierAction", "enable"); newOption("popupDraggable", true); newOption("popupReview", false); newOption("popupImages", true); newOption("imagePopupsForImages", true); newOption("popupNeverGetThumbs", false); newOption("popupThumbAction", "imagepage"); newOption("popupImageSize", 60); newOption("popupImageSizeLarge", 200); newOption("popupFixRedirs", false); newOption("popupRedirAutoClick", "wpDiff"); newOption("popupFixDabs", false); newOption("popupDabsAutoClick", "wpDiff"); newOption("popupRevertSummaryPrompt", false); newOption("popupMinorReverts", false); newOption("popupRedlinkRemoval", false); newOption("popupRedlinkAutoClick", "wpDiff"); newOption("popupWatchDisambiggedPages", null); newOption("popupWatchRedirredPages", null); newOption("popupDabWiktionary", "last"); newOption("popupNavLinks", true); newOption("popupNavLinkSeparator", " ⋅ "); newOption("popupLastEditLink", true); newOption("popupEditCounterTool", "supercount"); newOption("popupEditCounterUrl", ""); newOption("popupPreviews", true); newOption("popupSummaryData", true); newOption("popupMaxPreviewSentences", 5); newOption("popupMaxPreviewCharacters", 600); newOption("popupLastModified", true); newOption("popupPreviewKillTemplates", true); newOption("popupPreviewRawTemplates", true); newOption("popupPreviewFirstParOnly", true); newOption("popupPreviewCutHeadings", true); newOption("popupPreviewButton", false); newOption("popupPreviewButtonEvent", "click"); newOption("popupPreviewDiffs", true); newOption("popupDiffMaxLines", 100); newOption("popupDiffContextLines", 2); newOption("popupDiffContextCharacters", 40); newOption("popupDiffDates", true); newOption("popupDiffDatePrinter", "toLocaleString"); newOption("popupReviewedSummary", popupString("defaultpopupReviewedSummary")); newOption("popupFixDabsSummary", popupString("defaultpopupFixDabsSummary")); newOption("popupExtendedRevertSummary", popupString("defaultpopupExtendedRevertSummary")); newOption("popupRevertSummary", popupString("defaultpopupRevertSummary")); newOption("popupRevertToPreviousSummary", popupString("defaultpopupRevertToPreviousSummary")); newOption("popupQueriedRevertSummary", popupString("defaultpopupQueriedRevertSummary")); newOption("popupQueriedRevertToPreviousSummary", popupString("defaultpopupQueriedRevertToPreviousSummary")); newOption("popupFixRedirsSummary", popupString("defaultpopupFixRedirsSummary")); newOption("popupRedlinkSummary", popupString("defaultpopupRedlinkSummary")); newOption("popupRmDabLinkSummary", popupString("defaultpopupRmDabLinkSummary")); newOption("popupHistoryLimit", 50); newOption("popupFilters", [popupFilterStubDetect, popupFilterDisambigDetect, popupFilterPageSize, popupFilterCountLinks, popupFilterCountImages, popupFilterCountCategories, popupFilterLastModified]); newOption("extraPopupFilters", []); newOption("popupOnEditSelection", "cursor"); newOption("popupPreviewHistory", true); newOption("popupImageLinks", true); newOption("popupCategoryMembers", true); newOption("popupUserInfo", true); newOption("popupHistoryPreviewLimit", 25); newOption("popupContribsPreviewLimit", 25); newOption("popupRevDelUrl", "//en.wikipedia.org/wiki/Wikipedia:Revision_deletion"); newOption("popupShowGender", true); newOption("popupNewWindows", false); newOption("popupLinksNewWindow", { lastContrib: true, sinceMe: true }); newOption("popupDabRegexp", "(\\{\\{\\s*disambig(?!uation needed)|disambig(uation|)\\s*\\}\\}|disamb\\s*\\}\\}|dab\\s*\\}\\})|\\{\\{\\s*(((geo|hn|road?|school|number)dis)|[234][lc][acw]|(road|ship)index)(\\s*[|][^}]*)?\\s*[}][}]|is a .*disambiguation.*page"); newOption("popupAnchorRegexp", "anchors?"); newOption("popupStubRegexp", "(sect)?stub[}][}]|This .*-related article is a .*stub"); newOption("popupImageVarsRegexp", "image|image_(?:file|skyline|name|flag|seal)|cover|badge|logo"); } pg.string = { article: "article", category: "category", categories: "categories", image: "image", images: "images", stub: "stub", "section stub": "section stub", "Empty page": "Empty page", kB: "kB", bytes: "bytes", day: "day", days: "days", hour: "hour", hours: "hours", minute: "minute", minutes: "minutes", second: "second", seconds: "seconds", week: "week", weeks: "weeks", search: "search", SearchHint: "Find English Wikipedia articles containing %s", web: "web", global: "global", globalSearchHint: "Search across Wikipedias in different languages for %s", googleSearchHint: "Google for %s", actions: "actions", popupsMenu: "popups", togglePreviewsHint: "Toggle preview generation in popups on this page", "enable previews": "enable previews", "disable previews": "disable previews", "toggle previews": "toggle previews", "show preview": "show preview", reset: "reset", "more...": "more...", disable: "disable popups", disablePopupsHint: "Disable popups on this page. Reload page to re-enable.", historyfeedHint: "RSS feed of recent changes to this page", purgePopupsHint: "Reset popups, clearing all cached popup data.", PopupsHint: "Reset popups, clearing all cached popup data.", spacebar: "space", view: "view", "view article": "view article", viewHint: "Go to %s", talk: "talk", "talk page": "talk page", "this revision": "this revision", "revision %s of %s": "revision %s of %s", "Revision %s of %s": "Revision %s of %s", "the revision prior to revision %s of %s": "the revision prior to revision %s of %s", "Toggle image size": "Click to toggle image size", del: "del", "delete": "delete", deleteHint: "Delete %s", undeleteShort: "un", UndeleteHint: "Show the deletion history for %s", protect: "protect", protectHint: "Restrict editing rights to %s", unprotectShort: "un", unprotectHint: "Allow %s to be edited by anyone again", "send thanks": "send thanks", ThanksHint: "Send a thank you notification to this user", move: "move", "move page": "move page", MovepageHint: "Change the title of %s", edit: "edit", "edit article": "edit article", editHint: "Change the content of %s", "edit talk": "edit talk", "new": "new", "new topic": "new topic", newSectionHint: "Start a new section on %s", "null edit": "null edit", nullEditHint: "Submit an edit to %s, making no changes ", hist: "hist", history: "history", historyHint: "List the changes made to %s", last: "prev", lastEdit: "lastEdit", "mark patrolled": "mark patrolled", markpatrolledHint: "Mark this edit as patrolled", "Could not marked this edit as patrolled": "Could not marked this edit as patrolled", "show last edit": "most recent edit", "Show the last edit": "Show the effects of the most recent change", lastContrib: "lastContrib", "last set of edits": "latest edits", lastContribHint: "Show the net effect of changes made by the last editor", cur: "cur", diffCur: "diffCur", "Show changes since revision %s": "Show changes since revision %s", "%s old": "%s old", oldEdit: "oldEdit", purge: "purge", purgeHint: "Demand a fresh copy of %s", raw: "source", rawHint: "Download the source of %s", render: "simple", renderHint: "Show a plain HTML version of %s", "Show the edit made to get revision": "Show the edit made to get revision", sinceMe: "sinceMe", "changes since mine": "diff my edit", sinceMeHint: "Show changes since my last edit", "Couldn't find an edit by %s\nin the last %s edits to\n%s": "Couldn't find an edit by %s\nin the last %s edits to\n%s", eds: "eds", editors: "editors", editorListHint: "List the users who have edited %s", related: "related", relatedChanges: "relatedChanges", "related changes": "related changes", RecentchangeslinkedHint: "Show changes in articles related to %s", editOld: "editOld", rv: "rv", revert: "revert", revertHint: "Revert to %s", defaultpopupReviewedSummary: "Accepted by reviewing the [[Special:diff/%s/%s|difference]] between this version and previously accepted version using [[:en:Wikipedia:Tools/Navigation_popups|popups]]", defaultpopupRedlinkSummary: "Removing link to empty page [[%s]] using [[:en:Wikipedia:Tools/Navigation_popups|popups]]", defaultpopupFixDabsSummary: "Disambiguate [[%s]] to [[%s]] using [[:en:Wikipedia:Tools/Navigation_popups|popups]]", defaultpopupFixRedirsSummary: "Redirect bypass from [[%s]] to [[%s]] using [[:en:Wikipedia:Tools/Navigation_popups|popups]]", defaultpopupExtendedRevertSummary: "Revert to revision dated %s by %s, oldid %s using [[:en:Wikipedia:Tools/Navigation_popups|popups]]", defaultpopupRevertToPreviousSummary: "Revert to the revision prior to revision %s using [[:en:Wikipedia:Tools/Navigation_popups|popups]]", defaultpopupRevertSummary: "Revert to revision %s using [[:en:Wikipedia:Tools/Navigation_popups|popups]]", defaultpopupQueriedRevertToPreviousSummary: "Revert to the revision prior to revision $1 dated $2 by $3 using [[:en:Wikipedia:Tools/Navigation_popups|popups]]", defaultpopupQueriedRevertSummary: "Revert to revision $1 dated $2 by $3 using [[:en:Wikipedia:Tools/Navigation_popups|popups]]", defaultpopupRmDabLinkSummary: "Remove link to dab page [[%s]] using [[:en:Wikipedia:Tools/Navigation_popups|popups]]", Redirects: "Redirects", " to ": " to ", "Bypass redirect": "Bypass redirect", "Fix this redirect": "Fix this redirect", disambig: "disambig", disambigHint: "Disambiguate this link to [[%s]]", "Click to disambiguate this link to:": "Click to disambiguate this link to:", "remove this link": "remove this link", "remove all links to this page from this article": "remove all links to this page from this article", "remove all links to this disambig page from this article": "remove all links to this disambig page from this article", mainlink: "mainlink", wikiLink: "wikiLink", wikiLinks: "wikiLinks", "links here": "links here", whatLinksHere: "whatLinksHere", "what links here": "what links here", WhatlinkshereHint: "List the pages that are hyperlinked to %s", unwatchShort: "un", watchThingy: "watch", watchHint: "Add %s to my watchlist", unwatchHint: "Remove %s from my watchlist", "Only found one editor: %s made %s edits": "Only found one editor: %s made %s edits", "%s seems to be the last editor to the page %s": "%s seems to be the last editor to the page %s", rss: "rss", "Diff truncated for performance reasons": "Diff truncated for performance reasons", "Old revision": "Old revision", "New revision": "New revision", "Something went wrong :-(": "Something went wrong :-(", "Empty revision, maybe non-existent": "Empty revision, maybe non-existent", "Unknown date": "Unknown date", "Empty category": "Empty category", "Category members (%s shown)": "Category members (%s shown)", "No image links found": "No image links found", "File links": "File links", "No image found": "No image found", "Image from Commons": "Image from Commons", "Description page": "Description page", "Alt text:": "Alt text:", revdel: "Hidden revision", user: "user", "user page": "user page", "user talk": "user talk", "edit user talk": "edit user talk", "leave comment": "leave comment", email: "email", "email user": "email user", EmailuserHint: "Send an email to %s", space: "space", PrefixIndexHint: "Show pages in the userspace of %s", count: "count", "edit counter": "edit counter", editCounterLinkHint: "Count the contributions made by %s", contribs: "contribs", contributions: "contributions", deletedContribs: "deleted contributions", DeletedcontributionsHint: "List deleted edits made by %s", ContributionsHint: "List the contributions made by %s", log: "log", "user log": "user log", userLogHint: "Show %s's user log", arin: "ARIN lookup", "Look up %s in ARIN whois database": "Look up %s in the ARIN whois database", unblockShort: "un", block: "block", "block user": "block user", IpblocklistHint: "Unblock %s", BlockipHint: "Prevent %s from editing", "block log": "block log", blockLogHint: "Show the block log for %s", protectLogHint: "Show the protection log for %s", pageLogHint: "Show the page log for %s", deleteLogHint: "Show the deletion log for %s", "Invalid %s %s": "The option %s is invalid: %s", "No backlinks found": "No backlinks found", " and more": " and more", undo: "undo", undoHint: "undo this edit", "Download preview data": "Download preview data", "Invalid or IP user": "Invalid or IP user", "Not a registered username": "Not a registered username", BLOCKED: "BLOCKED", " edits since: ": " edits since: ", "last edit on ": "last edit on ", "Enter a non-empty edit summary or press cancel to abort": "Enter a non-empty edit summary or press cancel to abort", "Failed to get revision information, please edit manually.\n\n": "Failed to get revision information, please edit manually.\n\n", "The %s button has been automatically clicked. Please wait for the next page to load.": "The %s button has been automatically clicked. Please wait for the next page to load.", "Could not find button %s. Please check the settings in your javascript file.": "Could not find button %s. Please check the settings in your javascript file.", "Open full-size image": "Open full-size image", zxy: "zxy", autoedit_version: "np20140416" }; var willBeReplaces = []; class PopupNoTranslation extends Array { constructor() { super(); let s; try { s = JSON.parse(localStorage.getItem("popupNoTranslation")); if (!Array.isArray(s)) { s = []; } } catch (_) { s = []; } this._push(...s); } _push(...a) { const returnValue = Array.prototype.push.bind(this)(...a.filter(n => !n.includes("&autoimpl=np20140416&actoken=") && !n.endsWith("Hint") && !willBeReplaces.includes(n))); localStorage.setItem("popupNoTranslation", JSON.stringify(this)); return returnValue; } push(str) { const hasDefault = !!pg.string[str]; if (this.includes(str)) { return hasDefault ? pg.string[str] : str; } this._push(str); if (mw.util.getParamValue("debug") === "1") { console.groupCollapsed("Gadget Popups", "can't find the translation of", str, hasDefault ? ", use the default text [" + pg.string[str] + "]." : ", and no default text found."); console.info(new Error().stack); console.groupEnd(); } return hasDefault ? pg.string[str] : str; } } function popupString(str) { if (!window.popupNoTranslation) { window.popupNoTranslation = new PopupNoTranslation(); } if (typeof popupStrings != "undefined" && popupStrings && popupStrings[str]) { return popupStrings[str]; } return window.popupNoTranslation.push(str); } function tprintf(str, subs) { if (typeof subs != typeof []) { subs = [subs]; } return simplePrintf(popupString(str), subs); } if (document.readyState == "complete") autoEdit(); else $(window).on("load", autoEdit); (function() { var once = true; function dynamicContentHandler($content) { if ($content.attr("id") == "mw-content-text") { if (once) { once = false; return; } } function registerHooksForVisibleNavpops() { for (var i = 0; pg.current.links && i < pg.current.links.length; ++i) { var navpop = pg.current.links[i].navpopup; if (!navpop || !navpop.isVisible()) { continue; } Navpopup.tracker.addHook(posCheckerHook(navpop)); } } function doIt() { registerHooksForVisibleNavpops(); $content.each(function() { this.ranSetupTooltipsAlready = false; setupTooltips(this); }); } setupPopups(doIt); } mw.hook("wikipage.content").add(dynamicContentHandler); mw.hook("ext.echo.overlay.beforeShowingOverlay").add(function($overlay) { dynamicContentHandler($overlay.find(".mw-echo-state")); }); })(); });