MediaWiki:Gadget-MergeRefBracket.js
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google Chrome、Firefox、Microsoft Edge及Safari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
/*
本小工具可以將連續出現的<ref>標籤由分開幾對括號數字組合成一對括號包含多個數字
如: [1][2][4][7] 變成 [1,2,4,7]
*/
window.mergeRefBracket=function(){
// Helper function to move DOM element
function elementMoveto( node, refNode, pos ) {
if(node && refNode){
var parent=refNode.parentNode;
if (pos && pos=='after') { refNode=refNode.nextSibling; }
try {
parent.insertBefore( node, refNode );
} catch ( DOMException ) {};
}
}
var i, j;
//擷取所有<sups>
var sups=new Array();
i=document.getElementById("content").getElementsByTagName("sup").length;
while(i-->0){
sups.push(document.getElementById("content").getElementsByTagName("sup")[i]);
}
function isRefSup(suptag){ //判斷是否為<ref>所產生的<sup>
if(!suptag) return false;
if((""+suptag.id).indexOf("cite_ref")==0 && suptag.className=="reference")
if(suptag.childNodes.length==1)
if((""+suptag.childNodes[0].tagName).toLowerCase()=="a")
if((""+suptag.childNodes[0].href).indexOf("#cite_note-")!=-1)
if(suptag.childNodes[0].childNodes.length==1)
if((""+suptag.childNodes[0].childNodes[0].nodeName).toLowerCase()=="#text")
if(suptag.childNodes[0].childNodes[0].nodeValue.indexOf("[")==0)
return true;
if((""+suptag.tagName).toLowerCase()=="span")
if(suptag.id=="refTag-cite_ref-sup" || suptag.id=="noteTag-cite_ref-sup")
if(suptag.childNodes.length==1)
return isRefSup(suptag.childNodes[0]);
return false;
}
function getGroup(suptag){ //擷取<ref>的group文字
var temp=suptag.childNodes[0].childNodes[0].nodeValue.split(" ");
if(temp.length<2) return "";
temp.length-=1;
return temp.join(" ").substring(1);
}
function getNumber(suptag){ //擷取<ref>的序號
var temp=suptag.childNodes[0].childNodes[0].nodeValue.split(" ");
var num=temp[temp.length-1];
for(var i=0; i<num.length; i++){
if(!isNaN(num.charAt(i))) break;
}
return num.substring(i, num.length-1);
}
function compareStr(a,b){ //比較字串
a=""+a;
b=""+b;
if(a==b) return 0;
if(a.length>b.length) return 1;
if(a.length<b.length) return -1;
for(var i=0; i<a.length; i++){
if(a.charCodeAt(i)>b.charCodeAt(i) ) return 1;
if(a.charCodeAt(i)<b.charCodeAt(i) ) return -1;
}
return 0;
}
var cursup, curGroup, curNum;
var tags=new Array();
var groups=new Array();
var groupIndex;
var posSpan, addpos, nextSibling, moveobj;
//開始處理
while(sups.length>0){
cursup=sups.pop();
//把各<sup>歸類
if(isRefSup(cursup)){
curGroup=(cursup.group_name=getGroup(cursup));
curNum=getNumber(cursup);
for(groupIndex=groups.length; groupIndex-->0; ){
if(curGroup==groups[groupIndex]) break;
}
if(groupIndex<0){
groupIndex=groups.push(curGroup)-1;
tags.push(new Array());
}
for(i=tags[groupIndex].length; i-->0; ){
if(compareStr(curNum, getNumber(tags[groupIndex][i]))>0 ) break;
}
tags[groupIndex].splice(i+1, 0, cursup);
}
//檢查連串是否已結束
//相容[[Template:RefTag]]和[[Template:noteTag]]
nextSibling=cursup.nextSibling;
if(!nextSibling){
if(cursup.parentNode.tagName.toLowerCase()=="span")
if(cursup.parentNode.childNodes.length==1)
if(cursup.parentNode.id=="refTag-cite_ref-sup" || cursup.parentNode.id=="noteTag-cite_ref-sup"){
nextSibling=cursup.parentNode.nextSibling;
}
}
if(!isRefSup(nextSibling)){ //如已結束
//開始合併各註標
//決定擺放位置
posSpan=document.createElement("span", "");
addpos=cursup;
if((""+cursup.parentNode.tagName).toLowerCase()=="span")
if(cursup.parentNode.childNodes.length==1)
if(cursup.parentNode.id=="refTag-cite_ref-sup" || cursup.parentNode.id=="noteTag-cite_ref-sup"){
addpos=cursup.parentNode;
}
elementMoveto(posSpan, addpos, "before");
//調整文字
for(i=groups.length; i-->0; ){
for(j=tags[i].length; j-->0; ){
tags[i][j].childNodes[0].childNodes[0].nodeValue=getNumber(tags[i][j]);
if(j==tags[i].length-1){
tags[i][j].childNodes[0].childNodes[0].nodeValue+="]";
}else{
tags[i][j].childNodes[0].childNodes[0].nodeValue+=",";
}
if(j==0){
if(!!groups[i]){
tags[i][j].childNodes[0].childNodes[0].nodeValue=groups[i]+" "+tags[i][j].childNodes[0].childNodes[0].nodeValue;
}
tags[i][j].childNodes[0].childNodes[0].nodeValue="["+tags[i][j].childNodes[0].childNodes[0].nodeValue;
}
//重組各標籤
moveobj=tags[i][j];
if((""+tags[i][j].parentNode.tagName).toLowerCase()=="span")
if(tags[i][j].parentNode.childNodes.length==1)
if(tags[i][j].parentNode.id=="refTag-cite_ref-sup" || tags[i][j].parentNode.id=="noteTag-cite_ref-sup"){
moveobj=tags[i][j].parentNode;
}
elementMoveto(moveobj, posSpan, "after");
}
}
posSpan.parentNode.removeChild(posSpan);
tags=new Array();
groups=new Array();
}
}
//處理完成
window.mergeRefBracket=function(){};
}
window.load_Merge_Simplify=function(){
if( (""+(typeof window.mergeRefBracket)).toLowerCase()=="function") window.mergeRefBracket();
if( (""+(typeof window.simplifyRefNotesTag)).toLowerCase()=="function") window.simplifyRefNotesTag();
window.load_Merge_Simplify=function(){};
}
$( function(){
if(mw.config.get("wgNamespaceNumber")<0)return;
window.load_Merge_Simplify();
});