Jump to content

User:Inkwina/stats.js

From Wikipedia, the free encyclopedia
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. See the talk page for more details.
//
//To use this function add {{subst:js|User:Dr pda/prosesize.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');
          if(result > 10240){
            result = (result/1024).toFixed(0)+'&nbsp;kB';
          }
          else{
            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/1024).toFixed(0)+'&nbsp;kB';
  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 countSyllables(oneWord) {
  syllableCnt=0;
  oneWord = oneWord.toLowerCase();

// Specific common exceptions that don't follow the rule set below are handled individually
// Array of problem words (with word as key, syllable count as value)

  var problemWords = { "simile"    : 3,
                       "forever"   : 3,
                       "shoreline" : 2
                      };

  if( oneWord in problemWords ) {
    return problemWords[oneWord];
  }
  
  // These syllables would be counted as two but should be one
  var subSyllables = new Array(
                 'cial'
                ,'tia'
                ,'cius'
                ,'cious'
                ,'giu'
                ,'ion'
                ,'iou'
                ,'sia$'
                ,'[^aeiuoyt]{2,}ed$'
                ,'.ely$'
                ,'[cg]h?e[rsd]?$'
                ,'rved?$'
                ,'[aeiouy][dt]es?$'
                ,'[aeiouy][^aeiouydt]e[rsd]?$'
                ,'^[dr]e[aeiou][^aeiou]+$' // Sorts out deal, deign etc
                ,'[aeiouy]rse$' // Purse, hearse
            );

  // These syllables would be counted as one but should be two
  var addSyllables = new Array(
                 'ia'
                ,'riet'
                ,'dien'
                ,'iu'
                ,'io'
                ,'ii'
                ,'[aeiouym]bl$'
                ,'[aeiou]{3}'
                ,'^mc'
                ,'ism$'
                ,'([^aeiouy])\1l$'
                ,'[^l]lien'
                ,'^coa[dglx].'
                ,'[^gq]ua[^auieo]'
                ,'dnt$'
                ,'uity$'
                ,'ie(r|st)$'
            );

  // Single syllable prefixes and suffixes
  var prefixSuffix = new Array(
                 '/^un/'
                ,'/^fore/'
                ,'/ly$/'
                ,'/less$/'
                ,'/ful$/'
                ,'/ers?$/'
                ,'/ings?$/'
            );

  // Remove prefixes and suffixes and count how many were taken
  //php $strWord = preg_replace($arrPrefixSuffix, '', $strWord, -1, $intPrefixSuffixCount);
  var psCount=0;
  for (i=0; i<prefixSuffix.length; i++) {
      psCount += oneWord.match(prefixSuffix[i]+'gi').length;
      oneWord =  oneWord.replace(prefixSuffix[i]+'gi',"");
   }

// Removed non-word characters from word

  return syllableCnt;
}


function calcARI(sentence_count,word_count,letter_count) {
 return ( ( 4.71*(letter_count/word_count) ) + ( 0.5*(word_count/sentence_count) ) - 21.43 ).toFixed(2);
}

function getReadability() {
  readabilityString="";
  readabilityString +="<i>Automated Readability Index: </i>"+calcARI(sentence_count,word_count,letter_count);

  return readabilityString;
}
function getDocumentSize(){
contentDivName = '';
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(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);
var readability_value = document.createElement("li");
readability_value.id = "readbility-scores";
output.appendChild(readability_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(wgAction != 'submit'){
 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/1024).toFixed(0)+'&nbsp;kB';
  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;
letter_count = 0;
sentence_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);
   clean_text = para.innerHTML.replace(/(<([^>]+)>)/ig,"");
   word_count += clean_text.split(' ').length;
   sentence_count += clean_text.split(/[\.!?]/).length;
   letter_count += clean_text.replace(/[^a-z]+/ig,"").length;
   para.style.cssText = "background-color:yellow";
  }
}
if((prose_size-refmark_size)>10240){
  prose_value.innerHTML='<b>Prose size (text only): </b>'+((prose_size-refmark_size)/1024).toFixed(0)+'&nbsp;kB ('+sentence_count+' sentences, '+word_count+' words, '+letter_count+' letters) "readable prose size"';
}
else{
  prose_value.innerHTML='<b>Prose size (text only): </b>'+(prose_size-refmark_size)+'&nbsp;B ('+word_count+' words) "readable prose size"';
}
if((prose_size_html-refmark_size_html)>10240){
  prose_html_value.innerHTML='<b>Prose size (including all HTML code): </b>'+((prose_size_html-refmark_size_html)/1024).toFixed(0)+'&nbsp;kB';
}
else{
  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;
  }
}
if((ref_size+refmark_size)>10240){
  ref_value.innerHTML='<b>References (text only): </b>'+((ref_size+refmark_size)/1024).toFixed(0)+'&nbsp;kB';
}
else{
  ref_value.innerHTML='<b>References (text only): </b>'+(ref_size+refmark_size)+'&nbsp;B';
}
if((ref_size_html+refmark_size_html)>10240){
  ref_html_value.innerHTML='<b>References (including all HTML code): </b>'+((ref_size_html+refmark_size_html)/1024).toFixed(0)+'&nbsp;kB';
}
else{
  ref_html_value.innerHTML='<b>References (including all HTML code): </b>'+(ref_size_html+refmark_size_html)+'&nbsp;B';
}
readability_value.innerHTML='<b>Readbility: </b>'+getReadability();
//get correct name of article from wikipedia-defined global variables
var pageNameUnderscores = 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 = wgScriptPath + '/api.php?action=query&prop=revisions&rvprop=size&format=xml&revids=' + wgCurRevisionId;
 loadXMLDocPassingTemplate(searchURL,getWikiText,pageNameSpaces);
}
else if(wgAction == 'submit'){
  //Get size of text in edit box
  result = document.getElementById('wpTextbox1').value.length;
  if(result > 10240){
    result = (result/1024).toFixed(0)+'&nbsp;kB';
  }
  else{
    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(wgAction == 'edit' || (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(wgAction == 'view' || wgAction == 'submit' || wgAction == 'historysubmit' || wgAction == 'purge'){
   mw.util.addPortletLink('p-tb', 'javascript:getDocumentSize()', 'Page size', 't-page-size', 'Calculate page and prose size', '', '');
 }
});
//</pre>