Обсуждение MediaWiki:Gadget-EditingAliases.js

Материал из свободной русской энциклопедии «Традиция»
Перейти к: навигация, поиск

Проверка поддержки регулярных выражений[править]

    // Проверить, поддерживаются ли регулярные выражения:
    var test_regexp = 'код';
    test_regexp = test_regexp.replace(/д/g, 'т');
    if (test_regexp != 'кот') return false;

А точно ли есть такие браузеры, в которых регулярные выражения не поддерживаются, но код «/д/g» не вызывает немедленный syntax error?

Может быть, эта проверка и не нужна вовсе? —Mithgol the Webmaster 11:53, 3 февраля 2010 (UTC)

useAliases()[править]

Если функция useAliases вызывается только один раз, внутри $(...);, тогда её, пожалуй, можно было бы туда и поместить:

if (!wgPageName.match(/\.js$/i)) {
    var edit_aliases = [['\\u00A0', '\u00B7']];
    var edit_aliases_back = [['\\u00B7', '\u00A0']];
 
    // Личные настройки:
    importScript ('Участник:' + wgUserName + '/' + 'EditingAliases.js');
 
    // Замена при загрузке, замена обратно при сохранении:
    $(function(){
        // Построение списка обратной автозамены:
        for (var i = 0; i < edit_aliases.length; i++) {
            if (!edit_aliases_back[i]) {
                edit_aliases_back[i]    = new Array (3);
                edit_aliases_back[i][0] = edit_aliases[i][1];
                edit_aliases_back[i][1] = edit_aliases[i][0];
                edit_aliases_back[i][2] = edit_aliases[i][2];
            }
        }    
        $("textarea").each(function(){
            runReplacements(this, edit_aliases);
        });
        $("form").submit(function(){
            $("textarea", this).each(function(){
                runReplacements(this, edit_aliases_back);
            });
        });
        return true;
    });
}

Mithgol the Webmaster 11:53, 3 февраля 2010 (UTC)

  • Боюсь, что такой лаконизм снизит читаемость кода.
    Александр Машин 13:08, 3 февраля 2010 (UTC)

Массивы замен[править]

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

У меня по этому поводу два вопроса:

  1. Для какой цели в нулевом элементе массива стоит двойная обратная косая черта, а в следующем элементе — однократная?
  2. Если у этой разницы действительно есть некоторая цель, то не получится ли так, что код
edit_aliases_back[i]    = new Array (3);
edit_aliases_back[i][0] = edit_aliases[i][1];
edit_aliases_back[i][1] = edit_aliases[i][0];
edit_aliases_back[i][2] = edit_aliases[i][2];

не достигнет желаемой цели именно потому, что порядок однократной и двойной черты в edit_aliases_back[i] переменится на противоположный сравнительно с edit_aliases[i]?..Mithgol the Webmaster 12:18, 5 февраля 2010 (UTC)

  • Двукратная косая черта превращается в однократную, интерпретируемую уже парсером регулярных выражений, а весь нулевой элемент массива — в регулярное выражение /\u00A0/. Однократная черта даёт просто символ для замены. Резервный алгоритм автоматического формирования edit_aliases_back вызывается только тогда, когда edit_aliases_back не задан явно, зато в личных настройках задан свой edit_aliases. Он даст неверные результаты только тогда, когда заменяется регулярное выражение (хотя бы /\u00A0/), а не просто строка, о чём и написано в документации; но если человек задал в личных настройках приспособления регулярное выражение, он сможет и явно прописать обратную замену.
    Александр Машин 13:08, 5 февраля 2010 (UTC)
  • Ага, понятно. Но тогда, быть может, уместно сразу и заменить в коде двукратную черту именно на однократную, чтобы получался как раз сам символ, и оттого чтобы и для замены, и для регэкспа он выходил одинаков? И тем избавиться от надобности вручную записывать обратную замену. Экономия усилий. —Mithgol the Webmaster 15:41, 5 февраля 2010 (UTC)
  • Не уверен, что парсер регулярных выражений JavaScript правильно поймёт символ неразрывного пробела. Безопаснее его обозначать escape-последовательностью.
    Александр Машин 15:50, 5 февраля 2010 (UTC)
  • Парсер обязан понимать этот символ буквально (к такому поведению его обязывает раздел 15.10 стандарта ECMA-262, определяющего ECMAScript). И так как у нас нет данных о парсерах, пренебрегающих именно этим обязательством, то считаю нужным двойную косую черту переменить тут на одинарную. И переменю. Однако не удастся избавиться от надобности вручную записывать обратную замену. Обратная замена должна превосходить только тогда, когда символ средней точки не предшествует двойной закрывающей фигурной скобке, а не то страдает тот шаблон наш, имя которого состоит из средней точки.Mithgol the Webmaster 10:41, 19 марта 2010 (UTC)