MediaWiki:Gadget-EditingAliases.js

Материал из Традиция: Право
Перейти к: навигация, поиск
/* Приспособление, заменяющее на время редактирования неудобные для восприятия символы
 * или их группы на другие.
 * По умолчанию, неразрывный пробел заменяется на маленькую точку в середине строки.
 * Личные настройки замены можно сделать на странице Участник:<Участник>/EditingAliases.js.
 * В двумерном массиве edit_aliases лежат строки (регулярные выражения) для подстановки псевдонимов.
 * Если используется сложная подстановка (с необычными символами или метасимволами),
 * то обратную подстановку следует задать явно в edit_aliases_back.
 * Каждый элемент массивов должен иметь вид:
 * ['<заменяемые символы>', '<заменяющие символы>', '<опции регулярного выражения (не обязательно)>'].
 *
 * В гаджете не выполняется обратная замена, когда включено оглавление с возможностью навигации (Usability Initiative). Поэтому при таких настойках,
 * он автоматически отключается.
 *
 * Автор: Александр Машин, 10 декабря 2008.
*/

function runReplacements (text_box, replacements) {

    // Подставить псевдонимы один за другим:
    var txt = text_box.value;    
    for (var i = 0; i < replacements.length; i++) {
        var reg_exp = new RegExp (replacements[i][0], 'g' + (replacements[i][2] || ''));
        txt = txt.replace (reg_exp, replacements[i][1]);
    }
    text_box.value = txt;    
}

function useAliases(){
    // Построение списка обратной автозамены:
    for (var i = 0; i < edit_aliases.length; i++) {
        if (!edit_aliases_back[i]) {
            edit_aliases_back[i] = {
                0: edit_aliases[i][1]
              , 1: edit_aliases[i][0]
              , 2: edit_aliases[i][2]
            }
        }
    }    
    // Применение заменяющих символов:
    $('textarea').each(function(){
        var areaScrollPosition = $(this).scrollTop();
        runReplacements(this, edit_aliases);
        $(this).scrollTop(areaScrollPosition);
    });
    // Подготовка обратной замены при отправке форм:
    $('form:not(#searchform)').submit(function(){
        $('textarea', this).each(function(){
            var areaScrollPosition = $(this).scrollTop();
            runReplacements(this, edit_aliases_back);
            $(this).scrollTop(areaScrollPosition);
            return true;
        });
    });
    return true;
}

$(function () {
// если страница — обсуждение или не скрипт, . . .
if ( (wgNamespaceNumber % 2) || (wgPageName.match(/\.js$/i) == null) ){
    if ( (typeof wgWikiEditorEnabledModules === 'undefined') ||
         !wgWikiEditorEnabledModules['toc']
    ){ // и если не включён модуль навигации, то . . .

       // Замены по умолчанию:
       edit_aliases = [['\u00A0', '\u00B7']];
       edit_aliases_back = [['\u00B7(?!\\}\\})', '\u00A0']];

       // Личные настройки:
       importScript('Участник:' + wgUserName + '/' + 'EditingAliases.js');

       // Подготовка замены при загрузке и обратной замены при сохранении:
       useAliases ();
   }
}
});