Документация по модулю [ просмотреть ] [ изменить ] [ историю ] [ очистить ]
Этот модуль реализует {{ запрошенный ход }}. См. Документацию на страницах шаблонов.
- Этот модуль реализует {{запрошенный ход}}.- Загрузить необходимые модулиlocal getArgs = require ( 'Модуль: аргументы' ). getArgslocal tableTools = require ( 'Модуль: TableTools' )local yesno = require ( 'Модуль: Да нет' )local mRedirect = require ( 'Модуль: Перенаправление' )- Установить статические значенияlocal defaultNewPagename = '?' - Название новых страниц, которые не были указаныместный p = {}-------------------------------------------------- ------------------------------- Вспомогательные функции-------------------------------------------------- ------------------------------ локальная функция ERR ( MSG , numargs , причина , подсчет )- Создает сообщение об ошибке вики-текстаlocal commented = 'если count ~ = 1, то прокомментировал = прокомментировал .. 'new1 ='конецпрокомментировал = прокомментировал .. numargs [ 1 ] [ 'новое' ]для я = 2 , подсчет делаемпрокомментировал = прокомментировал .. string.format ( '| current% i =% s' , i , ( numargs [ i ] [ 'current' ] или '' ))прокомментировал = прокомментировал .. string.format ( '| new% i =% s' , i , ( numargs [ i ] [ 'new' ] или '' ))конецесли причина тогда прокомментировал = прокомментировал .. '| причина =' .. причинаконецпрокомментировал = прокомментировал .. '}} ->'return string.format ( '{{error |% s}}' , msg ) .. прокомментировалконецлокальная функция validateTitle ( страница , paramName , paramNum ) - Проверяет имя страницы и, если оно допустимо, возвращает истину и заголовок.- объект для этой страницы. Если он недействителен, возвращает false и- соответствующее сообщение об ошибке.- Проверьте небольшое подмножество символов, которые нельзя использовать в MediaWiki.- титулы. Полный набор ограничений см.- [[Википедия: Название страницы # Технические ограничения и ограничения]]. Это- также распространяется проверка недействительного заголовка, но с помощью этой проверки мы можем дать- более конкретное сообщение об ошибке.local invalidChar = page : match ( '[# <>% [%] | {}]' )если недействительныйChar, тоlocal msg = 'Недействительный символ "'.. invalidChar.. '"найдено в"'.. paramName.. paramNum.. '"параметр"вернуть ложь , сообщениеконец- Получить титровальный объект. Это также проверяет недопустимые заголовки, которые не- покрыто предыдущей проверкой.местный titleObj = mw . название . новый ( страница )если не titleObj, тоlocal msg = 'В параметре "обнаружен недопустимый заголовок".. paramName.. paramNum .. '"; проверьте [[Википедия: имя страницы #'.. 'Технические ограничения | недопустимые символы]]'вернуть ложь , сообщениеконец- Проверить наличие межвики-ссылок. Заголовки с интервики делают заголовок действительным- объекты, но не могут быть созданы в локальной вики.локальный интервики = titleObj . интервикиесли интервики и интервики ~ = '', тоlocal msg = 'В параметре "обнаружен недопустимый заголовок".. paramName.. paramNum .. '"; имеет [[Справка: межвики-ссылки | префикс интервики]]"'.. titleObj . интервики.. ': "'вернуть ложь , сообщениеконецвернуть истину , titleObjконец-------------------------------------------------- ------------------------------- Проверить точку входа в заголовок (используется в [[Template: RMassist / core]])-------------------------------------------------- ------------------------------функция p . validateTitle ( кадр )локальное значение = кадр . аргументы [ 1 ]local validTitle , currentTitle = validateTitle ( значение или '' , '1' , '' )если не validTitle, то- Если неверно, вторым параметром является сообщение об ошибке.локальное сообщение = currentTitleвернуть сообщениеконецответьте "да"конец-------------------------------------------------- -------------------------------- Основная функция-------------------------------------------------- ------------------------------функция p . основной ( фрейм )-------------------------------------------------- --------------------------- Инициализировать переменные и предварительно обработать аргументы-------------------------------------------------- --------------------------local args = getArgs ( кадр , { parentOnly = true })местное название = mw . название . getCurrentTitle ()- [[ - Для перебора аргументов current1, new1, current2, new2, ... - получаем массив таблиц, отсортированных по номерам и сжатых так, чтобы- его можно пройти с помощью ipairs. Формат таблицы выглядит так: - { - {current = x, new = y, num = 1}, - {current = z, new = q, num = 2}, - ... -} - Поле «число» используется для правильного сохранения номера параметра. - это использовалось на случай, если пользователи пропускают какие-либо числа в вызове. - - Параметр current1 - это особый случай, так как его не нужно- уточнил. Чтобы избежать конфликтов с более поздними текущими параметрами, нам необходимо - добавить его в таблицу аргументов вручную. - - Кроме того, мы разрешаем первому позиционному параметру быть псевдонимом для - параметр new1, чтобы синтаксис старых шаблонов - Будут поддерживаться как {{required move}}, так и {{move-multi}}. - - Переменная multi отслеживает, используем ли мы ранее синтаксис. - произведено {{запрошенным перемещением}} или синтаксисом, ранее созданным- {{move-multi}}. В первом случае multi ложно, а во втором - неверно. -- правда. -]]если не аргументы . current1 тогдааргументы . current1 = заголовок . subjectPageTitle . prefixedTextконец- Найдите первый новый заголовок страницы, если он указан, и сохраните запись- префикс, использованный для его создания; префикс будет использован позже, чтобы сделать ошибку-- Сообщения.местный firstNewParamесли аргументы . new1 тогдаfirstNewParamPrefix = 'новый'elseif args [ 1 ] тогдааргументы . new1 = args [ 1 ]firstNewParamPrefix = ''ещеfirstNewParamPrefix = ''конец- Создайте отсортированную таблицу аргументов.local argsByNum = {}для k , v в парах ( args ) делаемk = tostring ( k )локальный префикс , num = k : match ( '^ (% l *) ([1-9] [0-9] *) $' )если prefix == 'current' или prefix == 'new', тоNum = ToNumber ( Num )локальная подтаблица = argsByNum [ число ] или {}подтаблица [ префикс ] = vподтаблица . число = числоargsByNum [ число ] = подтаблицаконецконецargsByNum = tableTools . compressSparseArray ( argsByNum )- Подсчитайте количество аргументов и имеем ли мы дело с- многократное выдвижение.local argsByNumCount = # argsByNumместный мультиесли argsByNumCount > = 2, тоmulti = trueещеmulti = falseконец- [[ - Проверить новые параметры. - Эта проверка гарантирует, что у нас нет отсутствующих новых параметров, и что - пользователи просто не скопировали значения со страницы документации. -]]если мульти тодля i , t в ipairs ( argsByNum ) делаемместный новый = т . новыйместный номер = t . числоесли не новый или новый == 'Новый заголовок для страницы' .. tostring ( num ), тоargsByNum [ i ]. new = defaultNewPagenameконецконецещелокальный новый = argsByNum [ 1 ]. новыйесли не новый или новый == 'NewName', тогдаargsByNum [ 1 ]. new = defaultNewPagenameконецконец-------------------------------------------------- --------------------------- Проверка ошибок-------------------------------------------------- --------------------------- Subst checkесли не мв . isSubsting (), затемместный lb = mw . текст . nowiki ( '{{' )местный rb = mw . текст . nowiki ( '}}' )local msg = ''.. 'Этот шаблон должен быть [[Википедия: подстановка шаблона | заменено]];'.. 'заменить% srequested move% s на% ssubst: запрошенный ход% s'.. ''msg = string.format ( msg , lb , rb , lb , rb )вернуть сообщениеконец- Убедитесь, что мы на странице обсужденияесли не заголовок . isTalkPage тогдаlocal msg = '[[Шаблон: запрошенное перемещение]] необходимо использовать в TALKSPACE, например, [[% s:% s]]'msg = string.format ( msg , mw . site . namespaces [ title . namespace ]. talk . name , title . text )Возвращение ERR ( тзд , argsByNum , арг . Причина , argsByNumCount )конец- Проверить аргументыместные currentDupes , newDupes = {}, {}для i , t в ipairs ( argsByNum ) делаемместный ток = t . Текущийместный новый = т . новыйместный номер = t . числоместный validCurrentместный currentTitleместный предмет- Проверить на недопустимые или отсутствующие параметры currentn- Эта проверка должна быть первой, так как mw.title.new выдаст ошибку, если- введен неверный ввод.если не текущий, тоlocal msg = 'Отсутствует параметр "текущий% d";'.. 'добавьте или удалите параметр "новый% d"'msg = string.format ( сообщение , число , число )Возвращение ERR ( тзд , argsByNum , арг . Причина , argsByNumCount )конец- Получить текущий титровальный объект и проверить недопустимые заголовки. Эта проверка- должны предшествовать проверкам пространства имен и существования, так как они будут- выдавать скриптовые ошибки, если титровальный объект не существует.validCurrent , currentTitle = validateTitle ( текущий , 'текущий' , число )если не validCurrent то- Если неверно, вторым параметром является сообщение об ошибке.локальное сообщение = currentTitle Возвращение ERR ( тзд , argsByNum , арг . Причина , argsByNumCount )конец- Проверка пространства имен категорийsubjectSpace = mw . сайт . пространства имен [ currentTitle . пространство имен ]. предмет . я быесли subjectSpace == 14, тоlocal msg = '[[Шаблон: запрошенное перемещение]] не для категорий,'.. 'см. [[Википедия: Категории для обсуждения]] »Возвращение ERR ( тзд , argsByNum , арг . Причина , argsByNumCount )- Проверка пространства имен файловelseif subjectSpace == 6, тогдаlocal msg = '[[Шаблон: запрошенное перемещение]] не для файлов;'.. 'см. [[Википедия: Перемещение страницы # Перемещение страницы файла]] ».. '(вместо этого используйте [[Template: Rename media]])'Возвращение ERR ( тзд , argsByNum , арг . Причина , argsByNumCount )- Черновик и проверка пространства имен пользователяelseif subjectSpace == 2 или subjectSpace == 118, тогдаlocal msg = '[[Шаблон: запрошенное перемещение]] не для перемещений из черновика или пользовательского пространства.'.. '
Если вы хотите отправить свой черновик на рассмотрение, добавьте {{tlf | subst: submit}}
' .. 'в начало страницы.'.. '
В противном случае см. инструкции в [[Справка: Как переместить страницу]].'.. '
Если вы не можете переместить его самостоятельно, см. [[Википедия: Запрошенные ходы # Запрос технических ходов | Запрос технических ходов]] ».Возвращение ERR ( тзд , argsByNum , арг . Причина , argsByNumCount )конец- Запрос на перемещение одной страницы должен быть помещен в обсуждение этой страницы или на страницу, на которую он перенаправляетесли не multi и args . current1 ~ = заголовок . subjectPageTitle . prefixedText, затемместная idealpage = mw . название . новый ( аргумент . current1 ). talkPageTitleлокальный rtarget = mRedirect . getTarget ( идеальная страница )если rtarget == title . prefixedText, затемmulti = trueещеместная Msg = «Запрос для перемещения одной страницы должен быть размещен на этой странице \» ы разговора или на странице его ток переадресовывает к»Возвращение ERR ( тзд , argsByNum , арг . Причина , argsByNumCount )конецконец- Проверьте несуществующие заголовки.если не currentTitle . существует тогдаlocal msg = 'Необходимо создать [[:% s]] перед запросом на перемещение »msg = string.format ( сообщение , текущий )Возвращение ERR ( тзд , argsByNum , арг . Причина , argsByNumCount )конец- Проверить дубликаты текущих заголовков- Мы знаем, что идентификатор не равен нулю, потому что мы уже проверили-- существование.локальный currentId = currentTitle . я быесли currentDupes [ currentId ] , тоlocal msg = 'Обнаружен повторяющийся заголовок ("'.. currentTitle . prefixedText.. '"); нельзя переместить одну и ту же страницу в два разных места'Возвращение ERR ( тзд , argsByNum , арг . Причина , argsByNumCount )ещеcurrentDupes [ currentId ] = верноконец- Проверьте новые недействительные заголовки. Эта проверка должна быть произведена до- проверка дублированного заголовка для новых заголовков, так как это создаст сценарий- ошибка, если титровальный объект не существует.локальный validNew , newTitle = validateTitle (новый ,multi и 'new' или firstNewParamPrefix ,число)если не validNew то- Если неверно, вторым параметром является сообщение об ошибке.local msg = newTitleВозвращение ERR ( тзд , argsByNum , арг . Причина , argsByNumCount )конец- Проверьте наличие повторяющихся новых заголовков.- Мы не можем использовать page_id, так как новые страницы могут не существовать, и поэтому- несколько страниц могут иметь идентификатор 0. Используйте prefixedText как- разумный откат. Нам также необходимо убедиться, что мы не используем- имя новой страницы по умолчанию, так как мы не хотим, чтобы оно рассматривалось как дубликат- page, если пропущено более одного нового имени страницы.локальный newPrefixedText = newTitle . prefixedTextесли newPrefixedText ~ = defaultNewPagename, тоесли newDupes [ newPrefixedText ], тоlocal msg = 'Обнаружен повторяющийся заголовок ("'.. newTitle . prefixedText.. '"); нельзя переместить две разные страницы в одно и то же место'Возвращение ERR ( тзд , argsByNum , арг . Причина , argsByNumCount )ещеnewDupes [ newPrefixedText ] = истинаконецконецконец-------------------------------------------------- --------------------------- Создать заголовок-------------------------------------------------- --------------------------- Для пользовательских значений | heading = используйте те.- Для | heading = no, | heading = n и т. Д. Не включайте заголовок.- В противном случае используйте текущую дату в качестве заголовка.локальный заголовок = аргументы . заголовок или аргументы . заголовокlocal useHeading = yesno ( заголовок , заголовок )если заголовок и useHeading == заголовок, тозаголовок = '==' .. заголовок .. '== \ n \ n 'elseif useHeading == false тогдазаголовок = ''ещеместные языки = мвт . язык . getContentLanguage ()local headingDate = lang : formatDate ( 'j F Y' )heading = '== Запрошенное перемещение' .. headingDate .. '== \ n \ n 'конец-------------------------------------------------- --------------------------- Создайте вызов {{запрошено перемещение / датировано}}-------------------------------------------------- --------------------------местный rmd = {}rmd [ # rmd + 1 ] = '{{запрошенный ход / дата'если мульти тоrmd [ # rmd + 1 ] = '| несколько = да'rmd [ # rmd + 1 ] = ' \ n | current1 =' .. argsByNum [ 1 ]. Текущийконец- [[- Первое новое название. Это используется как одиночными, так и множественными; для одиноких- это единственный используемый параметр. Для single имя параметра - первое - позиционный параметр, а для multi имя параметра - "new1". -]]local new1param = multi и 'new1 =' или ''rmd [ # rmd + 1 ] = '|' .. new1param .. argsByNum [ 1 ]. новый- Добавьте остальные аргументы в пользу multi.если мульти тодля я = 2 , argsByNumCount делатьместный t = argsByNum [ i ]локальный numString = tostring ( я )местный ток = t . Текущийместный новый = т . новыйrmd [ # rmd + 1 ] = '| current' .. numString .. '=' .. currentrmd [ # rmd + 1 ] = '| new' .. numString .. '=' .. newконец- В старом мультишаблоне всегда есть полоса перед закрывающим фигурным- брекеты, так что мы тоже сделаем это.rmd [ # rmd + 1 ] = '|'конецrmd [ # rmd + 1 ] = '}}'RMD = table.concat ( RMD )-------------------------------------------------- --------------------------- Сгенерировать список ссылок на страницы, которые нужно переместить-------------------------------------------------- --------------------------local linkList = {}для i , t в ipairs ( argsByNum ) делаемместный ток = t . Текущийместный новый = т . новыйlocal msg = ' \ n % s [[:% s]]] →'если new ~ = defaultNewPagename, тоmsg = msg .. '{{без перенаправления |% s}}'ещесообщение = сообщение .. '% s'конецлокальный элемент = строка.формат (сообщение ,multi и '*' или '' , - не составлять список для перемещения по одной странице.ток ,новый)linkList [ # linkList + 1 ] = элементконецlinkList = table.concat ( linkList )-------------------------------------------------- --------------------------- Объяснение причины и разговора-------------------------------------------------- ---------------------------- Причинаместная причина = аргументы . причина или аргументы [ 2 ] или «Пожалуйста, разместите здесь свое обоснование предлагаемого шага».причина = '-' .. причинаесли да, то нет ( аргументы . знак или аргументы . сигн. или аргументы . подпись или 'не указано' , а не причина : совпадение ( "~~~ $" )), топричина = причина .. '~~~~'конец- Обсуждение аннотацииместный разговоресли да нет ( аргумент . разговор , правда ), тоtalk = frame : expandTemplate { title = 'Запрошенный ход / разговор' }ещеразговор = ''конец-------------------------------------------------- --------------------------- Соберите выход-------------------------------------------------- --------------------------- Старые шаблоны начинаются с разрыва строки, так что мы тоже сделаем это.локальный ret = string.format (' \ n % s% s \ n % s% s% s% s' ,заголовок ,rmd ,linkList ,multi и ' \ n ' или '' ,причина ,говорить)возвращение в отставкеконецвернуть p