Jump to content
Wikipedia The Free Encyclopedia

Wikipedia:WikiProject User scripts/Scripts/TwoColumns.js

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;
 }

AltStyle によって変換されたページ (->オリジナル) /