MediaWiki:Gadget-TemplatePreloader.js
From Wikisource
Note: After saving, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Konqueror: Click Reload or press F5
- Opera: Clear the cache in Tools → Preferences
/* 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 } // year (except on subpages) if( wgTitle.indexOf("/") == -1 ) { wpTextbox1value += "\n | year = "; } //notes 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 == "" && !document.URL.match('§ion=new') ) { wpTextbox1.value = "{" + "{textinfo\n | edition = \n | source = \n | contributors = \n | progress = \n | notes = \n | proofreaders = \n}}\n" } } // When creating an author page fill field. Always filled, lastname, // firstname, lastinitial, wikipedia, birth/year filled if an // article is available on wp:en. Try also to avoid duplicate author: // by creating a redirect if the wikipedia is non empty, its title // is different from the current Author:title and an Author:new_title // exists. function check_redirect(title, text_box) { var url = wgServer + wgScriptPath + "/api.php?format=xml&action=query&prop=info&titles=" + encodeURIComponent(title); var request = sajax_init_object(); request.open('GET', url, true); request.onreadystatechange = function () { if (request.readyState == 4) { var xml = request.responseXML; if (xml == null) return ; var page = xml.getElementsByTagName( "page" )[0]; if (page.getAttribute("missing") != "") text_box.value = '#REDIRECT [[' + title + ']]'; } }; request.send(null); } function author_fill_cb(data) { try { var wpTextbox1 = document.getElementById("wpTextbox1"); if (wpTextbox1 && !data.query.pages["-1"]) { for (var ids in data.query.pages) { wpTextbox1.value = wpTextbox1.value.replace(/( *\\| *wikipedia *= *)/, "$1" + data.query.pages[ids].title); var cats = data.query.pages[ids].categories; for (var i = 0; i < cats.length; ++i) { var m = cats[i].title.match(/Category:(\d+) deaths/); if (m) wpTextbox1.value = wpTextbox1.value.replace(/( *\\| *deathyear *= *)/, "$1" + m[1]); m = cats[i].title.match(/Category:(\d+) births/); if (m) wpTextbox1.value = wpTextbox1.value.replace(/( *\\| *birthyear *= *)/, "$1" + m[1]); } break; } // This can undo all the above works by preferring to create a redirect to an existing author: check_redirect('Author:' + data.query.pages[ids].title, wpTextbox1); } } catch (err) { } } function create_script_obj(url) { var scriptObj = document.createElement("script"); scriptObj.setAttribute("type", "text/javascript"); scriptObj.setAttribute("src", url); document.body.appendChild(scriptObj); } function split_title() { return wgTitle.replace(/ \(.*\)/, "").split(" "); } function get_special_word_pos(words) { var i; for (i = 0; i < words.length; ++i) { if (words[i] == 'van' || words[i] == 'von' || words[i] == 'le' || words[i] == 'de') { return i; } } return -1; } function get_first_name(words) { return words.slice(0, get_special_word_pos(words)).join(" "); } function get_last_name(words) { return words.slice(get_special_word_pos(words)).join(" "); } function get_last_initial(words) { // get_last_name() can't be used here, we want the last word or the next // word following a special word var lastname = words[words.length - 1]; var pos = get_special_word_pos(words); if (pos != -1 && pos < words.length - 1) lastname = words[pos + 1]; var last_initial = lastname.slice(0, 2); // O'Donnel --> Od if (lastname.length > 2 && last_initial.charAt(1) == "'") last_initial = last_initial.charAt(0) + lastname.charAt(2).toLowerCase(); return last_initial; } /* Preload Template:Author when starting an author page, derived from [[User:Remember the dot]] code */ function preloadAuthorTemplate() { var wpTextbox1 = document.getElementById("wpTextbox1") if (wpTextbox1.value != "") return; // try to figure out what value we can fill, broken in some case because // it's difficult to handle name like Tom Van Moore but Tom van Moore is // handled correctly. var words = split_title(); var lastname = get_last_name(words); var firstname = get_first_name(words); var last_initial = get_last_initial(words); wpTextbox1.value = "{" + "{author\n" + " | firstname = " + firstname + "\n" + " | lastname = " + lastname + "\n" + " | last_initial = " + last_initial + "\n" + " | birthyear = \n" + " | deathyear = \n" + " | description = \n" + " | image = \n" + " | wikipedia = \n" + " | wikiquote = \n" + " | commons = \n" + " | commonscat = \n" + "}}\n\n" + "==Works==\n\n"; // if (wgServer == "https://secure.wikimedia.org") // var base_url = "https://secure.wikimedia.org/wikipedia/en/w"; // else var base_url = "//en.wikipedia.org" + wgScriptPath; var url = base_url + "/api.php?format=json&redirects" + "&callback=author_fill_cb&action=query&prop=categories&cllimit=20&titles=" + encodeURIComponent(wgTitle); create_script_obj(url); } if (wgAction == "edit") { switch (wgNamespaceNumber) { case 0: //main addOnloadHook(preloadHeaderTemplate) break case 1: //Talk addOnloadHook(preloadTextinfoTemplate) break case 102: //Author addOnloadHook(preloadAuthorTemplate) } }