MediaWiki:Common.js
外觀
註:重取頁面,文方新焉。
- Firefox / Safari:押 Shift 並點 重新載入,或合鍵 Ctrl-F5 或 Ctrl-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": "Insert text"};
mwCustomEditButtons[mwCustomEditButtons.length] = {
"imageFile": "/media/wikipedia/en/c/c9/Button_strike.png",
"speedTip": "Strike",
"tagOpen": "<s>",
"tagClose": "</s>",
"sampleText": "Strike-through text"};
mwCustomEditButtons[mwCustomEditButtons.length] = {
"imageFile": "/media/wikipedia/en/1/13/Button_enter.png",
"speedTip": "Line break",
"tagOpen": "<br />",
"tagClose": "",
"sampleText": ""};
mwCustomEditButtons[mwCustomEditButtons.length] = {
"imageFile": "/media/wikipedia/en/8/80/Button_upper_letter.png",
"speedTip": "Superscript",
"tagOpen": "<sup>",
"tagClose": "</sup>",
"sampleText": "Superscript text"};
mwCustomEditButtons[mwCustomEditButtons.length] = {
"imageFile": "/media/wikipedia/en/7/70/Button_lower_letter.png",
"speedTip": "Subscript",
"tagOpen": "<sub>",
"tagClose": "</sub>",
"sampleText": "Subscript text"};
mwCustomEditButtons[mwCustomEditButtons.length] = {
"imageFile": "/media/wikipedia/en/5/58/Button_small.png",
"speedTip": "Small",
"tagOpen": "<small>",
"tagClose": "</small>",
"sampleText": "Small Text"};
mwCustomEditButtons[mwCustomEditButtons.length] = {
"imageFile": "/media/wikipedia/en/3/34/Button_hide_comment.png",
"speedTip": "Insert hidden Comment",
"tagOpen": "<!-- ",
"tagClose": " -->",
"sampleText": "Comment"};
mwCustomEditButtons[mwCustomEditButtons.length] = {
"imageFile": "/media/wikipedia/en/1/12/Button_gallery.png",
"speedTip": "Insert a picture gallery",
"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": "Insert block of quoted text",
"tagOpen": "<blockquote>\n",
"tagClose": "\n</blockquote>",
"sampleText": "Block quote"};
mwCustomEditButtons[mwCustomEditButtons.length] = {
"imageFile": "/media/wikipedia/en/6/60/Button_insert_table.png",
"speedTip": "Insert a table",
"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": "Insert a reference",
"tagOpen": "<ref>",
"tagClose": "</ref>",
"sampleText": "Insert footnote text here"};
}
/*</nowiki>*/