MediaWiki:Common.js: Difference between revisions
Jump to navigation
Jump to search
(Updating code for new standards, fix deprecations, fix JS errors with latest mediawiki) |
m (Adding back some useful code) |
||
Line 124: | Line 124: | ||
$( createCollapseButtons ); | $( createCollapseButtons ); | ||
/** Proper(?) collapsible text **********************************************************/ | |||
function doExpandText(textIndex) | |||
{ | |||
var Button=document.getElementById("pcsx2_collapsibleButton"+textIndex); | |||
if (!Button) return false; | |||
var TextFull=document.getElementById("pcsx2_collapsibleTextFull"+textIndex); | |||
if (!TextFull) return false; | |||
Button.style.display="none"; | |||
TextFull.style.display=""; | |||
} | |||
function createCollapseTextButtons() | |||
{ | |||
var MyClasses=document.getElementsByClassName("pcsx2_collapsible_text"); | |||
var textIndex=0; | |||
var str=""; | |||
for (var i=0;i<MyClasses.length;i++) { | |||
str=MyClasses[i].innerHTML; | |||
MyClasses[i].innerHTML=str.replace(/(<p>|<\/p>|<br>|<br\/>|<br \/>)/gmi,""); | |||
//should contain two spans: pcsx2_collapsible_text_part and pcsx2_collapsible_text_full | |||
var TextPart=MyClasses[i].getElementsByClassName("pcsx2_collapsible_text_part")[0]; | |||
if (!TextPart) continue; | |||
var TextFull=MyClasses[i].getElementsByClassName("pcsx2_collapsible_text_full")[0]; | |||
if (!TextFull) continue; | |||
//creating href | |||
var Button=document.createElement("span"); | |||
var ButtonLink=document.createElement("a"); | |||
var ButtonText=document.createTextNode("..."); | |||
Button.style.fontWeight="bold"; | |||
Button.style.fontSize="smaller"; | |||
Button.setAttribute("id","pcsx2_collapsibleButton"+textIndex); | |||
ButtonLink.setAttribute("href","javascript:doExpandText("+textIndex+");"); | |||
ButtonLink.setAttribute("title","Expand this text..."); | |||
ButtonLink.appendChild(ButtonText); | |||
Button.appendChild(document.createTextNode(" (")); | |||
Button.appendChild(ButtonLink); | |||
Button.appendChild(document.createTextNode(")")); | |||
TextFull.setAttribute("id","pcsx2_collapsibleTextFull"+textIndex); | |||
TextFull.style.display="none"; | |||
TextPart.appendChild(Button); | |||
textIndex++; | |||
} | |||
} | |||
$(createCollapseTextButtons); | |||
/** Dynamic Navigation Bars (experimental) ************************************* | /** Dynamic Navigation Bars (experimental) ************************************* |
Latest revision as of 06:05, 25 July 2017
//<source lang="javascript"> /** * WikiMiniAtlas is a popup click and drag world map. * See [[meta:WikiMiniAtlas]] for more information. * Maintainers: [[w:User:Dschwen]] */ mw.loader.load('//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript'); /* Scripts specific to Internet Explorer */ if (navigator.appName == "Microsoft Internet Explorer") { /** * 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";'); } } /* 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 = "Collapse"; var expandCaption = "Expand"; 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.className = "collapseButton"; //Styles are declared in Common.css 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; } } } } } $( createCollapseButtons ); /** Proper(?) collapsible text **********************************************************/ function doExpandText(textIndex) { var Button=document.getElementById("pcsx2_collapsibleButton"+textIndex); if (!Button) return false; var TextFull=document.getElementById("pcsx2_collapsibleTextFull"+textIndex); if (!TextFull) return false; Button.style.display="none"; TextFull.style.display=""; } function createCollapseTextButtons() { var MyClasses=document.getElementsByClassName("pcsx2_collapsible_text"); var textIndex=0; var str=""; for (var i=0;i<MyClasses.length;i++) { str=MyClasses[i].innerHTML; MyClasses[i].innerHTML=str.replace(/(<p>|<\/p>|<br>|<br\/>|<br \/>)/gmi,""); //should contain two spans: pcsx2_collapsible_text_part and pcsx2_collapsible_text_full var TextPart=MyClasses[i].getElementsByClassName("pcsx2_collapsible_text_part")[0]; if (!TextPart) continue; var TextFull=MyClasses[i].getElementsByClassName("pcsx2_collapsible_text_full")[0]; if (!TextFull) continue; //creating href var Button=document.createElement("span"); var ButtonLink=document.createElement("a"); var ButtonText=document.createTextNode("..."); Button.style.fontWeight="bold"; Button.style.fontSize="smaller"; Button.setAttribute("id","pcsx2_collapsibleButton"+textIndex); ButtonLink.setAttribute("href","javascript:doExpandText("+textIndex+");"); ButtonLink.setAttribute("title","Expand this text..."); ButtonLink.appendChild(ButtonText); Button.appendChild(document.createTextNode(" (")); Button.appendChild(ButtonLink); Button.appendChild(document.createTextNode(")")); TextFull.setAttribute("id","pcsx2_collapsibleTextFull"+textIndex); TextFull.style.display="none"; TextPart.appendChild(Button); textIndex++; } } $(createCollapseTextButtons); /** 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 isCollapsed = hasClass( NavFrame, "collapsed" ); /* * Check if any children are already hidden. This loop is here for backwards compatibility: * the old way of making NavFrames start out collapsed was to manually add style="display:none" * to all the NavPic/NavContent elements. Since this was bad for accessibility (no way to make * the content visible without JavaScript support), the new recommended way is to add the class * "collapsed" to the NavFrame itself, just like with collapsible tables. */ for (var NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling) { if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) { if ( NavChild.style.display == 'none' ) { isCollapsed = true; } } } if (isCollapsed) { for (var NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling) { if ( hasClass( NavChild, 'NavPic' ) || hasClass( NavChild, 'NavContent' ) ) { NavChild.style.display = 'none'; } } } var NavToggleText = document.createTextNode(isCollapsed ? NavigationBarShow : NavigationBarHide); 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); } } } $( createNavigationBarToggleButton ); /** "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> * Maintainers: Remember_the_dot */ if (mw.config.get('wgIsArticle')) //prevents the "Editing " prefix from disappearing during preview { $(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 || mw.config.get('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[0].toUpperCase() + normalizedRealTitle.substring(1) normalizedPageTitle = mw.config.get('wgPageName')[0].toUpperCase() + mw.config.get('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[0].toUpperCase() + normalizedRealPageTitle.substring(1) normalizedPageTitle = mw.config.get('wgPageName').substring(0, mw.config.get('wgPageName').indexOf(":") + 1).toLowerCase() + mw.config.get('wgPageName').substring(mw.config.get('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") if (realTitleBanner) realTitleBanner.parentNode.removeChild(realTitleBanner) } //no matter what, correct the page title document.title = realTitleText + " - Wikipedia Mìng-dĕ̤ng-ngṳ̄ - Cê̤ṳ-iù gì Báik-kuŏ-ciòng-cṳ̆" } }) } /** * uploadwizard_newusers * * Switches in a message for non-autoconfirmed users at [[Wikipedia:Upload]] * * Maintainers: [[User:Krimpet]] */ function uploadwizard_newusers() { if (mw.config.get('wgNamespaceNumber') == 4 && mw.config.get('wgTitle') == "Upload" && mw.config.get('wgAction') == "view") { var oldDiv = document.getElementById("autoconfirmedusers"), newDiv = document.getElementById("newusers"); if (oldDiv && newDiv) { if (typeof mw.config.get('wgUserGroups') == "object" && mw.config.get('wgUserGroups')) { for (i = 0; i < mw.config.get('wgUserGroups').length; i++) { if (mw.config.get('wgUserGroups')[i] == "autoconfirmed") { oldDiv.style.display = "block"; newDiv.style.display = "none"; return; } } } oldDiv.style.display = "none"; newDiv.style.display = "block"; return; } } } $(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 (mw.config.get('wgNamespaceNumber') == 0) $(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' }) /** Mobile browser helper link ************************************************ * * Adds a link to the mobile-optimized gateway at en.m.wikimedia.org * for viewers on iPhone, iPod Touch, and Android devices. * This is semi-experimental to drive more test traffic there for now; * it's still in development but very usable for reading! * * Currently set to always show the link on main page and search results, * and w/ 25% probability on other page views. * * Maintainer: [[User:Brion VIBBER]] */ if (/(Android|iPhone|iPod)/.test(navigator.userAgent)) { $(function() { var prob = 1.0; if (mw.config.get('wgCanonicalNamespace') == 'Special' && mw.config.get('wgCanonicalSpecialPageName') == 'Search') { var pageLink = '?search=' + encodeURIComponent(document.getElementById('searchText').value); } else if (mw.config.get('wgPageName') == 'Main_Page') { var pageLink = '::Home'; // Special case } else { var pageLink = encodeURIComponent(mw.config.get('wgPageName')).replace('%2F','/').replace('%3A',':'); prob = 0.25; } if (prob < Math.random()) return; var div = document.createElement('div'); div.style.fontSize = '30pt'; div.style.lineHeight = '40pt'; div.style.textAlign = 'center'; div.style.marginTop = '20px'; div.style.marginBottom = '20px'; div.style.padding = '20px'; div.style.border = '2px solid gray'; div.appendChild(document.createTextNode("View this page in ")); var link = document.createElement('a'); link.href = 'http://en.m.wikipedia.org/wiki/' + pageLink; link.appendChild(document.createTextNode("Wikipedia's mobile site")); div.appendChild(link); var content=document.getElementById('content'); content.insertBefore(div,content.firstChild); }); } /** * Interwiki links to featured articles * * Description: Highlights interwiki links to featured articles (or * equivalents) by changing the bullet before the interwiki link * into a star. * Maintainers: [[User:R. Koot]] */ function LinkFA(){ var pLang = document.getElementById('p-lang') if (!pLang) return var list = { 'fa':'This is a featured article in another language', 'ga':'This is a good article in another language'} var iw = pLang.getElementsByTagName('li') for (var i=0; i<iw.length; i++) for (var s in list) if (document.getElementById(iw[i].className+'-'+s)){ iw[i].className += ' ' + s.toUpperCase() iw[i].title = list[s] + ' in another language' } } $( LinkFA ); // Results from Wikidata // [[File:Wdsearch_script_screenshot.png]] if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Search' || ( mw.config.get( 'wgArticleId' ) === 0 && mw.config.get( 'wgCanonicalSpecialPageName' ) === false ) ) { mw.loader.load( '//en.wikipedia.org/w/index.php?title=MediaWiki:Wdsearch.js&action=raw&ctype=text/javascript' ); } /** * WikiMiniAtlas * * Description: WikiMiniAtlas is a popup click and drag world map. * This script causes all of our coordinate links to display the WikiMiniAtlas popup button. * The script itself is located on meta because it is used by many projects. * See [[Meta:WikiMiniAtlas]] for more information. * Maintainers: [[User:Dschwen]] */ ( function () { var require_wikiminiatlas = false; var coord_filter = /geohack/; $( function () { $( 'a.external.text' ).each( function( key, link ) { if ( link.href && coord_filter.exec( link.href ) ) { require_wikiminiatlas = true; // break from loop return false; } } ); if ( $( 'div.kmldata' ).length ) { require_wikiminiatlas = true; } if ( require_wikiminiatlas ) { mw.loader.load( '//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript' ); } } ); } )(); //</source> // </nowiki></pre>