MediaWiki:Common.js: Difference between revisions
Jump to navigation
Jump to search
(final test, based on a proposed solution to this -- inserting Sysop.js code directly into Common.js; worth a try for informational purposes) |
(undone; it *did in fact work* after bypassing both local and server-side cache; I am still going to leave the Sysop.js code out of the whole process for now, but this is good to know) |
||
Line 23: | Line 23: | ||
* Description: Allows for sysop-specific Javascript at [[MediaWiki:Sysop.js]]. | * Description: Allows for sysop-specific Javascript at [[MediaWiki:Sysop.js]]. | ||
*/ | */ | ||
function sysopFunctions() { | /*function sysopFunctions() { | ||
if ( wgUserGroups && !window.disableSysopJS ) { | if ( wgUserGroups && !window.disableSysopJS ) { | ||
for ( var g = 0; g < wgUserGroups.length; ++g ) { | for ( var g = 0; g < wgUserGroups.length; ++g ) { | ||
if ( wgUserGroups[g] == "sysop" ) { | if ( wgUserGroups[g] == "sysop" ) { | ||
importScript("MediaWiki:Sysop.js"); | |||
break; | break; | ||
} | } | ||
} | } | ||
} | } | ||
} // this code is currently not working for an unknown reason, and it adds little value for us sysops anyway, so | }*/ // this attempt to import the Sysop.js code is currently not working for an unknown reason, although the code from the Sysop.js file can successfully be directly inserted here in place of the importScript command; it is currently my hypothesis that placing Sysop.js in the wrong namespace at first somehow threw off the server, and that, now that it's in the right place, it is still (for some reason) invisible to the software. In any case, WP's version of Sysop.js adds little value for us OG sysops anyway, so I have not inserted its code here. -- [[User_talk:Iritscen]] | ||
// addOnloadHook( sysopFunctions ); // be sure to uncomment this if restoring above code | |||
Revision as of 16:39, 8 December 2008
/* <pre><nowiki> */ //<source lang="javascript"> /* Import more specific scripts if necessary */ if (wgAction == "edit" || wgAction == "submit" || wgPageName == "Special:Upload") //scripts specific to editing pages { importScript("MediaWiki:Common.js/edit.js") } else if (wgPageName == "Special:Watchlist") //watchlist scripts { importScript("MediaWiki:Common.js/watchlist.js") } else if (wgPageName == "Special:Search") //scripts specific to Special:Search { importScript("MediaWiki:Common.js/search.js") } /** Sysop Javascript ******************************************************* * * Description: Allows for sysop-specific Javascript at [[MediaWiki:Sysop.js]]. */ /*function sysopFunctions() { if ( wgUserGroups && !window.disableSysopJS ) { for ( var g = 0; g < wgUserGroups.length; ++g ) { if ( wgUserGroups[g] == "sysop" ) { importScript("MediaWiki:Sysop.js"); break; } } } }*/ // this attempt to import the Sysop.js code is currently not working for an unknown reason, although the code from the Sysop.js file can successfully be directly inserted here in place of the importScript command; it is currently my hypothesis that placing Sysop.js in the wrong namespace at first somehow threw off the server, and that, now that it's in the right place, it is still (for some reason) invisible to the software. In any case, WP's version of Sysop.js adds little value for us OG sysops anyway, so I have not inserted its code here. -- [[User_talk:Iritscen]] // addOnloadHook( sysopFunctions ); // be sure to uncomment this if restoring above code /* Scripts specific to Internet Explorer */ if (navigator.appName == "Microsoft Internet Explorer") { /** Internet Explorer bug fix ************************************************** * * Description: Fixes IE horizontal scrollbar bug * Maintainers: [[User:Tom-]]? */ var oldWidth; var docEl = document.documentElement; function fixIEScroll() { if (!oldWidth || docEl.clientWidth > oldWidth) doFixIEScroll(); else setTimeout(doFixIEScroll, 1); oldWidth = docEl.clientWidth; } function doFixIEScroll() { docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : ""; } document.attachEvent("onreadystatechange", fixIEScroll); document.attachEvent("onresize", fixIEScroll); /** * Remove need for CSS hacks regarding MSIE and IPA. */ if (document.createStyleSheet) { document.createStyleSheet().addRule('.IPA', 'font-family: "Doulos SIL", "Charis SIL", Gentium, "DejaVu Sans", Code2000, "TITUS Cyberbit Basic", "Arial Unicode MS", "Lucida Sans Unicode", "Chrysanthi Unicode";'); } //Import scripts specific to Internet Explorer 6 if (navigator.appVersion.substr(22, 1) == "6") { importScript("MediaWiki:Common.js/IE60Fixes.js") } } /* Test if an element has a certain class ************************************** * * Description: Uses regular expressions and caching for better performance. * Maintainers: [[User:Mike Dillon]], [[User:R. Koot]], [[User:SG]] */ var hasClass = (function () { var reCache = {}; return function (element, className) { return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className); }; })(); /** Collapsible tables ********************************************************* * * Description: Allows tables to be collapsed, showing only the header. See * [[Wikipedia:NavFrame]]. * Maintainers: [[User:R. Koot]] */ var autoCollapse = 2; var collapseCaption = "hide"; var expandCaption = "show"; function collapseTable( tableIndex ) { var Button = document.getElementById( "collapseButton" + tableIndex ); var Table = document.getElementById( "collapsibleTable" + tableIndex ); if ( !Table || !Button ) { return false; } var Rows = Table.rows; if ( Button.firstChild.data == collapseCaption ) { for ( var i = 1; i < Rows.length; i++ ) { Rows[i].style.display = "none"; } Button.firstChild.data = expandCaption; } else { for ( var i = 1; i < Rows.length; i++ ) { Rows[i].style.display = Rows[0].style.display; } Button.firstChild.data = collapseCaption; } } function createCollapseButtons() { var tableIndex = 0; var NavigationBoxes = new Object(); var Tables = document.getElementsByTagName( "table" ); for ( var i = 0; i < Tables.length; i++ ) { if ( hasClass( Tables[i], "collapsible" ) ) { /* only add button and increment count if there is a header row to work with */ var HeaderRow = Tables[i].getElementsByTagName( "tr" )[0]; if (!HeaderRow) continue; var Header = HeaderRow.getElementsByTagName( "th" )[0]; if (!Header) continue; NavigationBoxes[ tableIndex ] = Tables[i]; Tables[i].setAttribute( "id", "collapsibleTable" + tableIndex ); var Button = document.createElement( "span" ); var ButtonLink = document.createElement( "a" ); var ButtonText = document.createTextNode( collapseCaption ); Button.style.styleFloat = "right"; Button.style.cssFloat = "right"; Button.style.fontWeight = "normal"; Button.style.textAlign = "right"; Button.style.width = "6em"; ButtonLink.style.color = Header.style.color; ButtonLink.setAttribute( "id", "collapseButton" + tableIndex ); ButtonLink.setAttribute( "href", "javascript:collapseTable(" + tableIndex + ");" ); ButtonLink.appendChild( ButtonText ); Button.appendChild( document.createTextNode( "[" ) ); Button.appendChild( ButtonLink ); Button.appendChild( document.createTextNode( "]" ) ); Header.insertBefore( Button, Header.childNodes[0] ); tableIndex++; } } for ( var i = 0; i < tableIndex; i++ ) { if ( hasClass( NavigationBoxes[i], "collapsed" ) || ( tableIndex >= autoCollapse && hasClass( NavigationBoxes[i], "autocollapse" ) ) ) { collapseTable( i ); } /*else if ( hasClass( NavigationBoxes[i], "innercollapse" ) ) { var element = NavigationBoxes[i]; while (element = element.parentNode) { if ( hasClass( element, "outercollapse" ) ) { collapseTable ( i ); break; } } }*/ } } addOnloadHook( createCollapseButtons ); /** Dynamic Navigation Bars (experimental) ************************************* * * Description: See [[Wikipedia:NavFrame]]. * Maintainers: UNMAINTAINED */ // set up the words in your language var NavigationBarHide = '[' + collapseCaption + ']'; var NavigationBarShow = '[' + expandCaption + ']'; // shows and hides content and picture (if available) of navigation bars // Parameters: // indexNavigationBar: the index of navigation bar to be toggled function toggleNavigationBar(indexNavigationBar) { var NavToggle = document.getElementById("NavToggle" + indexNavigationBar); var NavFrame = document.getElementById("NavFrame" + indexNavigationBar); if (!NavFrame || !NavToggle) { return false; } // if shown now if (NavToggle.firstChild.data == NavigationBarHide) { for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) { if ( hasClass( NavChild, 'NavPic' ) ) { NavChild.style.display = 'none'; } if ( hasClass( NavChild, 'NavContent') ) { NavChild.style.display = 'none'; } } NavToggle.firstChild.data = NavigationBarShow; // if hidden now } else if (NavToggle.firstChild.data == NavigationBarShow) { for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) { if (hasClass(NavChild, 'NavPic')) { NavChild.style.display = 'block'; } if (hasClass(NavChild, 'NavContent')) { NavChild.style.display = 'block'; } } NavToggle.firstChild.data = NavigationBarHide; } } // adds show/hide-button to navigation bars function createNavigationBarToggleButton() { var indexNavigationBar = 0; // iterate over all < div >-elements var divs = document.getElementsByTagName("div"); for (var i = 0; NavFrame = divs[i]; i++) { // if found a navigation bar if (hasClass(NavFrame, "NavFrame")) { indexNavigationBar++; var NavToggle = document.createElement("a"); NavToggle.className = 'NavToggle'; NavToggle.setAttribute('id', 'NavToggle' + indexNavigationBar); NavToggle.setAttribute('href', 'javascript:toggleNavigationBar(' + indexNavigationBar + ');'); var NavToggleText = document.createTextNode(NavigationBarHide); for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) { if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) { if (NavChild.style.display == 'none') { NavToggleText = document.createTextNode(NavigationBarShow); break; } } } NavToggle.appendChild(NavToggleText); // Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked) for(var j=0; j < NavFrame.childNodes.length; j++) { if (hasClass(NavFrame.childNodes[j], "NavHead")) { NavFrame.childNodes[j].appendChild(NavToggle); } } NavFrame.setAttribute('id', 'NavFrame' + indexNavigationBar); } } } addOnloadHook( createNavigationBarToggleButton ); /** Main Page layout fixes ********************************************************* * * Description: Insert fixes for OG's main page here * */ /*if ((wgTitle == 'Main Page' && wgNamespaceNumber == 0) || (wgTitle == 'Wikipedia' && wgNamespaceNumber == 100)) { addOnloadHook(mainPageAppendCompleteListLink); addOnloadHook(dshuf); }*/ /** "Technical restrictions" title fix ***************************************** * * Description: For pages that have something like Template:Wrongtitle, replace * the title, but only if it is cut-and-pasteable as a valid * wikilink. For instance, "NZR WB class" can be changed to * "NZR W<sup>B</sup> class", but [[C#]] is not an equivalent wikilink, * so [[C Sharp]] doesn't have its main title changed. * * The function looks for a banner like this: * <div id="RealTitleBanner"> ... <span id="RealTitle">title</span> ... </div> * An element with id=DisableRealTitle disables the function. * Maintainers: Remember_the_dot */ if (wgIsArticle) //prevents the "Editing " prefix from disappearing during preview { addOnloadHook(function() { var realTitle = document.getElementById("RealTitle") if (realTitle) { //normalizes a title or a namespace name (but not both) //trims leading and trailing underscores and converts (possibly multiple) spaces and underscores to single underscores function normalizeTitle(title) { return title.replace(/^_+/, "").replace(/_+$/, "").replace(/[\s_]+/g, "_") } if (realTitle.textContent) //everyone but IE { var realTitleText = realTitle.textContent } else //IE { var realTitleText = realTitle.innerText } var normalizedRealTitle var normalizedPageTitle var indexOfColon = realTitleText.indexOf(":") var normalizedNamespaceName = normalizeTitle(realTitleText.substring(0, indexOfColon)).toLowerCase() //make namespace prefix lowercase and uppercase the first letter of the title if (indexOfColon == -1 || wgCanonicalNamespace.toLowerCase() != normalizedNamespaceName) //no namespace prefix - either no colon or a nonsensical namespace prefix (for example, "Foo" in "Foo: The Story of My Life") { normalizedRealTitle = normalizeTitle(realTitleText) normalizedRealTitle = normalizedRealTitle.charAt(0).toUpperCase() + normalizedRealTitle.substring(1) normalizedPageTitle = wgPageName.charAt(0).toUpperCase() + wgPageName.substring(1) } else //using a namespace prefix { var normalizedRealPageTitle = normalizeTitle(realTitleText.substring(indexOfColon + 1)) normalizedRealTitle = normalizedNamespaceName if (normalizedNamespaceName != "") //namespace 0 is a special case where the leading colon should never be shown { normalizedRealTitle += ":" } normalizedRealTitle += normalizedRealPageTitle.charAt(0).toUpperCase() + normalizedRealPageTitle.substring(1) normalizedPageTitle = wgPageName.substring(0, wgPageName.indexOf(":") + 1).toLowerCase() + wgPageName.substring(wgPageName.indexOf(":") + 1) } if (normalizedRealTitle == normalizedPageTitle) //normalized titles match, so we can do full replacement { var h1 = document.getElementsByTagName("h1")[0] //remove all child nodes, including text while (h1.firstChild) { h1.removeChild(h1.firstChild) } //populate with nodes of real title while (realTitle.firstChild) //the children are moved to a new parent element { h1.appendChild(realTitle.firstChild) } //delete the real title banner since the problem is solved var realTitleBanner = document.getElementById("RealTitleBanner") realTitleBanner.parentNode.removeChild(realTitleBanner) } //no matter what, correct the page title document.title = realTitleText + " - Wikipedia, the free encyclopedia" } }) } /** Table sorting fixes ************************************************ * * Description: Disables code in table sorting routine to set classes on even/odd rows * Maintainers: [[User:Random832]] */ ts_alternate_row_colors = false; /***** uploadwizard_newusers ******** * Switches in a message for non-autoconfirmed users at [[Wikipedia:Upload]] * * Maintainers: [[User:Krimpet]] ****/ function uploadwizard_newusers() { if (wgNamespaceNumber == 4 && wgTitle == "Upload" && wgAction == "view") { var oldDiv = document.getElementById("autoconfirmedusers"), newDiv = document.getElementById("newusers"); if (oldDiv && newDiv) { if (typeof wgUserGroups == "object" && wgUserGroups) { for (i = 0; i < wgUserGroups.length; i++) { if (wgUserGroups[i] == "autoconfirmed") { oldDiv.style.display = "block"; newDiv.style.display = "none"; return; } } } oldDiv.style.display = "none"; newDiv.style.display = "block"; return; } } } addOnloadHook(uploadwizard_newusers); /** Disambig editintro ******************************************************** * * Description: Adds an editintro on disambiguation pages. Original code * located at [[User:RockMFR/disambigeditintro.js]]. * * Maintainers: [[User:RockMFR]], [[User:Quiddity]] */ if (wgNamespaceNumber == 0) addOnloadHook(function(){ if (!document.getElementById('disambig')) return var el = document.getElementById('ca-edit') if (el) el = el.getElementsByTagName('a')[0] if (el) el.href += '&editintro=Template:Disambig_editintro' }) //</source> /* </nowiki></pre> */