跳至內容

MediaWiki:Common.js

文出維基大典
本版日期︰二〇〇七年一二月一四日 (五) 一〇時一七分;作者︰Itsmine

註:重取頁面,文方新焉。

  • Firefox / Safari:Shift 並點 重新載入,或合鍵 Ctrl-F5Ctrl-R(Mac 為 ⌘-R)。
  • Google Chrome:Ctrl-Shift-R(Mac為 ⌘-Shift-R)。
  • Internet Explorer:Ctrl 並點 重新整理,或合鍵 Ctrl-F5
  • Opera:須至 Tools → Preferences 清謄本(Mac 為 Opera → Preferences)。
// 兼容性修正
/*
所有用戶在加載任何頁面時,這裡的JavaScript都會加載

== 輔助處理 ==
*/
//功能設定
var JSConfig={
	//showBarA:(wgUserName == null),//設定JS Anonnotice的匿名出現條件
	//showBarU:false,//設定登入用戶使用JS Anonnotice的開關
	//edittoolsMode:'default', //設置編輯按鈕方案,參看[[Wikipedia:維基百科工具/編輯工具]]
	//isEdit0:true, //設置是否顯示編輯首段按鈕
	//editSectionLink:'right',//設置編輯按鈕是否在右側
	collapseText:'藏▲',//指示摺疊收縮的默認文字
	expandText:'示▼',//指示摺疊展開的默認文字
	autoCollapse:2,  //文章少於 autoCollapse 個摺疊塊時,不自動摺疊
	SpecialSearchEnhancedDisabled:false, //是否禁止增加其它搜索引擎
	isFA:"此文乃絕妙好文",
};

if (document.attachEvent && document.compatMode && document.compatMode == "CSS1Compat"){
	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);
	attachEvent("onresize", fixIEScroll);
}

// 移動元素
function elementMoveto(node, refNode, pos){//默認位置為refNode前
	if(node && refNode){
		var parent=refNode.parentNode;
		if (pos && pos=='after') {refNode=refNode.nextSibling;}
		try {
			if(refNode){
				parent.insertBefore(node, refNode);
			}else{
				parent.appendChild(node);
			}
		} catch (DOMException) {};
	}
}
//創建元素
function createElement(tag,children,props){
	var element = document.createElement(tag);
	if(!(children instanceof Array)){children=[children];}
	for(var i=0;i<children.length;i++){
		var child=children[i];
		if(typeof child=='string'){child=document.createTextNode(child);}
		if(child){element.appendChild(child);}
	}
	if(typeof props=='object'){
		for(var k in props){
			switch(k){
			case 'styles':
				var styles=props.styles;
				for(var s in styles){element.style[s]=styles[s];}
				break;
			case 'events':
				var events=props.events;
				for(var e in events){ addHandler(element,e,events[e]); }
				break;
			case 'class':
				element.className=props[k];break;
			default:
				element.setAttribute(k,props[k]);
			}
		}
	}
	return element;
}

//wiki URL
var wgProjectURL={
	en:'http://en.wikipedia.org/',de:'http://de.wikipedia.org/',fr:'http://fr.wikipedia.org/',
	pl:'http://pl.wikipedia.org/',ja:'http://ja.wikipedia.org/',it:'http://it.wikipedia.org/',
	nl:'http://nl.wikipedia.org/',pt:'http://pt.wikipedia.org/',es:'http://es.wikipedia.org/',
	sv:'http://sv.wikipedia.org/',//僅列前十名其它語言百科
	m:'http://meta.wikimedia.org/',b:'http://zh.wikibooks.org/',q:'http://zh.wikiquote.org/',
	n:'http://zh.wikinews.org/',wikt:'http://zh.wiktionary.org/',mw:'http://www.mediawiki.org/'
}
/**
 * 將頁面名稱轉換為URL
 *
 * @param page 頁面名稱
 * @param paras 附加後綴對象,用空對象{}做參數可以取得源碼
 */
function getWikiPath(page,paras){
	var reg=/^[a-z]+:/;
	var pre=page.match(reg);
	pre = pre && wgProjectURL[pre[0].replace(/:$/,'')];
	if (pre) {page=page.replace(reg,'');} else {pre='';}
	var url = pre + wgScript + '?title=' + encodeURI( page.replace( ' ', '_' ) );
	if(typeof paras=='object'){
		paras.ctype=paras.ctype||'text';
		paras.dontcountme=paras.dontcountme||'s';
		paras.action=paras.action||'raw';
		for(var k in paras){url += '&' + k + '=' + paras[k]; }
	}
	return url;
}

//JS、CSS導入模塊
function importScript( page ) {
	var src= /^https?:\/\//.test(page) ? page : getWikiPath(page,{'ctype':'text/javascript'});
	var scriptElem = createElement( 'script',null,{'src':src,'type':'text/javascript'} );
	document.getElementsByTagName( 'head' )[0].appendChild( scriptElem );
}
function importStylesheet( page ) {
	var sheet= /^https?:\/\//.test(page) ? page : getWikiPath(page,{'ctype':'text/css'});
	var styleElem = createElement( 'style', ['@import "'+sheet+'";'], {'type':'text/css'} );
	document.getElementsByTagName( 'head' )[0].appendChild( styleElem );
}

/* 測試元素中是否含有指定的樣式 **************************************
 * Description: 使用正則式與緩存來提高性能
 * Maintainers: User:fdcn @zh.wikipedia
 *              [[en:User:Mike Dillon]], [[en:User:R. Koot]], [[en:User:SG]] @en.wikipedia
 */
var hasClass = (function () {
	var reCache = {};
	return function (element, className) {
		return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
	};
})();

//設置中文語言頁
var htmlE=document.documentElement;
htmlE.setAttribute("lang",wgUserLanguage);
htmlE.setAttribute("xml:lang",wgUserLanguage);

addOnloadHook(function() 
{
	if ( document.getElementById( "p-lang" ) ) {
		var InterwikiLinks = document.getElementById( "p-lang" ).getElementsByTagName( "li" );

		for ( var i = 0; i < InterwikiLinks.length; i++ ) {
			if ( document.getElementById( InterwikiLinks[i].className + "-fa" ) ) {
				InterwikiLinks[i].className += " FA"
				InterwikiLinks[i].title = JSConfig.isFA;
			}
		}
	}
});

/*

== 增加摺疊功能 ==
*/
/** 摺疊 div table *****************************
 *  Description: 實現div.NavFrame和table.collapsible的可摺疊性。
 *  JSConfig的collapseText、expandText、autoCollapse屬性定義默認文字和默認最少自動摺疊塊
 *  Maintainers: User:fdcn
 */
addOnloadHook(function(){
	function toggleState(item){
		var oldState=item.state;
		item.state=1-oldState;
		if(item.text[0]){
			item.text[oldState].style.display = 'inline';
			item.text[item.state].style.display='none';
		}
		item.action(item);
	}

	function cancelBubble(e){
		e=e||window.event;
		if(e.stopPropagation){e.stopPropagation();}else{e.cancelBubble=true;}
	}
	function createToggleButton(head,frame,toggle){
		var textS,textH;
		var button=getElementsByClassName(head,"span","NavToggle")[0];
		if(button){
			textS=getElementsByClassName(button,"span","NavToggleShow")[0]
			textH=getElementsByClassName(button,"span","NavToggleHide")[0];
		}else {
			textS=createElement("span",[JSConfig.expandText]);
			textH=createElement('span',[JSConfig.collapseText]);
			button=createElement("span",[textS,textH],{'class':"NavToggle",styles:{'width':"3.8em"}});
		}
		if(textS){textS.style.display='none';}
		button.style.display='inline';
		var item={'state':0, 'text':[textS,textH],'frame':frame,'action':toggle}

		var links=head.getElementsByTagName("A");
		for(var i=0,l;l=links[i];i++){ addClickHandler(l,cancelBubble); }
		
		head.insertBefore( button, head.childNodes[0] );
		head.style.cursor = "pointer";
		addClickHandler( head, function(){toggleState(item);} );
		return item;
	}
	
	// 摺疊div 
	function toggleNavigationBar(item)
	{
		var cls=item.state?'none':'block';
		for (
			var NavChild = item.frame.firstChild;
			NavChild != null;
			NavChild = NavChild.nextSibling
		){
			if (NavChild.className == 'NavPic' || NavChild.className == 'NavContent') {
				NavChild.style.display = cls;
			}
		}
	}
	
	// 摺疊表格
	function collapseTable( item )
	{
		var rows = item.frame.getElementsByTagName( "tr" );
		var display = item.state? 'none':rows[0].style.display;
		for (var i=1,row; row=rows[i]; i++) { row.style.display = display; }
	}
	
	//init
	var item,items=[];
	var NavFrames=getElementsByClassName(document,"div","NavFrame");
	for(var i=0,NavFrame;NavFrame = NavFrames[i];i++) {
		var heads=getElementsByClassName(NavFrame,"div","NavHead");
		for(var ih=0,head; head = heads[ih]; ih++ ) {
			if (head.parentNode != NavFrame) {continue;}
			items.push(createToggleButton(head,NavFrame,toggleNavigationBar));
			break;
		}
	}

	var tables = getElementsByClassName(document,"table","collapsible");
	for ( var i = 0,table; table= tables[i]; i++ ) {
		var head = table.getElementsByTagName( "tr" )[0].getElementsByTagName( "th" )[0];
		items.push(createToggleButton(head,table,collapseTable));
	}

	var count=items.length;
	for ( var i = 0;  i<count; i++ ) {
		item=items[i];
		if ( hasClass( item.frame, "collapsed" ) || ( count >= JSConfig.autoCollapse && hasClass( item.frame, "autocollapse" ) ) ) {
			toggleState(item);
		}
	}
});

//修正摺疊後定位變化
hookEvent("load",function(){if(location.hash){location.href=location.hash;}});

/*

==[[Special:Search]]其他搜尋引擎連結表單==
/** Change Special:Search to use a drop-down menu *******************************************************
   *
   *  Description: Change Special:Search to use a drop-down menu, with the default being
   *               the internal MediaWiki engine
   *  Created and maintained by: [[User:Gracenotes]]
   */
 
 if (wgPageName == "Special:Search") {
         var searchEngines = [];
         addOnloadHook(SpecialSearchEnhanced);
 }
 
 function SpecialSearchEnhanced() {
         var createOption = function(site, action, mainQ, addQ, addV) {
                 var opt = document.createElement('option');
                 opt.appendChild(document.createTextNode(site));
                 searchEngines[searchEngines.length] = [action, mainQ, addQ, addV];
                 return opt;
         }
         var searchForm = document.forms['search'];
         var selectBox = document.createElement('select');
         selectBox.id = 'searchEngine';
         searchForm.onsubmit = function() {
                 var optSelected = searchEngines[document.getElementById('searchEngine').selectedIndex];
                 searchForm.action = optSelected[0];
                 searchForm.lsearchbox.name = optSelected[1];
                 searchForm.title.value = optSelected[3];
                 searchForm.title.name = optSelected[2];
         }
         selectBox.appendChild(createOption('MediaWiki search', wgScriptPath + '/index.php', 'search', 'title', 'Special:Search'));
         selectBox.appendChild(createOption('Google', 'http://www.google.com/search', 'q', 'sitesearch', 'zh-classical.wikipedia.org'));
         selectBox.appendChild(createOption('Yahoo', 'http://search.yahoo.com/search', 'p', 'vs', 'zh-classical.wikipedia.org'));
         selectBox.appendChild(createOption('Windows Live', 'http://search.live.com/results.aspx', 'q', 'q1', 'site:http://zh-classical.wikipedia.org'));
         searchForm.lsearchbox.style.marginLeft = '0px';
         var lStat = document.getElementById('loadStatus');
         lStat.parentNode.insertBefore(selectBox, lStat);
 }


/*

==WikiMiniAtlas世界地圖==
*/
/** WikiMiniAtlas *******************************************************
   *
   *  描述:WikiMiniAtlas是一個popup而可點選與拖曳的世界地圖。
   *               這個腳本將會讓所有的經緯度標示中顯示WikiMiniAtlas的popup開啟按鈕。
   *               由於被許多計畫使用,因此腳本放置在元維基中。
   *               更多資訊請詳見[[Meta:WikiMiniAtlas]]。
   *  創建者:[[:en:User:Dschwen]]
   */
 
importScript('m:MediaWiki:Wikiminiatlas.js');
/*

==Wikimedia媒體播放器==
*/

/** MediaWiki media player *******************************************************
  *
  *  Description: A Java player for in-browser playback of media files.
  *  Created by: [[:en:User:Gmaxwell]]
  */
importScript('Mediawiki:Wikimediaplayer.js');

/** Extra toolbar options ******************************************************
  *
  *  Description: UNDOCUMENTED
  *  Maintainers: [[User:MarkS]]?, [[User:Voice of All]], [[User:R. Koot]]
  */
 
 //This is a modified copy of a script by User:MarkS for extra features added by User:Voice of All.
 // This is based on the original code on Wikipedia:Tools/Editing tools
 // To disable this script, add <code>mwCustomEditButtons = [];<code> to [[Special:Mypage/monobook.js]]
 
 if (mwCustomEditButtons) {
   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "/media/wikipedia/en/c/c8/Button_redirect.png",
     "speedTip": "渡",
     "tagOpen": "#REDIRECT [[",
     "tagClose": "]]",
     "sampleText": "入文"};
 
   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "/media/wikipedia/en/c/c9/Button_strike.png",
     "speedTip": "刪字線",
     "tagOpen": "<s>",
     "tagClose": "</s>",
     "sampleText": "去此字"};
 
   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "/media/wikipedia/en/1/13/Button_enter.png",
     "speedTip": "易行",
     "tagOpen": "<br />",
     "tagClose": "",
     "sampleText": ""};
 
   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "/media/wikipedia/en/8/80/Button_upper_letter.png",
     "speedTip": "上標",
     "tagOpen": "<sup>",
     "tagClose": "</sup>",
     "sampleText": "上標之字"};
 
   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "/media/wikipedia/en/7/70/Button_lower_letter.png",
     "speedTip": "下標",
     "tagOpen": "<sub>",
     "tagClose": "</sub>",
     "sampleText": "下標之字"};
 
   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "/media/wikipedia/en/5/58/Button_small.png",
     "speedTip": "小",
     "tagOpen": "<small>",
     "tagClose": "</small>",
     "sampleText": "小字"};
 
   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "/media/wikipedia/en/3/34/Button_hide_comment.png",
     "speedTip": "陰評",
     "tagOpen": "<!-- ",
     "tagClose": " -->",
     "sampleText": "評"};
 
   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "/media/wikipedia/en/1/12/Button_gallery.png",
     "speedTip": "以圖入文",
     "tagOpen": "\n<gallery>\n",
     "tagClose": "\n</gallery>",
     "sampleText": "Image:Example.jpg|Caption1\nImage:Example.jpg|Caption2"};
 
   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "/media/wikipedia/en/f/fd/Button_blockquote.png",
     "speedTip": "引文",
     "tagOpen": "<blockquote>\n",
     "tagClose": "\n</blockquote>",
     "sampleText": ""引文;
 
   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "/media/wikipedia/en/6/60/Button_insert_table.png",
     "speedTip": "以表入文",
     "tagOpen": '{| class="wikitable"\n|-\n',
     "tagClose": "\n|}",
     "sampleText": "! header 1\n! header 2\n! header 3\n|-\n| row 1, cell 1\n| row 1, cell 2\n| row 1, cell 3\n|-\n| row 2, cell 1\n| row 2, cell 2\n| row 2, cell 3"};

   mwCustomEditButtons[mwCustomEditButtons.length] = {
     "imageFile": "/media/wikipedia/commons/7/79/Button_reflink.png",
     "speedTip": "示據",
     "tagOpen": "<ref>",
     "tagClose": "</ref>",
     "sampleText": "書據於此"};

 }
 
 /*</nowiki>*/