MediaWiki:Common.js
跳至導覽
跳至搜尋
注意: 保存了後,就會記咧共瀏覽器的cache摒掉才看會著改變: Mozilla: 揤reload/重新載入 (a̍h-sīCtrl-R),IE佮Opera: Ctrl-F5,Safari: Cmd-R,Konqueror Ctrl-R。
/** * 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";'); } } /** * Collapsible tables * * Allows tables to be collapsed, showing only the header. See [[Wikipedia:NavFrame]]. * * @version 2.0.3 (2014-03-14) * @source https://www.mediawiki.org/wiki/MediaWiki:Gadget-collapsibleTables.js * @author [[User:R. Koot]] * @author [[User:Krinkle]] * @deprecated Since MediaWiki 1.20: Use class="mw-collapsible" instead which * is supported in MediaWiki core. */ var autoCollapse = 2; var collapseCaption = '收束'; var expandCaption = '展開'; var tableIndex = 0; function collapseTable( tableIndex ) { var Button = document.getElementById( 'collapseButton' + tableIndex ); var Table = document.getElementById( 'collapsibleTable' + tableIndex ); if ( !Table || !Button ) { return false; } var Rows = Table.rows; var i; if ( Button.firstChild.data === collapseCaption ) { for ( i = 1; i < Rows.length; i++ ) { Rows[i].style.display = 'none'; } Button.firstChild.data = expandCaption; } else { for ( i = 1; i < Rows.length; i++ ) { Rows[i].style.display = Rows[0].style.display; } Button.firstChild.data = collapseCaption; } } function createClickHandler( tableIndex ) { return function ( e ) { e.preventDefault(); collapseTable( tableIndex ); }; } function createCollapseButtons( $content ) { var NavigationBoxes = {}; var $Tables = $content.find( 'table' ); var i; $Tables.each( function( i, table ) { if ( $(table).hasClass( 'collapsible' ) ) { /* only add button and increment count if there is a header row to work with */ var HeaderRow = table.getElementsByTagName( 'tr' )[0]; if ( !HeaderRow ) { return; } var Header = table.getElementsByTagName( 'th' )[0]; if ( !Header ) { return; } NavigationBoxes[ tableIndex ] = table; table.setAttribute( 'id', 'collapsibleTable' + tableIndex ); var Button = document.createElement( 'span' ); var ButtonLink = document.createElement( 'a' ); var ButtonText = document.createTextNode( collapseCaption ); // Styles are declared in [[MediaWiki:Common.css]] Button.className = 'collapseButton'; ButtonLink.style.color = Header.style.color; ButtonLink.setAttribute( 'id', 'collapseButton' + tableIndex ); ButtonLink.setAttribute( 'href', '#' ); $( ButtonLink ).on( 'click', createClickHandler( tableIndex ) ); ButtonLink.appendChild( ButtonText ); Button.appendChild( document.createTextNode( '[' ) ); Button.appendChild( ButtonLink ); Button.appendChild( document.createTextNode( ']' ) ); Header.insertBefore( Button, Header.firstChild ); tableIndex++; } } ); for ( i = 0; i < tableIndex; i++ ) { if ( $( NavigationBoxes[i] ).hasClass( 'collapsed' ) || ( tableIndex >= autoCollapse && $( NavigationBoxes[i] ).hasClass( 'autocollapse' ) ) ) { collapseTable( i ); } else if ( $( NavigationBoxes[i] ).hasClass ( 'innercollapse' ) ) { var element = NavigationBoxes[i]; while ((element = element.parentNode)) { if ( $( element ).hasClass( 'outercollapse' ) ) { collapseTable ( i ); break; } } } } } mw.hook( 'wikipage.content' ).add( createCollapseButtons ); /** * Dynamic Navigation Bars (experimental) * * Description: See [[Wikipedia:NavFrame]]. * Maintainers: UNMAINTAINED */ /* set up the words in your language */ var NavigationBarHide = '[' + collapseCaption + ']'; var NavigationBarShow = '[' + expandCaption + ']'; var indexNavigationBar = 0; /** * Shows and hides content and picture (if available) of navigation bars * Parameters: * indexNavigationBar: the index of navigation bar to be toggled **/ window.toggleNavigationBar = function ( indexNavigationBar, event ) { var NavToggle = document.getElementById( 'NavToggle' + indexNavigationBar ); var NavFrame = document.getElementById( 'NavFrame' + indexNavigationBar ); var NavChild; if ( !NavFrame || !NavToggle ) { return false; } /* if shown now */ if ( NavToggle.firstChild.data === NavigationBarHide ) { for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) { if ( $( NavChild ).hasClass( 'NavContent' ) || $( NavChild ).hasClass( 'NavPic' ) ) { NavChild.style.display = 'none'; } } NavToggle.firstChild.data = NavigationBarShow; /* if hidden now */ } else if ( NavToggle.firstChild.data === NavigationBarShow ) { for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) { if ( $( NavChild ).hasClass( 'NavContent' ) || $( NavChild ).hasClass( 'NavPic' ) ) { NavChild.style.display = 'block'; } } NavToggle.firstChild.data = NavigationBarHide; } event.preventDefault(); }; /* adds show/hide-button to navigation bars */ function createNavigationBarToggleButton( $content ) { var NavChild; /* iterate over all < div >-elements */ var $divs = $content.find( 'div' ); $divs.each( function ( i, NavFrame ) { /* if found a navigation bar */ if ( $( NavFrame ).hasClass( 'NavFrame' ) ) { indexNavigationBar++; var NavToggle = document.createElement( 'a' ); NavToggle.className = 'NavToggle'; NavToggle.setAttribute( 'id', 'NavToggle' + indexNavigationBar ); NavToggle.setAttribute( 'href', '#' ); $( NavToggle ).on( 'click', $.proxy( window.toggleNavigationBar, window, indexNavigationBar ) ); var isCollapsed = $( NavFrame ).hasClass( '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 ( NavChild = NavFrame.firstChild; NavChild != null && !isCollapsed; NavChild = NavChild.nextSibling ) { if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( 'NavContent' ) ) { if ( NavChild.style.display === 'none' ) { isCollapsed = true; } } } if ( isCollapsed ) { for ( NavChild = NavFrame.firstChild; NavChild != null; NavChild = NavChild.nextSibling ) { if ( $( NavChild ).hasClass( 'NavPic' ) || $( NavChild ).hasClass( '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 ( $( NavFrame.childNodes[j] ).hasClass( 'NavHead' ) ) { NavToggle.style.color = NavFrame.childNodes[j].style.color; NavFrame.childNodes[j].appendChild( NavToggle ); } } NavFrame.setAttribute( 'id', 'NavFrame' + indexNavigationBar ); } } ); } mw.hook( 'wikipage.content' ).add( createNavigationBarToggleButton ); /** Main Page layout fixes ********************************************************* * * Description: Adds an additional link to the complete list of languages available. * Maintainers: [[User:AzaToth]], [[User:R. Koot]], [[User:Alex Smotrov]] */ if (mw.config.get( 'wgIsMainPage' ) || mw.config.get( 'wgPageName' ) == 'Talk:Thâu-ia̍h') $(function () { mw.util.addPortletLink('p-lang', '//meta.wikimedia.org/wiki/List_of_Wikipedias', '一覽表', 'interwiki-completelist', '各版Wikipedia一覽表') var nstab = document.getElementById('ca-nstab-main') if (nstab && (mw.config.get( 'wgUserLanguage' )=='nan' || mw.config.get( 'wgUserLanguage' )=='zh-min-nan') ) { nstab.firstChild.firstChild.nodeValue = 'Thâu-ia̍h'; } } ) /** "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.charAt(0).toUpperCase() + normalizedRealTitle.substring(1) normalizedPageTitle = mw.config.get( 'wgPageName' ).charAt(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.charAt(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, the free encyclopedia" } }) } /** * 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( 'wgIsMainPage' ) ) { 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 ); /** * Sidebar modifying * * Description: To add, remove, or replace the sidebar links. * the script was modified from [[mw:Manual:Interface/Sidebar]] */ function ModifySidebar( action, section, name, link ) { try { switch ( section ) { case 'languages': var target = 'p-lang'; break; case 'toolbox': var target = 'p-tb'; break; case 'navigation': var target = 'p-navigation'; break; default: var target = 'p-' + section; break; } if ( action == 'add' ) { var node = document.getElementById( target ) .getElementsByTagName( 'div' )[0] .getElementsByTagName( 'ul' )[0]; var aNode = document.createElement( 'a' ); var liNode = document.createElement( 'li' ); aNode.appendChild( document.createTextNode( name ) ); aNode.setAttribute( 'href', link ); liNode.appendChild( aNode ); liNode.className = 'plainlinks'; node.appendChild( liNode ); } if ( action == 'remove' ) { var list = document.getElementById( target ) .getElementsByTagName( 'div' )[0] .getElementsByTagName( 'ul' )[0]; var listelements = list.getElementsByTagName( 'li' ); for ( var i = 0; i < listelements.length; i++ ) { if ( listelements[i].getElementsByTagName( 'a' )[0].innerHTML == name || listelements[i].getElementsByTagName( 'a' )[0].href == link ) { list.removeChild( listelements[i] ); } } } if ( action == 'replace' ) { var list = document.getElementById( target ) .getElementsByTagName( 'div' )[0] .getElementsByTagName( 'ul' )[0]; var listelements = list.getElementsByTagName( 'li' ); var node = document.getElementById( target ) .getElementsByTagName( 'div' )[0] .getElementsByTagName( 'ul' )[0]; var aNode = document.createElement( 'a' ); var liNode = document.createElement( 'li' ); aNode.appendChild( document.createTextNode( name.split( '|' )[1] ) ); aNode.setAttribute( 'href', link.split( '|' )[1] ); liNode.appendChild( aNode ); liNode.className = 'plainlinks'; for ( var i = 0; i < listelements.length; i++ ) { if ( listelements[i].getElementsByTagName( 'a' )[0].innerHTML == name.split( '|' )[0] || listelements[i].getElementsByTagName( 'a' )[0].href == link.split( '|' )[0] ) { // replace text instead of the whole element to preserve the tooltip listelements[i].getElementsByTagName( 'a' )[0].innerText = name.split( '|' )[1]; listelements[i].getElementsByTagName( 'a' )[0].href = link.split( '|' )[1]; } } } } catch( e ) { return; } } function CustomizeModificationsOfSidebar() { ModifySidebar( 'replace', 'toolbox', 'Kā tóng-àn chiūⁿ-bāng|Tóng-àn chiūⁿ-bāng', '//zh-min-nan.wikipedia.org/wiki/Special:Upload|//zh-min-nan.wikipedia.org/wiki/Wikipedia:Chiūⁿ-bāng' ); } $( CustomizeModificationsOfSidebar );