MediaWiki:Gadget-Prosesize.js: Difference between revisions

Content deleted Content added
ce
format
Line 1:
//copy of [[User:Dr_pda/prosesize.js]]
//TODO: fix script to use API (API:Revisions for size etc) and modernize (User:Shubinator/DYKcheck.js may have useful code? or use xtools api ) and fix to work on all maintained skins propose to become gadget
//Wikipedia:Village_pump_(technical)/Archive_161#"Page_size"_Tool:_"Word_count"_script_'User:Dr_pda/prosesize.js'_does_not_work_with_skin_=_Timeless
//<nowiki>
//This function adds a link to the toolbox which, when clicked, displays the size of the page
Line 7 ⟶ 8:
//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) {
Line 16:
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("");
}
}
 
Line 30 ⟶ 32:
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 {
else{ result = result + '&nbsp;B';
result = result+'&nbsp;B'; }
wiki_value = document.createElement("li");
}
wiki_value.id = document.createElement("liwiki-size");
wiki_value.idinnerHTML = "wiki-size"'<b>Wiki text: </b>' + result;
var output = document.getElementById("document-size-stats");
wiki_value.innerHTML = '<b>Wiki text: </b>'+result;
var output prose_value = document.getElementById("documentprose-size-stats");
output.insertBefore(wiki_value, prose_value);
prose_value = document.getElementById("prose-size");
} else {
output.insertBefore(wiki_value,prose_value);
//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");
else{
wiki_value.id = "wiki-size";
//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.innerHTML = document.createElement("li")'<b>Wiki text: </b>Problem getting wiki text size';
var output = document.getElementById("document-size-stats");
wiki_value.id = "wiki-size";
prose_value = document.getElementById("prose-size");
wiki_value.innerHTML = '<b>Wiki text: </b>Problem getting wiki text size';
output.insertBefore(wiki_value, prose_value);
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" +
Line 69:
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 + ")");
Line 84:
}
 
function getLength(id) {
var textLength = 0;
for (var i = 0; i < id.childNodes.length; i++) {
if (id.childNodes[i].nodeType === Node.TEXT_NODE) {
textLength += id.childNodes[i].nodeValue.length;
} else if (id.childNodes[i].nodeType === Node.ELEMENT_NODE &&
}
else if (id.childNodes[i].nodeTypeid === Node'coordinates' || id.ELEMENT_NODEchildNodes[i].className.indexOf('emplate') != &&-1)) {
//special case for {{coord}} and {{fact}}-like templates
(id.childNodes[i].id == 'coordinates' || id.childNodes[i].className.indexOf('emplate') != -1)){
//Exclude from length, and don't set background yellow
//special case for {{coord}} and {{fact}}-like templates
id.childNodes[i].style.cssText = 'background-color:white';
//Exclude from length, and don't set background yellow
} else {
id.childNodes[i].style.cssText = 'background-color:white';
textLength += getLength(id.childNodes[i]);
}
else{ }
}
textLength += getLength(id.childNodes[i]);
return textLength;
}
}
return textLength;
}
 
function getRefMarkLength(id, html) {
var textLength = 0;
for (var i = 0; i < id.childNodes.length; i++) {
if (id.childNodes[i].nodeType === Node.ELEMENT_NODE && id.childNodes[i].className == 'reference') {
textLength += (html) ? id.childNodes[i].innerHTML.length : getLength(id.childNodes[i]);
}
}
}
return textLength;
}
 
function getDocumentSize() {
var bodyContent;
if ($.inArray(mw.config.get('skin'), ['vector' , 'monobook' ]) !== -1) {
bodyContent = $('#mw-content-text .mw-parser-output');
}
}
//Same for all skins if previewing page
if (mw.config.get('wgAction') == 'submit') {
bodyContent = $('#wikiPreview .mw-parser-output');
}
}
if (bodyContent.length === 0) {
return;
}
bodyContent = bodyContent[0];
 
if (bodyContent.length === 0) {
if(document.getElementById("document-size-stats")){
return;
//if statistics already exist, turn them off and remove highlighting
}
var output = document.getElementById("document-size-stats");
var oldStylebodyContent = output.classNamebodyContent[0];
var pList = bodyContent.getElementsByTagName("p");
for(var i=0;i<pList.length; i++){
if( pList[i].parentNode == bodyContent ) {
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 = if (document.createElementgetElementById("lidocument-size-stats");) {
//if statistics already exist, turn them off and remove highlighting
prose_html_value.id = "prose-size-html";
var output = document.getElementById("document-size-stats");
output.appendChild(prose_html_value);
var oldStyle = output.className;
var pList = bodyContent.getElementsByTagName("p");
for (var i = 0; i < pList.length; i++) {
if (pList[i].parentNode == bodyContent) {
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 ref_html_valueprose_html_value = document.createElement("li");
ref_html_value prose_html_value.id = "refprose-size-html";
output.appendChild(ref_html_valueprose_html_value);
 
var prose_valueref_html_value = document.createElement("li");
prose_value ref_html_value.id = "proseref-size-html";
output.appendChild(prose_valueref_html_value);
output.className = bodyContent.getElementsByTagName("p").item(0).style.cssText;
 
var ref_valueprose_value = document.createElement("li");
ref_value prose_value.id = "refprose-size";
output.appendChild(ref_valueprose_value);
output.className = bodyContent.getElementsByTagName("p").item(0).style.cssText;
 
var ref_value = document.createElement("li");
bodyContent.insertBefore(output, bodyContent.firstChild);
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);
 
var header = document.createElement("span");
//File size not well defined for preview mode or section edit
header.id = "document-size-header";
if(mw.config.get('wgAction') != 'submit'){
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>';
loadXMLDocPassingTemplate(___location.pathname,getFileSize,'');
bodyContent.insertBefore(header, output);
}
//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;
 
//File size not well defined for preview mode or section edit
for (var i=0;i<iList.length; i++){
if (mw.config.get('wgAction') != 'submit') {
var im = iList[i];
loadXMLDocPassingTemplate(___location.pathname, getFileSize, '');
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);
 
//Get size of images only if browser supports filesize property (IE)
}
var iList = bodyContent.getElementsByTagName("img");
//Calculate prose size and size of reference markers ([1] etc)
if (iList.length > 0 && iList[0].fileSize) {
var pList = bodyContent.getElementsByTagName("p");
//Get size of images included in document
var image_size = 0;
var first_magnify = true;
 
for (var i = 0; i < iList.length; i++) {
prose_size = 0;
var im = iList[i];
prose_size_html = 0;
if (im.getAttribute("src").indexOf("magnify-clip.png") != -1) {
refmark_size = 0;
if (first_magnify) {
refmark_size_html = 0;
image_size += im.fileSize * 1;
word_count = 0;
first_magnify = false;
for(var i=0;i<pList.length; i++){
var para = pList[i]; }
} else {
if( para.parentNode == bodyContent ){
image_size += im.fileSize * 1;
prose_size += getLength(para);
}
prose_size_html += para.innerHTML.length;
}
refmark_size += getRefMarkLength(para,false);
var image_value = document.createElement("li");
refmark_size_html += getRefMarkLength(para,true);
image_value.id = "image-size";
word_count += para.innerHTML.replace(/(<([^>]+)>)/ig,"").split(' ').length;
image_value.innerHTML = '<b>Images: </b>' + (image_size / 1024).toFixed(0) + '&nbsp;kB';
para.style.cssText = "background-color:yellow";
output.appendChild(image_value);
}
}
 
}
if((prose_size-refmark_size)>10240){
//Calculate prose size and size of reference markers ([1] etc)
prose_value.innerHTML='<b>Prose size (text only): </b>'+((prose_size-refmark_size)/1024).toFixed(0)+'&nbsp;kB ('+word_count+' words) "readable prose size"';
var pList = bodyContent.getElementsByTagName("p");
}
else{
prose_value.innerHTML='<b>Prose size (text only): </b>'+(prose_size-refmark_size)+'&nbsp;B ('+word_count+' words) "readable prose size"';
}
 
prose_size = 0;
if((prose_size_html-refmark_size_html)>10240){
prose_size_html = 0;
prose_html_value.innerHTML='<b>Prose size (including all HTML code): </b>'+((prose_size_html-refmark_size_html)/1024).toFixed(0)+'&nbsp;kB';
refmark_size = 0;
}
refmark_size_html = 0;
else{
word_count = 0;
prose_html_value.innerHTML='<b>Prose size (including all HTML code): </b>'+(prose_size_html-refmark_size_html)+'&nbsp;B';
for (var i = 0; i < pList.length; i++) {
}
var para = pList[i];
if (para.parentNode == bodyContent) {
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";
}
}
 
if ((prose_size - refmark_size) > 10240) {
//Calculate size of references (i.e. output of <references/>)
prose_value.innerHTML = '<b>Prose size (text only): </b>' + ((prose_size - refmark_size) / 1024).toFixed(0) + '&nbsp;kB (' + word_count + ' words) "readable prose size"';
var rList = bodyContent.getElementsByTagName("ol");
} else {
var ref_size = 0;
prose_value.innerHTML = '<b>Prose size (text only): </b>' + (prose_size - refmark_size) + '&nbsp;B (' + word_count + ' words) "readable prose size"';
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_sizeprose_size_html - refmark_size_html) > 10240) {
ref_value prose_html_value.innerHTML = '<b>ReferencesProse size (textincluding all HTML onlycode): </b>' + ((ref_size+refmark_sizeprose_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';
else{
}
ref_value.innerHTML='<b>References (text only): </b>'+(ref_size+refmark_size)+'&nbsp;B';
}
 
//Calculate size of references (i.e. output of <references/>)
if((ref_size_html+refmark_size_html)>10240){
var rList = bodyContent.getElementsByTagName("ol");
ref_html_value.innerHTML='<b>References (including all HTML code): </b>'+((ref_size_html+refmark_size_html)/1024).toFixed(0)+'&nbsp;kB';
var ref_size = 0;
}
var ref_size_html = 0;
else{
for (var i = 0; i < rList.length; i++) {
ref_html_value.innerHTML='<b>References (including all HTML code): </b>'+(ref_size_html+refmark_size_html)+'&nbsp;B';
if (rList[i].parentNode.className == "references") {
}
ref_size = getLength(rList[i]);
ref_size_html = rList[i].innerHTML.length;
}
}
 
if ((ref_size + refmark_size) > 10240) {
//get correct name of article from wikipedia-defined global variables
ref_value.innerHTML = '<b>References (text only): </b>' + ((ref_size + refmark_size) / 1024).toFixed(0) + '&nbsp;kB';
var pageNameUnderscores = mw.config.get('wgPageName');
} else {
var pageNameSpaces = pageNameUnderscores.replace(/_/g,' ');
ref_value.innerHTML = '<b>References (text only): </b>' + (ref_size + refmark_size) + '&nbsp;B';
}
 
if ((ref_size_html + refmark_size_html) > 10240) {
//if page is a permalink, diff, etc don't try to search
ref_html_value.innerHTML = '<b>References (including all HTML code): </b>' + ((ref_size_html + refmark_size_html) / 1024).toFixed(0) + '&nbsp;kB';
if(!___location.pathname.match('/w/index.php')){
} else {
//Get revision size from API
ref_html_value.innerHTML = '<b>References (including all HTML code): </b>' + (ref_size_html + refmark_size_html) + '&nbsp;B';
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);
 
}
//get correct name of article from wikipedia-defined global variables
else if(mw.config.get('wgAction') == 'submit'){
var pageNameUnderscores = mw.config.get('wgPageName');
//Get size of text in edit box
var pageNameSpaces = pageNameUnderscores.replace(/_/g, ' ');
result = document.getElementById('wpTextbox1').value.length;
 
if(result > 10240){
//if page is a permalink, diff, etc don't try to search
result = (result/1024).toFixed(0)+'&nbsp;kB';
if (!___location.pathname.match('/w/index.php')) {
}
//Get revision size from API
else{
var searchURL = mw.config.get('wgScriptPath') + '/api.php?action=query&prop=revisions&rvprop=size&format=xml&revids=' + mw.config.get('wgCurRevisionId');
result = result+'&nbsp;B';
loadXMLDocPassingTemplate(searchURL, getWikiText, pageNameSpaces);
}
} else if (mw.config.get('wgAction') == 'submit') {
wiki_value = document.createElement("li");
//Get size of text in edit box
wiki_value.id = "wiki-size";
result = document.getElementById('wpTextbox1').value.length;
wiki_value.innerHTML = '<b>Wiki text: </b>'+result;
if (result > 10240) {
var output = document.getElementById("document-size-stats");
result = (result / 1024).toFixed(0) + '&nbsp;kB';
prose_value = document.getElementById("prose-size");
} else {
output.insertBefore(wiki_value,prose_value);
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);
}
}
}
 
jQuery(function () {
if ($.inArray(mw.config.get('skin'), ['vector' , 'monobook' ]) === -1) {
return;
}
}
mw.loader.using( ['mediawiki.util'], function () {
if (mw.config.get('wgAction') == 'edit' || (mw.config.get('wgAction') == 'submit' && document.getElementById('wikiDiff')) ) {
$( mw.util.addPortletLink('p-tb', '#', 'Page size', 't-page-size', 'Calculate page and prose size') )
.click( function(e) {
e.preventDefault();
alert("You need to preview the text for the prose size script to work in edit mode.");
} });
document.getElementById("t-page-size").firstChild.style.cssText = "color:black;";
} else if ($.inArray(mw.config.get('wgAction'), ['view', 'submit', 'historysubmit', 'purge']) !== -1) {
}
else if( $.inArray(mw.configutil.getaddPortletLink('wgActionp-tb'), ['view#' , 'submit'Page size', 'historysubmitt-page-size' , 'purge'])Calculate !==page -1and prose size')){
.click(function(e) {
$( mw.util.addPortletLink('p-tb', '#', 'Page size', 't-page-size', 'Calculate page and prose size') )
e.preventDefault();
.click( function(e) {
getDocumentSize();
e.preventDefault();
getDocumentSize( });
} ); }
});
});
});