Участник:Товарищ Аарон/common.js

Материал из Циклопедии
Перейти к навигации Перейти к поиску

Замечание: Возможно, после публикации вам придётся очистить кэш своего браузера, чтобы увидеть изменения.

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl+F5 или Ctrl+R (⌘+R на Mac)
  • Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
  • Internet Explorer / Edge: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl+F5
  • Opera: Нажмите Ctrl+F5.
mw.loader.load('https://commons.wikimedia.org/w/index.php?title=User:Jack_who_built_the_house/convenientDiscussions.js&action=raw&ctype=text/javascript');

importScript('Участник:Jack who built the house/alignTemplateParameters.js');

importScript('Участник:Jack who built the house/copyWikilinks.js');

mw.loader.load( '/w/index.php?title=Участник:Урахара/logoswitcher.js&action=raw&ctype=text/javascript' );

mw.loader.load( '//commons.wikimedia.org/w/index.php?title=MediaWiki:Gadget-HotCat.js&action=raw&ctype=text/javascript' );

console.log("COMMON.JS ЗАГРУЖЕН");

mw.loader.using('mediawiki.util').then(function () {

    // Список паттернов для подсветки
    const patterns = [
        { regex: /\bуничтож(ил|или|ено|ена|ить|енный)\b/gi, color: '#ff4d4d' },
        { regex: /\bразгром(ил|или|лен|)\b/gi, color: '#ff4d4d' },
        { regex: /\bпровал(ился|илась)?\b/gi, color: '#ff4d4d' },
        { regex: /\bликвидир(овал|овали|ован)\b/gi, color: '#ff4d4d' },

        { regex: /\bуспешн(о|ый|ая|ые)\b/gi, color: '#ff944d' },
        { regex: /\bэффективн(о|ый|ая)\b/gi, color: '#ff944d' },
        { regex: /\bзначительн(ый|ая|ое)\b/gi, color: '#ff944d' },
        { regex: /\bмощн(ый|ая)\b/gi, color: '#ff944d' },

        { regex: /\bдоказан(о|)\b/gi, color: '#4da6ff' },
        { regex: /\bочевидн(о|)\b/gi, color: '#4da6ff' },
        { regex: /\bподтвержда(ет|ют|ется)\b/gi, color: '#4da6ff' },

        { regex: /\bтеррорист(ы|)\b/gi, color: '#cc66ff' },
        { regex: /\bрежим\b/gi, color: '#cc66ff' }
    ];

    // Функция рекурсивной подсветки текстовых узлов
    function highlight(node) {
        if (node.nodeType === 3) { // текстовый узел
            let text = node.nodeValue;
            patterns.forEach(p => {
                if (p.regex.test(text)) {
                    const span = document.createElement('span');
                    span.innerHTML = text.replace(p.regex, match =>
                        `<mark style="background:${p.color}; padding:1px 2px;">${match}</mark>`
                    );
                    node.replaceWith(span);
                }
            });
        } else if (node.nodeType === 1 && node.tagName !== 'SCRIPT' && node.tagName !== 'STYLE') {
            // рекурсивно обходим всех потомков
            Array.from(node.childNodes).forEach(highlight);
        }
    }

    // Ищем все подходящие контейнеры для текста
    const containers = [
        document.querySelector('#mw-content-text'),   // старый Vector, Citizen
        document.querySelector('.mw-parser-output')   // Vector-2022 и Vector-2023
    ];

    containers.forEach(c => {
        if (c) highlight(c);
    });
    
    console.log("СКРИПТ РАБОТАЕТ");
});

var $titles = Array(); 
var $contents = Array(); 

function parseGET(str){  
  params = str.split('|');
  for (i=0; i<params.length; i++)  
  {  
    var keyval = params[i].split('=');  
    $titles[i] = keyval[0];
    $contents[i] = keyval[1];  
  }  
};  

function TabBuild(r){
  var $menu = "";
  for (i=1; i<$titles.length; i++)  
  {  
    if(r==i){
      $menu=$menu+" <b>"+$titles[i]+"</b> "; 
    }
    else
    {
      $menu=$menu+" <a href=# onClick='TabBuild("+i+");'>"+$titles[i]+"</a> ";
    }
  }
  $('#vsTabs').html($menu +"<br>"+ $contents[r]);

}

$(function(){
  var nhl = $('#vsArray')[0];
  if(nhl && !document.location.href.match("diff"))
  {
    parseGET( nhl.innerHTML ); 
    TabBuild(1);
  }
});




//Форматирует таблицу, скопированную из Excel, по правилам вики-разметки.
//Часть кода позаимствована из http://ru.wikipedia.org/wiki/MediaWiki:Wikificator.js
//Автор: X-romix
 
var XRomix_Tablify_CantWork1 = 'Таблификатор не может работать в вашем браузере.\n\nTablificator cannot work in your browser' // английский текст для тех, кто не видит русские буквы
var XRomix_Tablify_FullText1 = 'Эта кнопка предназначена для форматирования табличного текста, скопированного из табличного редактора (например, из Excel). Чтобы функция заработала, сначала выделите нужный фрагмент текста в окне редактирования.'
 
//Добавляет кнопку
function addTablifikatorButton1(){
	var toolbar = document.getElementById('toolbar')
	var textbox = document.getElementById('wpTextbox1')
	if (!textbox || !toolbar) return
	var i = document.createElement('img')
	i.src = 'http://upload.wikimedia.org/wikipedia/ru/c/c1/Button-tablifikator.PNG'
	i.alt = i.title = 'Таблификатор'
	i.onclick = XRomix_Tablify1
	i.style.cursor = 'pointer'
	toolbar.appendChild(i)
 
} 

 
 
//Этот код выполняется в начале.
if (wgAction == 'edit' || wgAction == 'submit'){
  addOnloadHook(addTablifikatorButton1)
}
 
 
//Функция для оформления таблицы
function XRomix_Tablify1(){
 
 //Проверяем, поддерживает ли браузер регулярные выражения (RegExp)	
 if (('code'.replace(/d/g, 'r') != 'core') 
    || (navigator.appName=='Netscape' && navigator.appVersion.substr (0, 1) < 5))
  { alert(XRomix_Tablify_CantWork1); return }
 //setWpSummary();
 var txt, hidden = [], hidIdx = 0, wpTextbox1 = document.editform.wpTextbox1
 var winScroll = document.documentElement.scrollTop //remember window scroll
 wpTextbox1.focus()
 
 if (typeof wpTextbox1.selectionStart != 'undefined' 
    && (navigator.productSub > 20031000 || is_safari)) { //Mozilla/Opera/Safari3
 
    var textScroll = wpTextbox1.scrollTop
    var startPos = wpTextbox1.selectionStart
    var endPos = wpTextbox1.selectionEnd
    txt = wpTextbox1.value.substring(startPos, endPos)
    if (txt == '') {alert(XRomix_Tablify_FullText1); return}
    else{
 
	  processText()
      wpTextbox1.value = wpTextbox1.value.substring(0, startPos) + txt + wpTextbox1.value.substring(endPos)
    }
    wpTextbox1.selectionStart = startPos
    wpTextbox1.selectionEnd = startPos + txt.length
    wpTextbox1.scrollTop = textScroll
 
 }else if (document.selection && document.selection.createRange) { //IE
 
   var range = document.selection.createRange()
   txt = range.text
   if (txt == '') {alert(XRomix_Tablify_FullText1); return}
   else{
 
     processText()
	  range.text = txt
     //if (!window.opera) txt = txt.replace(/\r/g,'')
     if (range.moveStart) range.moveStart('character', - txt.length)
     range.select() 
   }
 
 }else // Для браузеров, которые не умеют возвращать выделенный фрагмент, выдаем ошибку
   { alert(XRomix_Tablify_CantWork1); return }
 
 document.documentElement.scrollTop = winScroll // scroll back, for IE/Opera
 
//Здесь производим замену в переменной txt - это отразится на выделенном фрагменте текста 
function processText(){
  var col1hdr=0;
  if (confirm('Вы хотите оформить первую колонку как заголовок?')) col1hdr=1;



  txt = txt.replace(/^\s+|\s+$/g, '')  //Обрезаем пробелы слева и справа
   var arr1=txt.split("\n")
   
   txt='\n{| class="standard"\n'

   for (var i=0; i<arr1.length; i++){ 
     txt = txt+"|-\n"
     s1=arr1[i];
	   var arr2=s1.split("\t")
	   for (var j=0; j<arr2.length; j++){
	     var s2=arr2[j];
		 if ((col1hdr==1 && j==0)||i==0){
		   txt = txt+"! "+s2+"\n"
		 }else{
		   txt = txt+"| "+s2+"\n"
		 }  
	   }  
   }  
  txt = txt+"|}"

}	

  function setWpSummary(){
     var wpSummary = document.getElementById('wpSummary')
	 if(wpSummary){
	    var temp=wpSummary.value;
	    temp=temp.replace(/\/\*.*?\*\// , ""); //комментарии
	    temp=temp.replace(/[\s]*/ , ""); //пробелы
	    if (temp==""){
	       wpSummary.value=wpSummary.value+" - [[User talk:X-romix/tablifikator.js|tablifikator.js]] - таблица из Excel/Calc";
	    }
	 }
  } 
 
}



importScript('Участник:Товарищ Аарон/Scripts/massRollback.js')

(function () {
    "use strict";

    if (typeof mw === "undefined" || !mw.config) {
        return;
    }

    function importScript(page) {
        mw.loader.using("mediawiki.util").done(function () {
            mw.loader.load(
                mw.util.getUrl(page, { action: "raw", ctype: "text/javascript" })
            );
        });
    }

    function safeImportFromWithJS() {
        try {
            var match = location.search.match(/[?&]withjs=((?:mediawiki:)?([^&#]+))/i);
            if (!match || !match[2]) return;

            var pageName = match[2];
            if (/^[a-zA-Z0-9_.-]+$/.test(pageName)) {
                importScript("MediaWiki:" + pageName);
            }
        } catch (e) {
            console.warn("withJS error:", e);
        }
    }

    var navigationBar = {
        hide: "[скрыть]",
        show: "[показать]",
        showDefault: 2
    };

    function hasClass(el, cls) {
        if (!el) return false;
        if (el.classList) return el.classList.contains(cls);
        return (" " + (el.className || "") + " ").indexOf(" " + cls + " ") !== -1;
    }

    function collapseTable(idx) {
        var table = document.getElementById("collapsibleTable" + idx);
        var btn = document.getElementById("collapseButton" + idx);
        if (!table || !btn) return false;

        var rows = table.rows;
        var expanded = btn.textContent === navigationBar.hide;
        btn.textContent = expanded ? navigationBar.show : navigationBar.hide;

        for (var i = 1; i < rows.length; i++) {
            rows[i].style.display = expanded ? "none" : "";
        }
        return true;
    }

    function createCollapseButtons() {
        var tables = document.getElementsByTagName("table");
        var tableIndex = 0;
        var navigationBoxes = [];

        for (var i = 0; i < tables.length; i++) {
            var table = tables[i];
            if (!hasClass(table, "collapsible")) continue;

            var headerRow = table.rows[0];
            if (!headerRow) continue;

            var header = headerRow.getElementsByTagName("th")[0];
            if (!header) continue;

            table.id = "collapsibleTable" + tableIndex;

            var span = document.createElement("span");
            span.className = "collapseButton";

            var link = document.createElement("a");
            link.id = "collapseButton" + tableIndex;
            link.href = "#";
            link.textContent = navigationBar.hide;

            link.addEventListener("click", (function (index) {
                return function (e) {
                    e.preventDefault();
                    collapseTable(index);
                };
            })(tableIndex));

            span.appendChild(document.createTextNode("["));
            span.appendChild(link);
            span.appendChild(document.createTextNode("]"));

            header.insertBefore(span, header.firstChild);
            navigationBoxes[tableIndex] = table;
            tableIndex++;
        }

        for (var j = 0; j < tableIndex; j++) {
            var t = navigationBoxes[j];
            if ((tableIndex >= navigationBar.showDefault && hasClass(t, "autocollapse")) || hasClass(t, "collapsed")) {
                collapseTable(j);
            }
        }
    }

    function collapseDiv(idx) {
        var nav = document.getElementById("NavFrame" + idx);
        var btn = document.getElementById("NavToggle" + idx);
        if (!nav || !btn) return false;

        var expanded = btn.textContent === navigationBar.hide;
        btn.textContent = expanded ? navigationBar.show : navigationBar.hide;

        for (var child = nav.firstElementChild; child; child = child.nextElementSibling) {
            if (hasClass(child, "NavPic") || hasClass(child, "NavContent")) {
                child.style.display = expanded ? "none" : "";
            }
        }
        return true;
    }

    function createNavigationButtons() {
        var divs = document.getElementsByTagName("div");
        var idx = 0;
        var navFrames = [];

        for (var i = 0; i < divs.length; i++) {
            var navFrame = divs[i];
            if (!hasClass(navFrame, "NavFrame")) continue;

            navFrame.id = "NavFrame" + idx;

            var toggle = document.createElement("a");
            toggle.className = "NavToggle";
            toggle.id = "NavToggle" + idx;
            toggle.href = "#";
            toggle.textContent = navigationBar.hide;

            toggle.addEventListener("click", (function (index) {
                return function (e) {
                    e.preventDefault();
                    collapseDiv(index);
                };
            })(idx));

            for (var j = 0; j < navFrame.childNodes.length; j++) {
                var node = navFrame.childNodes[j];
                if (hasClass(node, "NavHead")) {
                    node.appendChild(toggle);
                    break;
                }
            }

            navFrames[idx] = navFrame;
            idx++;
        }

        for (var k = 0; k < idx; k++) {
            if ((idx > navigationBar.showDefault && !hasClass(navFrames[k], "expanded")) || hasClass(navFrames[k], "collapsed")) {
                collapseDiv(k);
            }
        }
    }

    function init() {
        safeImportFromWithJS();
        createCollapseButtons();
        createNavigationButtons();
    }

    if (document.readyState === "loading") {
        document.addEventListener("DOMContentLoaded", init);
    } else {
        init();
    }
})();

//Что-то для удаления  страниц
function deletePage(){
	if( window.disableDelScript ) return;

	//"reason" <input> → <textarea>
	$( '#wpReason' ).replaceWith(
		$( '<textarea>' )
			.attr( {
				id: 'wpReason',
				name: 'wpReason',
				rows: '3',
				maxlength: '500'
				}
			)
			.val( $( '#wpReason' ).val() )
	);

	var dropdown = $( '#wpDeleteReasonList' ), 
		reason = $( '#wpReason' ),
		frm = dropdown.closest( 'form' );
		
	if ( !dropdown[0] || !reason[0] ) return;
	
	//"script info" link
	$( '<a href="https://ru.wikipedia.org/wiki/MediaWiki_talk:Gadget-common-action-delete.js#Документация">Про скрипт</a><span> | </span>' )
		.prependTo( '.mw-delete-editreasons' );
		
	//append "special" buttons
	$ ( '<div>' )
		.attr( 'id', 'deletePage-summaryButtons' )
		.appendTo( $( '#wpWatch' ).closest( 'div' ) );
		
	$( '<input>' )
		.attr( {
			title: 'Вставить в поле причины',
			value: '[[]]',
			type: 'button'
			}
		)
		.click( function(){ $( '#wpReason' ).val( $( '#wpReason' ).val() + '[[]]' ) })
		.appendTo( '#deletePage-summaryButtons' );
	
	//automatic summary preview
	updatePreviewInput = reason;
	updatePreviewOutput = $( '<div>' )
		.attr( 'id', 'deletePage-summaryPreview' )
		.insertAfter( '#wpReason' );
	reason.on( 'keyup mouseup', function(){
		updateSummary(); 
	});

	//simplify dropdown list
	dropdown.find( 'option' ).each( function( i, opt ){
		if( i==0 ) return;
		opt.title = opt.value;
		opt.text = opt.value.replace(/\[\[[^|]+\|([^\]]+)\]\]/,'$1');
	});
		
	var delTemplates = {
		'О1':'бессвязно|nonsense|абсурд|nocontext',
		'О2':'тест|test',
		'О3':'ванд|vand|вандал|vandal|attack ',
		'О4':'повторно|repost',
		'О5':'автор|author',
		'О6':'обсужд|talk|doc|док|под|sub|обс|обсуждение|related',
		'О7':'переим|move|переименование|rename',
		'О8':'дубль|fork',
		'О9':'спам|реклама|spam',
		'О10':'badtalk',
		'О11':'copyvio|копивио',
		'С1':'пусто|empty|deleteslow',
		'С2':'иностр|foreign|badtranslt',
		'С3':'ссылки|nocontent',
		'С5':'нз|nn|незначимо',
		'П1':'в никуда|redirect|redirnone',
		'П2':'межпространственный|redirspace',
		'П3':'опечатка|ошибка|redirtypo',
		'П4':'падеж|redirflect',
		'П5':'смысл|redirsense',
		'П6':'redirtalk',
		'К1':'пусткат|catempty|emptycat',
		'К2':'перекат|rencat',
		'У1':'владелец|owner|self|user',
		'У2':'anon|анон',
		'У3':'несущ|nouser',
		'У4':'нецелевое|baduserpage',
		'У5':'неактив|inactive'
	};

	//try to select the reason automatically ...
	var dbReason, ma, str_reason;

	function selectReason() {
		var result = false;
		if( ma = /\{\{\s*(db|уд)-?([\wа-яА-Я\s]+)(?:\|\s*([а-яА-Я]+))?.*(?:\}\}|…\*\/)/i.exec( reason.val().replace( "Deleteslow", "db-deleteslow" ) ) ) {
		dbReason = '|' + ma[2].toLowerCase();
		var freason = '';
		if ( ma[3] != undefined ) {
			freason = ma[3].toLowerCase();
		}
		for (var name in delTemplates)
				if ( ( '|'+delTemplates[name] ).indexOf( dbReason ) != -1 ) {
					if ( ( name === 'К1' ) && freason != '' ) {
					if ( freason == 'переименована' ) {
						selectLabel( '', ' согласно шаблону «' + ma[1] + '-' + ma[2] + '»', 'Переименована' );
					} else if ( freason == 'пустая' ) {
						selectLabel( name, ' согласно шаблону «' + ma[1] + '-' + ma[2] + '»', freason );
					} else if ( freason == 'разобранная' ) {
						selectLabel( name, ' согласно шаблону «' + ma[1] + '-' + ma[2] + '»', freason );
					} else {
						selectLabel( name, ' согласно шаблону «' + ma[1] + '-' + ma[2] + '»' );
					}
					} else {
					selectLabel( name, ' согласно шаблону «' + ma[1] + '-' + ma[2] + '»' );
					}
					result = true;
				break;
			}
		}
		return result;
	}

	//from URL param (added by MediaWiki:Group-sysop.js)
	if( dbReason = mw.util.getParamValue( 'dbreason' ) ){
		if (! ( ( dbReason === 'К1' ) && selectReason() ) ) {
				selectLabel( dbReason, 'согласно шаблону удаления' );
		}
	//from db-template inside quote 
	} else if ( selectReason() ) {
	//from {К удалению|2010-03-18} inside quote
	} else if( ma = /\{\{(КУ|к удалению) *\| *(\d\d\d\d)-(\d?\d)-(\d?\d)/i.exec( reason.val() ) ){
		reason.val(
			'согласно \[\[ВЦ:К удалению/2018#'
			+ ma[4].replace(/^0/,'')+' '
			+ 'января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря'
				.split('|')[parseInt(ma[3],10)-1]
			+ ' '+ma[2]
			+ '#'+mw.config.get('wgPageName').replace(/_/g, ' ')+']]'
		);
		mw.notify( 'вставлена ссылка на ВЦ:КУ' );
	// for talk page, except user_talk  
	} else if( mw.config.get( 'wgNamespaceNumber' ) %2 && mw.config.get( 'wgNamespaceNumber' ) != 3 ){
		if( $( '#ca-talk' ).prev().hasClass( 'new' ) && ! /wpreason=/i.test( document.URL )  ) 
			selectLabel( 'О6' ); //orphaned talk page
		else if( /# *(redirect|перенаправление) *\[\[обсужден/i.test(reason.val()) )
			selectLabel( 'П6' ); //redirect talk page
	}

	if( mw.config.get( 'wgNamespaceNumber' ) == 6 ) return; //nothing to do: there is no /*quote*/ when deleting a file

	var rxQuote = /\/\* *(.*?) *\*\/ ?/, oldQuote = '';

	// /*text quote*/ : automatically remove on "vandalism" reasons
	dropdown.change (function (){
		removeBadQuote(); 
	});
	removeBadQuote(); //also remove on load

	// /*text quote*/ : manually toggle with "x" button 
	if ( rxQuote.test( reason.val() ) )
		$( '<input>' )
			.attr( {
				id: 'btn-quote',
				type: 'button',
				value: 'Убрать цитату',
				title: 'Убрать или добавить начало удаляемой страницы в описание причины удаления'
				}
			)
			.click( function(){ toggleQuote(); reason.focus() } )
			.appendTo( '#deletePage-summaryButtons' );

	//remove dropdown groups that cannot be used
	var hideGroup = function (lbl){
		dropdown.find( 'optgroup[label="'+lbl+'"]' ).children().remove();
	};
	if ( mw.config.get( 'wgNamespaceNumber' ) != 0 && mw.config.get( 'wgNamespaceNumber' ) != 102
			&& !/Викицитатник:.*(инкубатор|черновик)/i.test( mw.config.get( 'wgPageName' ) ) ) hideGroup ( 'Статьи' );

    // Если страница была связана с викиданными, вставляем ссылку на элемент 
	try {
		var wikibase=document.getElementById('t-wikibase').getElementsByTagName('a')[0].href.match('Q[0-9]*');
		var rr = ' ([[d:' + wikibase + '|' + wikibase + ']])';
		reason.val(reason.val()+ rr);
	} catch(e) {}
	
	// Если удаляемая страница перенаправление, то вставляем перенаправление в поле причины удаления
  	var api = new mw.Api();
	var params = {
			action: 'query',
            prop: 'revisions',
            titles: mw.config.get('wgPageName'),
            rvprop: 'content',
            formatversion: 2
		};
	api.get(params).done(function(data){
		var wikitext = data.query.pages[0].revisions[0].content;
        var redirect = wikitext.match(/# *(redirect|перенаправление) *\[\[(.*)\]\]/i);
        if (redirect) {
   		   var rr = ' (перенаправление на [[' +  redirect[2] + ']])';
		   reason.val(reason.val()+ rr);
		   // В этом случае содержание страницы скорее всего не нужно
		   toggleQuote(true);
        }
    });

	updateSummary();

	return;

	// FUNC

	function selectLabel( name, msg, rsn ) {
		var pattern = 'option[value*="';
		if ( ( name == '' ) && ( rsn != undefined ) ) {
			pattern = pattern + rsn;
		} else {
			pattern = pattern + name + ']]:';
			if ( rsn != undefined ) {
				pattern = pattern + ' ' + rsn;	
			}
		}
		pattern = pattern + '"]';
		var opt = dropdown.find( pattern ).first();
		if( opt.length == 0 ) 
			return;
		opt.attr( 'selected', 'selected' );
		reason.focus();
		mw.notify( 'выбран ' + opt[0].label + ' ' + ( msg||'' ) );
	}

	function toggleQuote( isRemove ) {
		if ( isRemove == undefined ) isRemove = ( oldQuote == '' ); //toggle button
		var rr = reason.val();
		if ( isRemove && ( oldQuote = rxQuote.exec(rr) ) ) {
			oldQuote = oldQuote[0]
			rr = rr.replace( rxQuote, '' )
			mw.notify( 'Цитата убрана' )
			$('#btn-quote').val('Восстановить цитату') 
		} else if ( !isRemove && oldQuote  && ! rxQuote.test(rr) ) { //restore
			rr = oldQuote + rr
			oldQuote = ''
			mw.notify( 'Цитата восстановлена' )
			$('#btn-quote').val('Убрать цитату')
		}
		reason.val( rr );
		updateSummary();
	}

	function removeBadQuote(){
		if ( /вандализм/.test( dropdown.val() ) ) {
			reason.val( reason.val().replace(/\(перенаправление на [^\]]*?\]\]\)/gi , '') )
		}
		toggleQuote( /вандализм/.test( dropdown.val() ) || /перенаправление на/.test( reason.val() ))
	}  

	function updateSummary (e) {
		var p1 = dropdown.val()
		if( p1 == 'other' ) p1 = ''
		var p2 = reason.val()
		var text = p1 + (p1 && p2 ? ': ' : '') + p2
		var leftN = 255 - text.length
		
		updateSummaryPreview(text)
		
		if ( leftN >= 0 || e == 0 ) return
		reason.val( reason.val().replace( rxQuote, function( s, q ) {
			var newLen = q.length - (- leftN) - 6
			if ( newLen >= 10 ) return '/*' + q.substring( 0, newLen ) + '…*/ '
			else return ''  
		}))
		updateSummary(0)
	}
}//main

//needs global vars:    updatePreviewInput, updatePreviewOutput
	
function updateSummaryPreview( text, maxChars ){
	//preview
	text = text
		.replace(/ +/g, ' ')
		.replace(/</g,'&lt;')
		.replace(/\/\* *(.*?) *\*\//, '<span class=autocomment>$1</span>') // /* text */
		.replace(/\[\[:?([^\]><}{|]+)\|?([^\]><]*)?\]\]([a-zа-я]*)/gi, function(str,p1,p2, tail){ //[ [ p1 | p2 ] ]
	if ( !p2 ) p2 = p1
	if ( tail ) p2 += tail
		return '<a href='+mw.config.get('wgServer')+'/wiki/'  + encodeURI(p1.replace(/\?/g,'%3F').replace(/&/g,'%26'))
			+' title=\'' + p1 + '\'>' + p2 + '</a>' })
		updatePreviewOutput.html((text || '&nbsp;'))
}

mw.loader.using( 'mediawiki.util' ).done( function () {
	mw.hook( 'wikipage.content' ).add( deletePage );
} );