//Оригинал: [[:en:User:Dr pda/prosesize.js]]
//Скрипт, добавляющий в сайдбар ссылку, при нажатии на которую появляется информация о странице
//(размер страницы, размер видимого текста, количество слов), а также
//весь видимый текст (кроме текста в таблицах и карточках) подсвечивается жёлтым
//Цвет можно настроить, добавив в личный JavaScript-файл ([[Special:MyPage/common.js]]) конструкцию вида:
//prosesize_color = "#FF0000";
//где #FF0000 — код цвета (можно взять из [[Список цветов]], графа "Шестнадцатеричное значение", либо в одной из онлайн-палитр)
if(typeof prosesize_color === 'undefined')
{
var prosesize_color = "yellow";
}
function loadXMLDocPassingTemplate(url,handler, page)
{
var req;
// branch for native XMLHttpRequest object
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
}
// branch for IE/Windows ActiveX version
else if (window.ActiveXObject) {
req = new ActiveXObject("Microsoft.XMLHTTP");
}
if (req) {
req.onreadystatechange = function () {handler(req, page)};
req.open("GET", url, true);
req.send("");
}
}
function getElements()
{
var pList = bodyContent.getElementsByTagName("p");
var elements = [];
for(i = 0; i < pList.length; i += 1) {
var node = pList[i];
if ((node.className != "collapse-refs-p") && (node.parentNode.tagName.toLowerCase() != "blockquote") && (node.parentNode.parentNode.tagName.toLowerCase() != "blockquote")){
elements.push(node);
}
}
$(bodyContent).find('li:not(#total-size, #prose-size-html, #ref-size-html, #prose-size, #ref-size, [class*=toclevel])').each(function() {
var attr;
attr = $(this).children().first().find("a").attr('rel');
if(attr === undefined)
{
attr = $(this).children().first().attr('rel');
}
var className = $(this).children().first().attr('class');
// Если это не книга из раздела Литература или ссылка
if((className != "citation") && (attr != "nofollow")) {
elements.push($(this)[0]);
}
});
$(bodyContent).find('blockquote').each(function() {
$(this).children().each(function(){
if($(this).is("p")){
elements.push($(this)[0]);
}
if($(this).is("div")){
elements.push($(this)[0]);
}
});
});
return elements;
}
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');
var output;
if(rev.length > 0){
result = rev[0].getAttribute('size');
if(result > 10240){
result = (result/1024).toFixed(0)+' кб';
}
else{
result = result+' б';
}
wiki_value = document.createElement("li");
wiki_value.id = "wiki-size";
wiki_value.innerHTML = '<b>Вики-текст: </b>'+result;
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>Вики-текст: </b>Не удалось получить размер вики-текста';
output = document.getElementById("document-size-stats");
prose_value = document.getElementById("prose-size");
output.insertBefore(wiki_value,prose_value);
}
} else {
alert("Не удалось получить XML информацию:\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>Размер кода страницы: </b>'+(fsize/1024).toFixed(0)+' кб';
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("Не удалось получить XML информацию:\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 = '';
if($.inArray(mw.config.get('skin'), ['vector' , 'monobook' , 'chick' , 'myskin', 'simple' ]) !== -1){
contentDivName = 'bodyContent';
}
else if (mw.config.get('skin') == 'modern'){
contentDivName = 'mw_contentholder';
}
else if ($.inArray(mw.config.get('skin'), ['standard' , 'cologneblue' , 'nostalgia']) !== -1){
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 output;
var bodyContent = document.getElementById(contentDivName);
if(document.getElementById("document-size-stats")){
//if statistics already exist, turn them off and remove highlighting
output = document.getElementById("document-size-stats");
var oldStyle = output.className;
var elements = getElements();
for(var i=0;i<elements.length; i++){
if( (((elements[i].parentNode.parentNode.id == contentDivName) || (elements[i].parentNode.parentNode.parentNode.id == contentDivName))&& elements[i].parentNode.className != 'previewnote')|| elements[i].parentNode.parentNode.nodeName == "BLOCKQUOTE") elements[i].style.cssText = oldStyle;
}
output.parentNode.removeChild(output);
var header = document.getElementById("document-size-header");
header.parentNode.removeChild(header);
}
else{
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/>Информация о странице : <small><i>(См. <a href="//en.wikipedia.org/wiki/User:Dr_pda/prosesize">информацию</a> на странице оригинального скрипта.)<i></small>';
bodyContent.insertBefore(header,output);
//File size not well defined for preview mode or section edit
if(mw.config.get('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>Изображения: </b>'+(image_size/1024).toFixed(0)+' кб';
output.appendChild(image_value);
}
//Calculate prose size and size of reference markers ([1] etc)
var elements = getElements();
prose_size = 0;
prose_size_html = 0;
refmark_size = 0;
refmark_size_html = 0;
word_count = 0;
for(var i=0;i < elements.length; i++){
var para = elements[i];
if( (((para.parentNode.parentNode.id == contentDivName) || (para.parentNode.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:" + prosesize_color;
}
}
//if((prose_size-refmark_size)>10240){
// prose_value.innerHTML='<b>Размер видимого текста: </b>'+((prose_size-refmark_size)/1000).toFixed(0)+' тысяч символов ('+word_count+' слов)';
//}
//else{
prose_value.innerHTML='<b>Размер видимого текста: </b>'+(prose_size-refmark_size)+' символов ('+word_count+' слов)';
//}
if((prose_size_html-refmark_size_html)>10240){
prose_html_value.innerHTML='<b>Размер текста (вместе с HTML тегами): </b>'+((prose_size_html-refmark_size_html)/1024).toFixed(0)+' кб';
}
else{
prose_html_value.innerHTML='<b>Размер текста (вместе с HTML тегами): </b>'+(prose_size_html-refmark_size_html)+' б';
}
//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>Сноски (только текст): </b>'+((ref_size+refmark_size)/1024).toFixed(0)+' кб';
//}
//else{
ref_value.innerHTML='<b>Сноски (только текст): </b>'+(ref_size+refmark_size)+' символов';
//}
if((ref_size_html+refmark_size_html)>10240){
ref_html_value.innerHTML='<b>Сноски (вместе с HTML тегами): </b>'+((ref_size_html+refmark_size_html)/1024).toFixed(0)+' кб';
}
else{
ref_html_value.innerHTML='<b>Сноски (вместе с HTML тегами): </b>'+(ref_size_html+refmark_size_html)+' б';
}
//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;
if(result > 10240){
result = (result/1024).toFixed(0)+' кб';
}
else{
result = result+' б';
}
wiki_value = document.createElement("li");
wiki_value.id = "wiki-size";
wiki_value.innerHTML = '<b>Вики-текст: </b>'+result;
var output = document.getElementById("document-size-stats");
prose_value = document.getElementById("prose-size");
output.insertBefore(wiki_value,prose_value);
}
}
}
jQuery(function () {
mw.loader.using( ['mediawiki.util'], function () {
var portletLink = mw.util.addPortletLink('p-tb', '#', 'Размер статьи', 't-page-size', 'Рассчитать размер статьи и видимого текста');
if(mw.config.get('wgAction') == 'edit' || (mw.config.get('wgAction') == 'submit' && document.getElementById('wikiDiff')) ){
$( portletLink ).click( function(){
alert("Чтобы узнать размер текста, необходимо войти в режим предварительного просмотра.");
} );
document.getElementById("t-page-size").firstChild.style.cssText = "color:black;";
}
else if($.inArray(mw.config.get('wgAction'), ['view' , 'submit' , 'historysubmit' , 'purge']) !== -1){
$( portletLink ).click( getDocumentSize );
}
});
});