MediaWiki:Gadget-makecard.js

Материал из свободной русской энциклопедии «Традиция»
Перейти к: навигация, поиск
/*
 * Автогенерация шаблона Summary на основании спецификации.
 * А. Машин
 */
 
if (mw.config.wgNamespaceNumber === 10 || mw.config.wgNamespaceNumber === 156)  {
	if (!mw.edit_gadget_extensions) {
	    mw.edit_gadget_extensions = [];
    }
    mw.edit_gadget_extensions.push (function () {
        mw.tools_above [mw.tools_above.length - 5].splice (-1, 0,
            {wrapper: (mw.config.wgNamespaceNumber === 10 ? makeTemplate : makeForm), button: '<img src="/images/d/d5/Etool_make_template.png" width="16" height="16" alt="M"/>', title: 'Создать ' + (mw.config.wgNamespaceNumber == 10 ? 'шаблон' : 'форму'), all: true}
        );
    });
} 
  
// Создать шаблон, основанный на [[Шаблон:Карточка]] по синтаксису вызова:
function makeTemplate (/* String */ s) {
    return makeTemplateOrCard (true, s);
}

// Создать форму, основанную на [[Шаблон:Карточка]] по синтаксису вызова:
function makeForm (/* String */ s) {
    return makeTemplateOrCard (false, s);
}

/* Функция, генерирующая:
 *     код шаблона, основанного на шаблоне Карточка или
 *     код формы Semantic Forms с тем же оформлением
 * на основании синтаксиса вызова шаблона в виде
 * {{<Имя шаблона>
 *     | <параметр1> = пояснение1
 *     | <параметр2> = пояснение2
 * ...
 *     | <параметрn> = пояснениеn
 * }}
 * Спецификация синтаксиса берётся из выделения в окне редактирования викитекста;
 * если ничего не выделено, используется всё содержимое окна.
 *
 * Для генерации кода шаблона или формы нужно нажать кнопку со всплывающей подсказкой «Создать карточку».
 *
 * Автор: Александр Машин, 2 августа 2009 (создание шаблона) и 11 октября 2009 (создание формы) -- в виде приспособления.
 * 7 сентября 2012 -- интеграция в инструменты редактирования
 * 
 */
 
// Создание кода шаблона-карточки или формы-карточки на основе переданной спецификации:
function makeTemplateOrCard (/* Bool */is_template, /* String */specs) {
    // Ничего не выбрано:
	if (undefined == typeof specs || !specs || '' == specs) return specs;
    // Это не вызов шаблона с параметрами:
	var params = specs.split ('|');
    if (params == null) return specs;
	
    var t_body = '';
    // Проход по параметрам.
    // Номера параметров не подряд, чтобы облегчить вставку:
    var incr = 99 / params.length; // -- заменить на var incr = 10; после перехода [[Шаблон:Карточка]] на циклы.
    incr = incr < 1 ? 1 : incr;
    for (var i = 0; i < params.length; i++) {
        // Обрезка пробелов и того, что после =:
        var param = $.trim (params [i].split ('=') [0]);
        param = param.replace (/}}.*/, ''); // -- удаление закрывающих }}.
        param = param.substr (0, 1).toLocaleLowerCase () + param.substr (1); // -- регистр параметра.
        if (param.indexOf ('{{') > -1) {
            // Это название шаблона:
            var template_title = param.replace (/^.*\{\{/, '');
            continue;
        }
        if (is_template && (param == 'название'    || param == 'name'
                         || param == 'тип'         || param == 'type'
                         || param == 'изображение' || param == 'image'
                         || param == 'ширина'      || param == 'width'
                         || param == 'подпись'     || param == 'signature')) {
            // Эти параметры идут в заголовке шаблона:
            continue;
        }
        if (!is_template && (param == 'название' || param == 'name'
                          || param == 'ширина'   || param == 'width'
                          || param == 'подпись'  || param == 'signature')) {
            // Эти параметры идут в заголовке формы:
            continue;
        }
        var param_no = Math.floor ((i + 1) * incr).toString ();
        var label = param.substr (0, 1).toLocaleUpperCase () + param.substr (1).toLocaleLowerCase ();
        if (is_template) {
            // Это шаблон:
            var type = param.toLocaleLowerCase ().indexOf ('дата') > -1
                    || param.toLocaleLowerCase ().indexOf ('год')  > -1
                    || param.toLocaleLowerCase ().indexOf ('день') > -1
                     ? 'дата'
                     : 'страница';
            var prop = type == 'дата' ? label.replace (/(дата|год|день)\s*/i, '') : label;
            param    = '{{{' + param + '|{{{' + label + '|}}}}}}';
        } else {
            // Это форма:
            param    = '{{{field|' + param + '|width=23}}}';
        }
        t_body = t_body + '\n'
               + '\n | заголовок' + param_no + ' = ' + ''
               + '\n | метка' + param_no + ' = ' + label 
               + '   | текст' + param_no + ' = ' + param;
        if (is_template) {
            // Это нужно только для шаблонов:
            t_body = t_body
                   + '\n | свойство' + param_no + ' = ' + prop
                   + ' | обратно' + param_no + ' = ' + ''
                   + ' | тип' + param_no + ' = ' + type
                   + ( type != 'дата' ?('\n | категория' + param_no + ' = ' + ''
                   + ' | постфикс' + param_no + ' = ' + '')
                   :('\n | категория_дня' + param_no + ' = ' + ''
                   + ' | постфикс_дня' + param_no + ' = ' + ''
                   + ' | категория_года' + param_no + ' = ' + ''
                   + ' | постфикс_года' + param_no + ' = ' + ''));
        }
    }
    t_foot     = '\n\n | внизу ='
               + ' | стиль_внизу = '
               + ' | форма = ' + template_title
               + '}}\n';
 
    if (is_template) {
        // Это шаблон:
        var preface    = '';
        var title      = '{{{название|{{{Название|{{{name|{{{Name|{{PAGENAME}}}}}}}}}}}}}}';
        var subtitle   = '{{{тип|{{{Тип|{{{type|{{{Type|' + template_title + '}}}}}}}}}}}}';
        var image      = '{{{изображение|{{{Изображение|{{{image|{{{Image|}}}}}}}}}}}}';
        var width      = '{{{ширина|{{{Ширина|{{{width|{{{Width|}}}}}}}}}}}}';
        var signature  = '{{{подпись|{{{Подпись|{{{signature|{{{Signature|}}}}}}}}}}}}';
        var head_props = '';
        var body_class = '';
    } else {
        // это форма:
        var preface    = '<noinclude>{{#forminput:' + template_title + '|120|(' + template_title + ' — новая)|Создать}}\n'
                       + '</noinclude><includeonly>\n'
                       + '{{{info|page name=<' + template_title + '[название]>|add title=Создание статьи о ' + template_title + '|edit title=Правка статьи о·' + template_title + '}}}\n'
                       + '<!-- <div id="wikiPreview" style="display none; padding-bottom 25px; margin-bottom 25px; border-bottom 1px solid #AAAAAA;"></div> -->\n'
                       + '{{{for template|' + template_title + '}}}';
        var title      = '{{{field|название|width=52}}}';
        var subtitle   = '';
        var image      = '';
        var width      = '';
        var signature  = '';
        var head_props = '-';
        var body_class = 'formtable';
    }
    var t_head = preface
               + '\n{{Карточка'
               + '\n |имя = ' + template_title
               + '\n |стиль_тела = border-color: black'
               + '\n |класс_тела = ' + body_class
               + '\n |шапка = '
               + '   |стиль_шапки = '
               + '   |свойство_шапки = ' + head_props
               + '   |класс_шапки = '
               + '\n |название = ' + title
               + '   |стиль_названия = black'
               + '\n |вверху = '
               + '   |стиль_вверху = '
               + '   |свойство_вверху = ' + head_props
               + '\n |вверху2 = ' + subtitle
               + '   |стиль_вверху2 = '
               + '   |свойство_вверху2 = ' + head_props
               + '\n |вверху3 = '
               + '   |стиль_вверху3 = ' 
               + '   |свойство_вверху3 = ' + head_props
               + '\n |значок = '
               + '\n |изображение = ' + image
               + '\n |стиль_заголовков = '
               + '   |стиль_меток = '
               + '   |стиль_текста = ';
    if (is_template) {
        // шаблон:
        t_foot = t_foot
               + '<noinclude>\n<pre>\n' + specs + '\n</pre>\n[[Категория:Традиция:Шаблоны Summary]]</noinclude>';
    } else {
        // форма:
        t_foot = t_foot
               + '{{{end template}}}\n'
               + '{{{standard input|free text|rows=25|cols=55}}}\n\n'
               + '{{{standard input|summary}}}\n\n'
               + '{{{standard input|minor edit}}} {{{standard input|watch}}}\n\n'
               + '{{{standard input|save}}} {{{standard input|preview}}} {{{standard input|changes}}} {{{standard input|cancel}}}\n\n'
               + '</includeonly><noinclude>[[Категория:Традиция:Формы]]</noinclude>';
    }
    return t_head + t_body + t_foot;
}