MediaWiki:Common.js

維基詞典,自由的多語言詞典

注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Internet Explorer / Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
  • Opera:Ctrl-F5


// <nowiki>
/*
所有用戶在加載任何頁面時,這裡的JavaScript都會加載
*/

/*
==定期強制用戶更新cache==
*/
mw.loader.using(['mediawiki.cookie']).then(function () {
  if( (""+mw.config.get('wgUserGroups')).indexOf("user")!=-1 && (mw.config.get('wgAction')=="view") ){
    var today=new Date();
    if(!$.cookie("lastload") || isNaN($.cookie("lastload")) ) {
      $.cookie("lastload", today.getTime());
    } else {
      if( today.getTime()-$.cookie("lastload") >= 7*24*60*60*1000 ) {
        $.cookie("lastload", today.getTime());
        if( $.cookie("lastload")==today.getTime() ) window.location.reload(true);
      } else if ( today.getTime()-$.cookie("lastload") < 0 ) {
        $.cookie("lastload", today.getTime());
      }
    }
  }
})

//返回繁簡字串
function wgULS(hans,hant,cn,tw,hk,sg,zh){
	ret = {
		'zh-hans':hans||cn||sg,
		'zh-hant':hant||tw||hk,
		'zh-cn':cn||hans||sg,
		'zh-sg':sg||hans||cn,
		'zh-tw':tw||hant||hk,
		'zh-hk':hk||hant||tw
	}
	if (ret[mw.config.get('wgUserLanguage')])
		return ret[mw.config.get('wgUserLanguage')];
	else
		return zh||hant||hans||cn||tw||hk||sg;//保證每一語言有值
}

/* 當需要時載入對應的 scripts */

$(function () { if(document.getElementById('preloadGuide')) {
    importScript('MediaWiki:SpecialSearch.js');
}});

/*
==模板的自动分析==
*/
function TempAnalysis(title) {
    //
    if (!title) return "";
    
    var words = title.replace(/'/g /* ' */, "").split(/\s+|\s*[,.\-]\s*/);
    var params = words.length < 2 ? "" : words.join("|");
    var src = "{{朝新|" + params + "}}";
    src = src.replace(/\|+/g, "|");
    src = src.replace(/\|}}$/g, "}}");
    return src;
    //
}
/*
== 辅助处理 ==
*/
//功能設定
if(!window.JSConfig){var JSConfig={};}
JSConfig.collapseText=wgULS('隐藏▲','隱藏▲');//指示折叠收缩的默认文字
JSConfig.expandText=wgULS('显示▼','顯示▼');//指示折叠展开的默认文字
JSConfig.autoCollapse=2;  //文章少于 autoCollapse 个折叠块时,不自动折叠
JSConfig.SpecialSearchEnhancedDisabled=false; //是否禁止增加其它搜索引擎

//新的getElementsByClassName
/*
	Developed by Robert Nyman, http://www.robertnyman.com
	Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/	
var getElementsByClassName = function (elm, tag, className){
	if (document.getElementsByClassName) {
		getElementsByClassName = function (elm, tag, className) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className);
			if (tag=="*") return elements;
			var nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i=0, il=elements.length; i<il; i+=1){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassName = function (elm, tag, className) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j=0, jl=classes.length; j<jl; j+=1){
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (elm, tag, className) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(elm, tag, className);
};

//遍历
function applyEach(callback,array){
	var i=0,j=array.length;
	while(i<j){callback(array[i++]);}
}

// 移動元素
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];}
	applyEach(function(child){
		if(typeof child=='string'){child=document.createTextNode(child);}
		if(child){element.appendChild(child);}
	},children);
	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;
}
/**
* 将页面名称转换为URL
*
* @param page 页面名称
* @param paras 附加后缀对象,用空对象{}做参数可以取得源码
*/
function getWikiPath(page,paras){
	var reg=/^[a-z]+:/;
	var pre=page.match(reg);
	pre = pre && wgProjectURL[pre[0].replace(/:$/,'').toLowerCase()];
	if (pre) {page=page.replace(reg,'');} else {pre=mw.config.get('wgServer');} //保障没有相对路径,以照顾在线代理。
	var url = pre + mw.config.get('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;
}

//引入[[Special:Gadgets]]要求的腳本和樣式
if(window.requireScripts instanceof Array){
	applyEach(importScript,requireScripts);
}
if(window.requireStylesheets instanceof Array){
	applyEach(importStylesheet,requireStylesheets);
}

/*
== IE兼容性修正 ==
*/
function fixIE(){
}

/*

== 增加摺疊功能 ==
*/
/** 摺疊 div table *****************************
 *  Description: 实现div.NavFrame和table.collapsible的可折叠性。
 *  JSConfig的collapseText、expandText、autoCollapse属性定义默认文字和默认最少自动折叠块
 *  Maintainers: User:fdcn
 */
function cancelBubble(e){
	e=e||window.event;
	if(e.stopPropagation){e.stopPropagation();}else{e.cancelBubble=true;}
}
//修正摺疊後定位變化
//hookEvent("load",function(){if(location.hash){location.href=location.hash;}});

/*
== 首頁輸出修正 ==
*/
/** 首页输出修正 *******************************************************
  描述:
  维护者: [[User:Fdcn]]
*/

// "首頁" == wgTitle 代表重定向頁
if ( mw.config.get('wgIsMainPage') ) {
	mw.loader.using(['mediawiki.util']).then(function () {
		$( function () {
			mw.util.addPortletLink('p-lang', getWikiPath('Wiktionary:维基词典语言列表'), 
			wgULS('维基词典语言列表','維基詞典語言列表'), 'interwiki-completelist',wgULS('维基词典的完整各语言列表', '維基詞典的完整各語言列表'));
		});
	});
}

/*

== 取消討論頁的[+]按鈕 ==
*/

$(function () {
	if(document.getElementById('no-newsection') && document.getElementById('ca-addsection')) {
		document.getElementById('ca-addsection').style.display="none";
	}
});

/*
==WikiMiniAtlas世界地圖==
*/
/**
 * WikiMiniAtlas is a popup click and drag world map.
 * See [[meta:WikiMiniAtlas]] for more information.
 * 創建者: [[en:User:Dschwen]]
 */
mw.loader.load( '//meta.wikimedia.org/w/index.php?title=MediaWiki:Wikiminiatlas.js&action=raw&ctype=text/javascript' );

/*
==反frame==
*/
try {
	if (top.location != self.location) {
		top.location.replace(self.location);
	}

}catch(ex){
	top.location.replace(self.location);
}

/*
==保護選項校正==
*/

if(mw.config.get('wgAction')=="protect") {

 $( function(){
  var pform=document.getElementById("mw-Protect-Form");
  var timeoptions;

  timeoptions=pform["wpProtectExpirySelection-edit"].options;
  if(timeoptions[0].value!="existing"){
   timeoptions[timeoptions.length-1].selected=true;
   ProtectionForm.updateExpiryList(pform["wpProtectExpirySelection-edit"]);
  }

  timeoptions=pform["wpProtectExpirySelection-move"].options;
  if(timeoptions[0].value!="existing"){
   timeoptions[timeoptions.length-1].selected=true;
   ProtectionForm.updateExpiryList(pform["wpProtectExpirySelection-move"]);
  }
 
 });

}

/*
==擷取選單文字按鈕==
*/

function addGetMenuTextButton(id, srcMenu, targetText, tiptext, afterSelIdx) {
 var btnAdd=createElement("a", ((!tiptext)?"(+)":tiptext), {
  'id': id ,
  'href' : '#'
 });
 btnAdd.srcMenu=srcMenu;
 btnAdd.targetText=targetText;
 btnAdd.afterSelIdx=(!afterSelIdx || isNaN(afterSelIdx))?0:afterSelIdx;
 btnAdd.onclick=function(){
  this.targetText.value+=this.srcMenu.options[srcMenu.selectedIndex].value;
  srcMenu.selectedIndex=this.afterSelIdx;
  return false;
 }

 srcMenu.parentNode.appendChild(btnAdd);
}


/*
==避免在主條目中出現捲軸框==
*/

if(!mw.config.get('wgCanonicalNamespace')) $( function(){

 var divs=document.getElementsByTagName("div");

 for(var i=0; i<divs.length; i++){
  if(divs[i].id=="CContentList"){
   if(divs[i].parentNode.parentNode.id=="TagConversionHeader") continue;
  }

  if(divs[i].style.overflow.toLowerCase()=="auto" && divs[i].getElementsByTagName("img").length==0){
   divs[i].style.overflow="";
   divs[i].style.overflowY="visible";
   divs[i].style.padding="";
   divs[i].style.border="";
   divs[i].style.height="";
  }
 }

});

/* 
== metaBox ==

HERE STARTS THE WORKING-CODE OF "METABOXES"*/
 
 /* Funcionament de la Plantilla:Metacaixa
 Implementat per: Usuari:Peleguer.
 Actualitzat per Joanjoc seguint les indicacions d'en Martorell
 */
 
 function MetaCaixaInit(){
  //S'executa al carregar-se la pàgina, si hi ha metacaixes,
  // s'assignen els esdeveniments als botons
  //alert("MetaCaixaInit");
 
  var i=0       //Inicialitzem comptador de caixes
  for (i=0;i<=9;i++){
     var vMc = document.getElementById("mc"+i);
     if (!vMc) break;
     //alert("MetaCaixaInit, trobada Metacaixa mc"+i);
 
     var j=1    //Inicialitzem comptador de botons dins de la caixa
     var vPsIni = 0  //Pestanya visible inicial
     for (j=1;j<=9;j++){
        var vBt = document.getElementById("mc"+i+"bt"+j);
        if (!vBt) break;
        //alert("MetaCaixaInit, trobat botó mc"+i+"bt"+j);
        vBt.onclick = MetaCaixaMostraPestanya;          //A cada botó assignem l'esdeveniment onclick
        //alert (vBt.className);
        if (vBt.className=="mcBotoSel") vPsIni=j;  //Si tenim un botó seleccionat, en guardem l'index
     }
     //alert ("mc="+i+", ps="+j+", psini="+vPsIni );
     if (vPsIni == 0) { //Si no tenim cap botó seleccionat, n'agafem un aleatòriament
         vPsIni = 1+Math.floor((j-1)*Math.random()) ;
         //alert ("Activant Pestanya a l'atzar; _mc"+i+"bt"+vPsIni +"_");
         document.getElementById("mc"+i+"ps"+vPsIni).style.display = "block";
         document.getElementById("mc"+i+"ps"+vPsIni).style.visibility = "visible";
         document.getElementById("mc"+i+"bt"+vPsIni).className="mcBotoSel";
     } 
  }
 }
 
 function MetaCaixaMostraPestanya(){
  //S'executa al clicar una pestanya,
  //aquella es fa visible i les altres s'oculten
  var vMcNom = this.id.substr(0,3); //A partir del nom del botó, deduïm el nom de la caixa
  var vIndex = this.id.substr(5,1); //I l'index
 
  var i=1
  for (i=1;i<=9;i++){        //busquem totes les pestanyes d'aquella caixa
      //alert(vMcNom+"ps"+i);
        var vPsElem = document.getElementById(vMcNom+"ps"+i);
        if (!vPsElem) break;
        if (vIndex==i){ //Si és la pestanya bona la mostrem i canviem la classe de botó
                vPsElem.style.display = "block";
                vPsElem.style.visibility = "visible";
                document.getElementById(vMcNom+"bt"+i).className="mcBotoSel";
        } else {             //Sinó, l'ocultem i canviem la classe de botó
                vPsElem.style.display = "none";
                vPsElem.style.visibility = "hidden";
                document.getElementById(vMcNom+"bt"+i).className="mcBoto";
        }
  }
  return false; //evitem la recàrrega de la pàgina
 }
 
 $(MetaCaixaInit);
 
/**
 * Collapsible tables
 *
 * Allows tables to be collapsed, showing only the header. See [[Wikipedia:NavFrame]].
 * @maintainer [[User:R. Koot]] (on Wikipedia)
 */
 
var autoCollapse = 2;
var collapseCaption = 'hide';
var expandCaption = 'show';
 
function collapseTable( tableIndex ) {
	var i;
	var Button = document.getElementById( 'collapseButton' + tableIndex );
	var Table = document.getElementById( 'collapsibleTable' + tableIndex );
 
	if ( !Table || !Button ) {
		return false;
	}
 
	var Rows = Table.getElementsByTagName( 'tr' );
 
	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 createCollapseButtons() {
	var i;
	var tableIndex = 0;
	var NavigationBoxes = {};
	var Tables = document.getElementsByTagName( 'table' );
 
	for ( i = 0; i < Tables.length; i++ ) {
		if ( $(Tables[i]).hasClass('collapsible' ) ) {
			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.setAttribute( 'id', 'collapseButton' + tableIndex );
			ButtonLink.setAttribute( 'href', 'javascript:collapseTable(' + tableIndex + ');' );
			ButtonLink.appendChild( ButtonText );
 
			Button.appendChild( document.createTextNode( '[' ) );
			Button.appendChild( ButtonLink );
			Button.appendChild( document.createTextNode( ']' ) );
 
			var Header = Tables[i].getElementsByTagName( 'tr' )[0].getElementsByTagName( 'th' )[0];
			/* only add button and increment count if there is a header row to work with */
			if (Header) {
				Header.insertBefore( Button, Header.childNodes[0] );
				tableIndex++;
			}
		}
	}
 
	for ( i = 0; i < tableIndex; i++ ) {
		if ( $(NavigationBoxes[i]).hasClass('collapsed' ) || ( tableIndex >= autoCollapse && $(NavigationBoxes[i]).hasClass('autocollapse' ) ) ) {
			collapseTable( i );
		}
	}
}
 /*HERE FINISHES THE WORKING-CODE OF "METABOXES"*/
if (mw.config.get('wgAction') == "edit" || mw.config.get('wgAction') == "submit" || mw.config.get('wgCanonicalSpecialPageName') == 'Search') { // scripts specific to editing pages
      importScript('MediaWiki:Common.js/edit.js');
    }

// </nowiki>


/* == Make it easy to update language name-to-code and code-to-name data modules == */
// This regex will always match.
if (['Module:Languages/code_to_canonical_name', 'Module:Languages/canonical_names']
.indexOf(mw.config.get('wgPageName').match(/^[^\/]*(?:\/[^\/]+)?/)[0]) !== -1)
	importScript('MediaWiki:UpdateLanguageNameAndCode.js');

// == "Did you mean" auto redirect ==
/**
 * This will redirect in 3 seconds if a link enclosed in id="did-you-mean"
 * is found, and add the text "Auto-redirected from X" under the top header
 * if a rdfrom is passed in the get parameters.
 * Pages with wynn ([[ƿ]]) will be redirected immediately.
**/

$.when(mw.loader.using(["user", "mediawiki.util"]), $.ready).done(function(){
	if (window.disableAutoRedirect) return;
	
	var rdFromValue = mw.util.getParamValue("rdfrom");
	if (rdFromValue) {
		$('#siteSub').after(
			$('<div>').attr("id", 'contentSub')
				.append(document.createTextNode(wgULS("(自动重定向自 ", "(自動重新導向自 ")))
				.append($('<a>', {
					href: mw.util.getUrl(rdFromValue, {redirect:"no"}),
					addClass: 'new'
				}).text(rdFromValue))
				.append(document.createTextNode(")")));
	} else {
		// Redirect as quickly as possible from [[ƿ]] title to [[w]] title.
		var pageTitle = mw.config.get("wgTitle");
		var isWynnTitle = /ƿ/i.test(pageTitle);
		var didYouMean = $('#did-you-mean a').html();
		var target = didYouMean ? didYouMean
			: isWynnTitle ? $('#go-to-search-page a').html()
			: null;
		var timeout = isWynnTitle ? 0 : 5000;
		window.setTimeout(function () {	
			var canRedirect = mw.util.getParamValue("redirect") != "no";
			var action = mw.config.get("wgAction");
			
			if (target && target !== pageTitle && canRedirect &&
				(jQuery.cookie('WiktionaryDisableAutoRedirect') != 'true') &&
				(action == "view" || (isWynnTitle && action == "edit")) &&
				mw.config.get('wgArticleId') === 0 &&
				mw.config.get('wgNamespaceNumber') === 0 &&
				!/Redirected from/.test(jQuery('#contentSub').html())
			) {
				window.location = mw.util.getUrl(target, { rdfrom: pageTitle });
			}
		}, timeout);
	}
});