Jump to content

User:Dr pda/prosesizebytes.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
 //<pre>
//This function adds a link to the toolbox which, when clicked, displays the size of the page
//and the size of the prose in bytes. See the talk page for more details.
//
//To use this function add {{subst:js|User:Dr pda/prosesizebytes.js}} to your monobook.js
//
function loadXMLDocPassingTemplate(url,handler, page)
{
    // branch for native XMLHttpRequest object
    if (window.XMLHttpRequest) {
        var req = new XMLHttpRequest();
    }
    // branch for IE/Windows ActiveX version
    else if (window.ActiveXObject) {
        var req = new ActiveXObject("Microsoft.XMLHTTP");
   }
   if (req) {
     req.onreadystatechange = function () {handler(req, page)};
     req.open("GET", url, true);
     req.send("");
   }
}

function getWikiText(req, page) {
    // only if req shows "loaded"
    if (req.readyState == 4) {
        // only if "OK"
        if (req.status == 200) {
            // ...processing statements go here...
	 response = req.responseXML.documentElement;
         var rev = response.getElementsByTagName('rev');
	 if(rev.length > 0){
	   result = rev[0].getAttribute('size');
           result = result+'&nbsp;B';
           wiki_value = document.createElement("li");
	   wiki_value.id = "wiki-size";
	   wiki_value.innerHTML = '<b>Wiki text: </b>'+result;
	   var output = document.getElementById("document-size-stats");
	   prose_value = document.getElementById("prose-size");
	   output.insertBefore(wiki_value,prose_value);
	 }
	 else{
	  //alert("There was a problem using the Wikipedia Search to find the wiki text size\nEither the search is not working or the correct article did not appear on the first page of results");
           wiki_value = document.createElement("li");
	   wiki_value.id = "wiki-size";
	   wiki_value.innerHTML = '<b>Wiki text: </b>Problem getting wiki text size';
	   var output = document.getElementById("document-size-stats");
	   prose_value = document.getElementById("prose-size");
	   output.insertBefore(wiki_value,prose_value);
	 }
        } else {
            alert("There was a problem retrieving the XML data:\n" +
                req.statusText);
        }
    }
}

function getFileSize(req, page) {
    // only if req shows "loaded"
    if (req.readyState == 4) {
        // only if "OK"
        if (req.status == 200) {
            // ...processing statements go here...
	  var fsize = req.responseText.length;
	  window.status = fsize;
	  var total_value = document.createElement("li");
	  total_value.id = "total-size";
	  total_value.innerHTML='<b>File size: </b>'+fsize+'&nbsp;B';
	  var output = document.getElementById("document-size-stats");
	  var prose_html_value = document.getElementById("prose-size-html");
	  output.insertBefore(total_value,prose_html_value);
         } else {
            alert("There was a problem retrieving the XML data:\n" +
                req.statusText + "\n(" + url + ")");
        }
    }
}

function getLength(id){
 var textLength = 0;
 for(var i=0;i<id.childNodes.length; i++){
  if(id.childNodes[i].nodeName == '#text'){
   textLength += id.childNodes[i].nodeValue.length;
  }
  else if(id.childNodes[i].id == 'coordinates' || id.childNodes[i].className.indexOf('emplate') != -1){
    //special case for {{coord}} and {{fact}}-like templates
    //Exclude from length, and don't set background yellow
    id.childNodes[i].style.cssText = 'background-color:white';
  }
  else{
    textLength += getLength(id.childNodes[i]);
  }
 }
 return textLength;
}

function getRefMarkLength(id,html){
 var textLength = 0;
 for(var i=0;i<id.childNodes.length; i++){
  if(id.childNodes[i].className == 'reference'){
   textLength += (html)? id.childNodes[i].innerHTML.length : getLength(id.childNodes[i]);
  }
 }
 return textLength;
}

function getDocumentSize(){
 contentDivName = '';
 var skin = mw.config.get('skin');
 if(skin == 'vector' || skin == 'monobook' || skin == 'chick' || skin == 'myskin' || skin == 'simple'){
   contentDivName = 'bodyContent';
 }
 else if (skin == 'modern'){
   contentDivName = 'mw_contentholder';
 }
 else if (skin == 'standard' || skin == 'cologneblue' || skin == 'nostalgia'){
   contentDivName = 'article';
 }
 else{
   //fallback case; the above covers all currently existing skins
   contentDivName = 'bodyContent';
 }
 //Same for all skins if previewing page
 if(mw.config.get('wgAction') == 'submit') contentDivName = 'wikiPreview';
 
 var bodyContent = document.getElementById(contentDivName);
 if(document.getElementById("document-size-stats")){
   //if statistics already exist, turn them off and remove highlighting
   var output = document.getElementById("document-size-stats");
   var oldStyle = output.className;
   var pList = bodyContent.getElementsByTagName("p");
   for(var i=0;i<pList.length; i++){
     if( (pList[i].parentNode.parentNode.id == contentDivName && pList[i].parentNode.className != 'previewnote') || pList[i].parentNode.parentNode.nodeName == "BLOCKQUOTE") pList[i].style.cssText = oldStyle;
   }
   output.parentNode.removeChild(output);
   var header = document.getElementById("document-size-header");
   header.parentNode.removeChild(header);
 }
 else{
 var output = document.createElement("ul");
 output.id = "document-size-stats";

 var prose_html_value = document.createElement("li");
 prose_html_value.id = "prose-size-html";
 output.appendChild(prose_html_value);

 var ref_html_value = document.createElement("li");
 ref_html_value.id = "ref-size-html";
 output.appendChild(ref_html_value);

 var prose_value = document.createElement("li");
 prose_value.id = "prose-size";
 output.appendChild(prose_value);
 output.className = bodyContent.getElementsByTagName("p").item(0).style.cssText;

 var ref_value = document.createElement("li");
 ref_value.id = "ref-size";
 output.appendChild(ref_value);

 bodyContent.insertBefore(output, bodyContent.firstChild);

 var header = document.createElement("span");
 header.id = "document-size-header";
 header.innerHTML = '<br/>Document statistics: <small><i>(See <a href="//en.wikipedia.org/wiki/User_talk:Dr_pda/prosesize.js">here</a> for details.)<i></small>';
 bodyContent.insertBefore(header,output);

 //File size not well defined for preview mode or section edit
 if(mw.config.get('wgAction') != 'submit'){
   //If browser supports document.fileSize property (IE)
   if(document.fileSize){
     var total_value = document.createElement("li");
     total_value.id = "total-size";
     total_value.innerHTML='<b>File size: </b>'+document.fileSize+'&nbsp;B';
     output.insertBefore(total_value,prose_html_value);
   }
   else{
    loadXMLDocPassingTemplate(location.pathname,getFileSize,'')
   }
 }
 
 //Get size of images only if browser supports filesize property (IE)
 var iList = bodyContent.getElementsByTagName("img");
 if(iList.length >0 && iList[0].fileSize){
 //Get size of images included in document
   var image_size = 0;
   var first_magnify = true;

   for (var i=0;i<iList.length; i++){
    var im = iList[i];
    if(im.getAttribute("src").indexOf("magnify-clip.png") != -1){
      if(first_magnify){
        image_size += im.fileSize*1;
        first_magnify = false;
      }
    }
    else{
      image_size += im.fileSize*1;
    }
   }
   var image_value = document.createElement("li");
   image_value.id = "image-size";
   image_value.innerHTML='<b>Images: </b>'+image_size+'&nbsp;B';
   output.appendChild(image_value);

  }
 //Calculate prose size and size of reference markers ([1] etc)
 var pList = bodyContent.getElementsByTagName("p");

 prose_size = 0;
 prose_size_html = 0;
 refmark_size = 0;
 refmark_size_html = 0;
 word_count = 0;
 for(var i=0;i<pList.length; i++){
   var para = pList[i];
   if( (para.parentNode.parentNode.id == contentDivName && para.parentNode.className != 'previewnote') || para.parentNode.parentNode.nodeName == "BLOCKQUOTE"){
    prose_size += getLength(para);
    prose_size_html += para.innerHTML.length;
    refmark_size += getRefMarkLength(para,false);
    refmark_size_html += getRefMarkLength(para,true);
    word_count += para.innerHTML.replace(/(<([^>]+)>)/ig,"").split(' ').length
    para.style.cssText = "background-color:yellow";
   }
 }

 prose_value.innerHTML='<b>Prose size (text only): </b>'+(prose_size-refmark_size)+'&nbsp;B ('+word_count+' words) "readable prose size"';

 prose_html_value.innerHTML='<b>Prose size (including all HTML code): </b>'+(prose_size_html-refmark_size_html)+'&nbsp;B';


 //Calculate size of references (i.e. output of <references/>)
 var rList = bodyContent.getElementsByTagName("ol");
 var ref_size = 0;
 var ref_size_html = 0;
 for (var i=0; i<rList.length; i++){
   if(rList[i].parentNode.className == "references"){
     ref_size = getLength(rList[i]);
     ref_size_html = rList[i].innerHTML.length;
   }
 }

 ref_value.innerHTML='<b>References (text only): </b>'+(ref_size+refmark_size)+'&nbsp;B';

 ref_html_value.innerHTML='<b>References (including all HTML code): </b>'+(ref_size_html+refmark_size_html)+'&nbsp;B';

 //get correct name of article from wikipedia-defined global variables
 var pageNameUnderscores = mw.config.get('wgPageName');
 var pageNameSpaces = pageNameUnderscores.replace(/_/g,' ')

 //if page is a permalink, diff, etc don't try to search
 if(!location.pathname.match('/w/index.php')){ 
  //Get revision size from API
  var searchURL = mw.config.get('wgScriptPath') + '/api.php?action=query&prop=revisions&rvprop=size&format=xml&revids=' + mw.config.get('wgCurRevisionId');
  loadXMLDocPassingTemplate(searchURL,getWikiText,pageNameSpaces);
 }
 else if(mw.config.get('wgAction') == 'submit'){
   //Get size of text in edit box
   result = document.getElementById('wpTextbox1').value.length;
   result = result+'&nbsp;B';
   wiki_value = document.createElement("li");
   wiki_value.id = "wiki-size";
   wiki_value.innerHTML = '<b>Wiki text: </b>'+result;
   var output = document.getElementById("document-size-stats");
   prose_value = document.getElementById("prose-size");
   output.insertBefore(wiki_value,prose_value);
 }

}
}

$(function () {
  if(mw.config.get('wgAction') == 'edit' || (mw.config.get('wgAction') == 'submit' && document.getElementById('wikiDiff')) ){
    mw.util.addPortletLink('p-tb', 'javascript:alert("You need to preview the text for the prose size script to work in edit mode.")', 'Page size', 't-page-size', 'Calculate page and prose size', '', '');
    document.getElementById("t-page-size").firstChild.style.cssText = "color:black;"
  }
  else if(mw.config.get('wgAction') == 'view' || mw.config.get('wgAction') == 'submit' || mw.config.get('wgAction') == 'historysubmit' || mw.config.get('wgAction') == 'purge'){
     mw.util.addPortletLink('p-tb', 'javascript:getDocumentSize()', 'Page size', 't-page-size', 'Calculate page and prose size', '', '');
  }
});

 //</pre>