MediaWiki:Gadget-TemplatePreloader.js
From Wikisource
Note - After saving, you may have to bypass your browser's cache to see the changes. Mozilla / Firefox / Safari: hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (Command-R on a Macintosh); Konqueror: click Reload or press F5; Opera: clear the cache in Tools → Preferences; Internet Explorer: hold Ctrl while clicking Refresh, or press Ctrl-F5.
/* Preload Template:Header when adding a new text */ /* For help, see '''Help:Header preloading script gadget''' */ function preloadHeaderTemplate() { var wpTextbox1 = document.getElementById("wpTextbox1") if (wpTextbox1.value == "") { //fill in header template var subpageDepth = 0 var isSubpage var pathToTOC = "" //typically "../" var subpageTitle var subpageTitleRegExp var rawBasePageRequest var tocPageTitle var beginningOfShortSectionTitle //for example, if tocPageTitle == "Democracy in America/Volume 2", then beginningOfShortSectionTitle == "Volume 2, " - this is used to determine the values for "previous" and "next" var rawTocPageRequest //table of contents page var rawTocPageWithoutHeader //title var wpTextbox1value = "{{header\n | title = " if (wgTitle.indexOf("/") != -1) //a slash could indicate that it's a subpage { rawBasePageRequest = new XMLHttpRequest() //determine where the base page name ends and where the subpage name begins for (var slashPosition = wgTitle.indexOf("/"); slashPosition != -1; slashPosition = wgTitle.indexOf("/", slashPosition + 1)) { rawBasePageRequest.open("GET", wgServer + wgScript + "?title=" + wgTitle.substr(0, slashPosition) + "&action=raw", false) rawBasePageRequest.send(null) if (rawBasePageRequest.responseText != "") //base page found { wpTextbox1value += "[[" //output however many "../" will take us to the base page for (var i = wgTitle.lastIndexOf("/"); i >= slashPosition; i = wgTitle.lastIndexOf("/", i - 1)) { wpTextbox1value += "../" subpageDepth += 1 } wpTextbox1value += "]]" isSubpage = true break } } //output if (isSubpage == false) //despite the slash in this page's title, no base page was found, so assume that this page is the base page (for example, "9/11 Commission Report") { wpTextbox1value += wgTitle } //round 2: find the table of contents page, not necessarily the same as the base page var slashPosition = wgTitle.lastIndexOf("/") if (subpageDepth > 1) { rawTocPageRequest = new XMLHttpRequest() for (; slashPosition != -1; slashPosition = wgTitle.lastIndexOf("/", slashPosition - 1)) { pathToTOC += "../" tocPageTitle = wgTitle.substr(0, slashPosition) //will be used later rawTocPageRequest.open("GET", wgServer + wgScript + "?title=" + tocPageTitle + "&action=raw", false) rawTocPageRequest.send(null) if (rawTocPageRequest.responseText != "") //TOC page found { break } } } else //if the depth is only 1 then the base page and the TOC page are the same { //set up variables without going through the whole loop pathToTOC = "../" tocPageTitle = wgTitle.substr(0, slashPosition) rawTocPageRequest = rawBasePageRequest } //for later subpageTitle = wgTitle.substr(slashPosition + 1) //subpageTitle is relative to the table of contents, not the base page var indexOfSlashInTocPageTitle = tocPageTitle.indexOf("/") if (indexOfSlashInTocPageTitle != -1) { beginningOfShortSectionTitle = tocPageTitle.substring(tocPageTitle.indexOf("/") + 1).replace(/\//g, ", ") + ", " //change / to , - better than doing nothing } else { beginningOfShortSectionTitle = "" } } else //definitely not a subpage { wpTextbox1value += wgTitle } //author wpTextbox1value += "\n | author = " if (isSubpage) { try { wpTextbox1value += /\{\{[\s]*[Hh]eader[2]?[\s]*[\s\S]*\|[\s]*author[\s]*\=([^\||\}\}]*)/.exec(rawTocPageRequest.responseText)[1].replace(/^\s+/,"").replace(/\s+$/,"") } catch (e) { //if there was an error, just leave the field blank } } //translator wpTextbox1value += "\n | translator = " if (isSubpage) { try { wpTextbox1value += /\{\{[\s]*[Hh]eader[2]?[\s]*[\s\S]*\|[\s]*translator[\s]*\=([^\||\}\}]*)/.exec(rawTocPageRequest.responseText)[1].replace(/^\s+/,"").replace(/\s+$/,"") } catch (e) { //if there was an error, just leave the field blank } } //section wpTextbox1value += "\n | section = " if (isSubpage) //only subpages have section titles { try { subpageTitleRegExp = subpageTitle.replace(/[ _]/, "[ _]") //subpageTitleRegExp will also be used later subpageTitleRegExp = "[" + subpageTitleRegExp[0].toUpperCase() + subpageTitleRegExp[0].toLowerCase() + "]" + subpageTitleRegExp.substr(1) //MediaWiki is not case-sensitive on the first letter wpTextbox1value += (new RegExp("\\[\\[/" + subpageTitleRegExp + "\\|(.*)\]\]")).exec(rawTocPageRequest.responseText)[1] } catch (e) { //if there was an error, fall back on just adding the section name wpTextbox1value += subpageTitle.replace(/\//g, ", ") } } //used for both previous page and next page determination var indexOfCurrentPageInTableOfContents = -1 //the -1 makes sure that if the value can't be found, "undefined" isn't used instead //previous wpTextbox1value += "\n | previous = " try { rawTocPageWithoutHeader = rawTocPageRequest.responseText.substring(/(\{\{[Hh]eader[2]?[^\}\}]*)/.exec(rawTocPageRequest.responseText)[1].length) //cut off the header before searching indexOfCurrentPageInTableOfContents = rawTocPageWithoutHeader.indexOf((new RegExp("\\[\\[/" + subpageTitleRegExp + "[\\||\\]\\]]")).exec(rawTocPageWithoutHeader)[0]) var indexOfTargetLink = rawTocPageWithoutHeader.lastIndexOf("[[/", indexOfCurrentPageInTableOfContents - 3) var previousPageTitle = /\[\[\/([^\||\]\]]*)/.exec(rawTocPageWithoutHeader.substring(indexOfTargetLink, indexOfCurrentPageInTableOfContents))[1] wpTextbox1value += "[[" + pathToTOC + previousPageTitle + "|" + beginningOfShortSectionTitle + previousPageTitle.replace(/\//g, ", ") + "]]" //change / to , - better than doing nothing } catch (e) { //if there was an error, just leave the field blank } //next wpTextbox1value += "\n | next = " try { if (indexOfCurrentPageInTableOfContents != -1) //if we don't know where we are in the list, do not wrap back to the beginning - strangely, an exception doesn't get thrown if I leave indexOfCurrentPageInTableOfContents alone, and the "next" algorithm jumped back to the beginning of the table of contents page { var indexOfTargetLink = rawTocPageWithoutHeader.indexOf("[[/", indexOfCurrentPageInTableOfContents + subpageTitle.length + 2) if (indexOfTargetLink != -1) //if we're at the end of the list, do not wrap back to the beginning { var nextPageTitle = /\[\[\/([^\||\]\]]*)/.exec(rawTocPageWithoutHeader.substring(indexOfTargetLink))[1] wpTextbox1value += "[[" + pathToTOC + nextPageTitle + "|" + beginningOfShortSectionTitle + nextPageTitle.replace(/\//g, ", ") + "]]" //change / to , - better than doing nothing } } } catch (e) { //if there was an error, just leave the field blank } wpTextbox1.value = wpTextbox1value + "\n | notes = \n}}\n\n" } } /* Preload Template:Textinfo when starting a discussion page */ function preloadTextinfoTemplate() { var wpTextbox1 = document.getElementById("wpTextbox1") if (wpTextbox1.value == "") { wpTextbox1.value = "{{textinfo\n | edition = \n | source = \n | contributors = \n | progress = \n | notes = \n | proofreaders = \n}}\n" } } /* Preload Template:Author when starting an author page */ function preloadAuthorTemplate() { var wpTextbox1 = document.getElementById("wpTextbox1") if (wpTextbox1.value == "") { wpTextbox1.value = "{{author\n | firstname = \n | lastname = \n | last_initial = \n | birthyear = \n | deathyear = \n | description = \n | image = \n | wikipedia_link = \n | wikiquote_link = \n | commons_link = \n}}\n\n==Works==\n\n" } } if (wgAction == "edit") { switch (wgNamespaceNumber) { case 0: //main addOnloadHook(preloadHeaderTemplate) break case 1: //Talk addOnloadHook(preloadTextinfoTemplate) break case 102: //Author addOnloadHook(preloadAuthorTemplate) } }