Wikipedia:WikiProject User scripts/Scripts/TwoColumns.js
Appearance
From Wikipedia, the free encyclopedia
/* TwoColumns, version [0.0.5] Documentation: Wikipedia:WikiProject User scripts/Scripts/TwoColumns */ if(mw.config.get('wgAction')=='view'&&mw.config.get('wgCanonicalNamespace')=='')addOnloadHook(fr_format) varfr_columns; varimgRegExp=/(thumb|frame)/i; vartrashNodes; functionfr_format(){ fr_addButton(); fr_columns=fr_getCookie('fr_columns');if(!(0<1*fr_columns))fr_columns=1; trashNodes=newArray; if(fr_columns==1)return; varbodyContent=document.getElementById('bodyContent'); if(!bodyContent||!bodyContent.innerHTML||bodyContent.innerHTML=='')return; varallNodes=bodyContent.childNodes; vargroup=newArray,node,groupArea=0; for(vari=allNodes.length-1;0<=i;i--){ node=allNodes[i]; varpre=node.tagName=="PRE"||(node.tagName=="DIV"&&node.childNodes[1]&&node.childNodes[1].tagName=='PRE') if(node.nodeValue&&node.nodeValue.substr(0,1)=="\n"){ // } else if (node.tagName=="p" || node.tagName=="P" || node.tagName=="ul" || node.tagName=="UL" ) { }elseif(node.tagName&&node.tagName.substr(0,1)!="H"&&node.tagName.substr(0,5)!="TABLE"&&node.tagName.substr(0,5)!="SCRIPT"&&node.style.MozColumnCount<=0&&!pre){//everything but H group.push(node); groupArea+=node.clientHeight*node.clientWidth; }else{ if(node.tagName&&node.tagName.substr(0,1)=="H"){ varprevNode=node; varcount=0; do{ do{ prevNode=prevNode.previousSibling;count++; }while(prevNode&&(prevNode.clientHeight==0||prevNode.clientHeight===undefined)); if(prevNode&&prevNode.className&&imgRegExp.test(prevNode.className)){ group.push(prevNode);i=i-count;count=0; groupArea+=prevNode.clientHeight*prevNode.clientWidth; } }while(prevNode&&prevNode.className&&imgRegExp.test(prevNode.className)) } if(0<group.length)fr_layoutDiv(group,groupArea); group=newArray;groupArea=0; } } for(vari=trashNodes.length-1;0<=i;i--){ trashNodes[i].parentNode.removeChild(trashNodes[i]); } } functionfr_layoutDiv(aGroup,groupArea){ varcontentWidth=aGroup[0].parentNode.clientWidth; if(groupArea<100*contentWidth)return; varstart=0,stop=aGroup.length-1; varpieces=Math.round(groupArea/(window.innerHeight*contentWidth)+0.5); vartargetArea=groupArea/pieces; vartargetHeight=(pieces==1)?window.innerHeight:targetArea/contentWidth; vardivArea=0,first=true,imgHeight=0; for(vari=stop;0<=i;i--){ if(aGroup[i].className&&imgRegExp.test(aGroup[i].className)){ imgHeight+=aGroup[i].clientHeight; } divArea+=aGroup[i].clientHeight*aGroup[i].clientWidth; if(targetArea<divArea||targetHeight<imgHeight){ fr_createDiv(aGroup,i+1,stop,fr_columns,first); first=false; stop=i; if(aGroup[i].className&&imgRegExp.test(aGroup[i].className)){ imgHeight=aGroup[i].clientHeight; }else{ imgHeight=0; } divArea=aGroup[i].clientHeight*aGroup[i].clientWidth; } } if(0<=stop){ divArea=0; for(i=stop;0<=i;i--){ divArea+=aGroup[i].clientHeight*aGroup[i].clientWidth; } if(100*contentWidth<divArea)fr_createDiv(aGroup,0,stop,fr_columns,first); } } functionfr_createDiv(aGroup,start,stop,columns,noHR){// start, stop: inclusive, (counting in the Group !), e.g. 0..3 if(stop<start)return; varnewDiv=document.createElement('div'); newDiv.style.MozColumnCount=columns; newDiv.style.MozColumnGap='2em'; newDiv.style.textAlign='justify'; vartooBig=false; for(vari=stop;start<=i;i--){// first append the thumb if(imgRegExp.test(aGroup[i].className)){ newNode=aGroup[i].cloneNode(true); newDiv.appendChild(newNode); if(imgRegExp.test(aGroup[i].className)&&aGroup[i].parentNode.clientWidth/columns<newNode.clientWidth){ tooBig=true; } } } for(vari=stop;start<=i;i--){ if(!imgRegExp.test(aGroup[i].className)){ newNode=aGroup[i].cloneNode(true); newDiv.appendChild(newNode) } } if(window.innerHeight<newDiv.clientHeight||tooBig/* window.innerHeight-10 < imgHeight */){// safety valve: too big return; } aGroup[start].parentNode.insertBefore(newDiv,aGroup[start]); if(!noHR){ varHR=document.createElement('HR'); newDiv.parentNode.insertBefore(HR,newDiv); } for(vari=stop;start<=i;i--){ trashNodes.push(aGroup[i]);//newDiv.parentNode.removeChild(aGroup[i]) } } // Button to increment the number of columns functionfr_addButton(){ varnode=document.getElementById('p-personal'); if(!node)returnnull; node=node.getElementsByTagName("ul")[0]; if(!node)returnnull; varlink=document.createElement("img"); link.src='http://upload.wikimedia.org/wikipedia/commons/f/f5/FastReader_logo.PNG'; link.appendChild(document.createTextNode("FastReader")); link.onclick=function(){fr_next()}; varitem=document.createElement("li"); item.appendChild(link); link.setAttribute("title",'FastReader'); node.appendChild(item);// IE compatibility (?) } functionfr_next(){ fr_columns=fr_columns%2+1; fr_setCookie('fr_columns',fr_columns); document.location.reload(); }; // Cookie routines to save the number of columns functionfr_getCookie(cookieName){ varcookie=' '+document.cookie; varsearch=' '+cookieName+'='; varcookieValue=''; varoffset=0; varend=0; offset=cookie.indexOf(search); if(offset!=-1){ offset+=search.length; end=cookie.indexOf(';',offset) if(end==-1){ end=cookie.length; } cookieValue=cookie.substring(offset,end); cookieValue=cookieValue.replace(/\\+/g,' '); cookieValue=decodeURIComponent(cookieValue); } return(cookieValue); } functionfr_setCookie(name,value){ varcookie=name+'='+encodeURIComponent(value); varcookieExpire=newDate(); expires=cookieExpire.setTime(cookieExpire.getTime()+30*24*60*60*1000); expires=cookieExpire.toUTCString(); cookie+='; expires='+expires; document.cookie=cookie; return; }