User:Dr pda/prosesizebytes.js

//

//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+' B';

wiki_value = document.createElement("li");

wiki_value.id = "wiki-size";

wiki_value.innerHTML = 'Wiki text: '+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 = 'Wiki text: 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='File size: '+fsize+' 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

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

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

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 = '
Document statistics: (See here for details.)';

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='File size: '+document.fileSize+' 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

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='Images: '+image_size+' 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

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='Prose size (text only): '+(prose_size-refmark_size)+' B ('+word_count+' words) "readable prose size"';

prose_html_value.innerHTML='Prose size (including all HTML code): '+(prose_size_html-refmark_size_html)+' B';

//Calculate size of references (i.e. output of )

var rList = bodyContent.getElementsByTagName("ol");

var ref_size = 0;

var ref_size_html = 0;

for (var i=0; i

if(rList[i].parentNode.className == "references"){

ref_size = getLength(rList[i]);

ref_size_html = rList[i].innerHTML.length;

}

}

ref_value.innerHTML='References (text only): '+(ref_size+refmark_size)+' B';

ref_html_value.innerHTML='References (including all HTML code): '+(ref_size_html+refmark_size_html)+' 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+' B';

wiki_value = document.createElement("li");

wiki_value.id = "wiki-size";

wiki_value.innerHTML = 'Wiki text: '+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', , );

}

});

//