Документация по модулю [ просмотреть ] [ изменить ] [ историю ] [ очистить ]
Этот модуль создает баннер для страниц архива обсуждений. Модуль автоматически обнаруживает окружающие архивы и создает на них навигационные ссылки, отсюда и название.
Применение
Доступ к этому модулю осуществляется через шаблон Шаблон: автоматический навигатор архива . См. Страницу с шаблоном для документации.
Зависимости
Этот модуль использует модуль конфигурации в Модуле: Автоматический навигатор архивов / config . Он также использует модуль: наивысший номер архива , модуль: аргументы , модуль: да нет и модуль: окно сообщения .
-------------------------------------------------- ------------------------------ Автоматический навигатор архива-- Этот модуль создает баннер архива разговора вместе с автоматически-- сформированный список навигационных ссылок на другие архивы страницы обсуждения в-- вопрос. В нем реализован {{Автоматический навигатор архивов}} и- {{Навигация по архиву разговоров}}.-------------------------------------------------- -----------------------------local yesno = require ( 'Модуль: Да нет' )-------------------------------------------------- ------------------------------ Вспомогательные функции-------------------------------------------------- -----------------------------локальная функция makeWikilink ( страница , отображение )если дисплей тоreturn string.format ( '[[% s |% s]]' , страница , отображение )ещеreturn string.format ( '[[% s]]' , страница )конецконецлокальная функция escapePattern ( s )- Избегайте знаков препинания в строке, чтобы ее можно было использовать в шаблоне Lua.s = s : gsub ( '% p' , '%%% 0' )вернуть sконец-------------------------------------------------- ------------------------------ Класс навигатора-------------------------------------------------- -----------------------------местный навигатор = {}Навигатор . __index = Навигаторфункция навигатора . новый ( аргументы , cfg , currentTitle )local obj = setmetatable ({}, навигатор )- Установить входыOBJ . args = argsOBJ . cfg = cfgOBJ . currentTitle = currentTitle- Префикс архива- Декодируйте объекты HTML, чтобы пользователи могли вводить такие вещи, как «Архив & # 32;» из- викитекст.OBJ . archivePrefix = obj . аргументы . префикс или объект : сообщение ( 'архив-префикс' )OBJ . archivePrefix = mw . текст . декодирования ( OBJ . archivePrefix )- Текущий номер архиваделатьлокальный шаблон = string.format ('^% s ([1-9] [0-9] *) $' ,escapePattern ( OBJ . archivePrefix ))OBJ . currentArchiveNum = объект . currentTitle . subpageText : match ( шаблон )OBJ . currentArchiveNum = ToNumber ( OBJ . currentArchiveNum )конец- Наивысший номер архиваOBJ . highArchiveNum = require ( 'Модуль: Наивысший номер архива' ). _main ( OBJ . currentTitle . nsText .. ':' .. OBJ . currentTitle . baseText .. '/' .. OBJ . archivePrefix)вернуть объектконецфункция Навигатор : сообщение ( клавиша , ...)локальное сообщение = self . cfg [ ключ ]если select ( '#' , ...) > 0, товернуть мв . сообщение . newRawMessage ( сообщение , ...): plain ()ещевернуть сообщениеконецконец Навигатор функций : makeBlurb ()локальные аргументы = self . аргументыесли args [ 1 ] == '1', то- Старый шаблон использовал "| 1" для подавления рекламного сообщения.вернуться ''ещеместный ретесли аргументы . текст тогдаret = args . текстещеlocal talkPage = self . currentTitle . nsText ..':' ..я . currentTitle . baseTextесли аргументы . период тогдаret = self : message ( 'blurb-period' , talkPage , args . period )ещеret = self : message ( 'blurb-noperiod' , talkPage )конецконецвозвращение в отставкеконецконец Навигатор функций : makeMessageBox ()локальные аргументы = self . аргументыместный образесли аргументы . изображение тогдаизображение = аргументы . изображениеещелокальный значок = аргументы . значок или self : message ( 'default-icon' )изображение = строка.формат ('[[Файл:% s |% s | alt = | ссылка =]]' ,значок ,self : message ( 'размер изображения' ))конецlocal mbox = require ( 'Модуль: окно сообщения' ). main ( 'tmbox' , {image = изображение ,imageright = args . imageright ,style = args . style или 'width: 80%; margin-left: auto; margin-right: auto' ,textstyle = args . textstyle или 'выравнивание текста: по центру' ,текст = сам : makeBlurb ()})вернуть mboxконец Навигатор функций : getArchiveNums ()- Возвращает массив номеров архива для форматирования.local noLinks = tonumber ( self . args . links ) или self : message ( 'default-link-count' )noLinks = math.floor ( noLinks )- Если | noredlinks - «да», истина или отсутствует, не разрешать красные ссылки. Если это- «нет» или «ложь», разрешить красные ссылки.local allowRedLinks = yesno ( self . args . noredlinks ) == falseместный ток = сам . currentArchiveNumместный наивысший = себя . highArchiveNumесли не текущий или не самый высокий или noLinks < 1, товозврат {}elseif noLinks == 1 тогдавернуться { текущий }конецлокальная функция getNum ( i , current )- Получает номер архива, заданный i, позицию в массиве вдали от- текущий архив и текущий номер архива. Первые два- смещения последовательные; третье смещение округляется до- ближайшие 5; а четвертое и последующие смещения округляются до- ближайшая 10. Смещения рассчитываются таким образом, что архив- номера не дублируются.если - 2 <= i и i <= 2, товозврат тока + яelseif - 3 <= i и i <= 3, тогдаобратный ток + 2 - ( ток + 2 ) % 5 + ( i / 3 ) * 5elseif 4 <= i, тогдаобратный ток + 7 - ( ток + 7 ) % 10 + ( i - 3 ) * 10ещеобратный ток + 2 - ( ток + 2 ) % 10 + ( i + 3 ) * 10конецконецместный НУМС = {}- Архив с номерами ниже, чем на текущей странице.для i = - 1 , - math.floor (( noLinks - 1 ) / 2 ), - 1 doместное число = getNum ( я , текущий )если num <= 1, тоtable.insert ( НУМС , 1 , 1 )перерывещеtable.insert ( НУМС , 1 , Num )конецконец-- Текущая страница.если НУМС [ # Nums ] < тока тогдаtable.insert ( НУМС , ток )конец- Более высокие номера архивов.для я = 1 , Math.ceil (( noLinks - 1 ) / 2 ) делатьместное число = getNum ( я , текущий )если число <= наибольшее, тоtable.insert ( НУМС , Num )elseif allowRedLinks и ( i <= 2 или i <= 3 and num == nums [ # nums ] + 1 ), то- Вставляйте только одну красную ссылку, и только если она последовательная.table.insert ( НУМС , самая высокая + 1 )перерывelseif nums [ # nums ] < наивысшее, то- Вставьте наивысший номер архива, если его еще нет.table.insert ( nums , самый высокий )перерывещеперерывконецконецвозвращение НУМСконец Навигатор функций : makeArchiveLinksWikitable ()местные языки = мвт . язык . getContentLanguage ()local nums = self : getArchiveNums ()местное noLinks = # НУМСАесли noLinks < 1, товернуться ''конец- Составьте таблицу ссылок.местные ссылки = {}локальный isCompact = noLinks > 7местный currentIndexдля I , Num в ipairs ( НУМС ) делаютлокальная подстраница = self . archivePrefix .. tostring ( число )местный дисплейесли isCompact, тоdisplay = tostring ( число )ещеdisplay = self : message ( 'архив-ссылка-дисплей' , число )конецlocal link = makeWikilink ( '../' .. подстраница , отображение )если num == self . currentArchiveNum, затемlink = string.format ( '% s ' , ссылка )currentIndex = яконецtable.insert ( ссылки , ссылка )конец- Добавьте стрелки.- Сначала мы должны сделать стрелку вперед, поскольку мы добавляем элементы в- таблица ссылок. Если бы мы сначала сделали обратную стрелку, то индекс для- текущий архив будет неправильным.currentIndex = currentIndex или Math.ceil ( # ссылки / 2 )для i = currentIndex + 1 , # ссылки делаютесли nums [ i ] - nums [ i - 1 ] > 1, тоtable.insert ( ссылки , я , языки : getArrow ( 'вперед' ))перерывконецконецдля i = currentIndex - 1 , 1 , - 1 сделатьесли nums [ i + 1 ] - nums [ i ] > 1, тоtable.insert ( ссылки , я + 1 , lang : getArrow ( 'назад' ))перерывконецконец- Вывести вики-таблицу.местное ret = {}местная ширинаесли noLinks <= 3, тоwidth = string.format ( '% dem' , noLinks * 10 )elseif noLinks <= 7 тогдаwidth = string.format ( '% dem' , ( noLinks + 3 ) * 5 )ещеширина = '50em'конецret [ # ret + 1 ] = string.format ('{| style = "width:% s; background: transparent; ' ..'margin: 0 auto 0.5em; text-align: center "' ,ширина)для i , s в ipairs ( ссылки ) делаемесли я % 20 == 1, тоret [ # ret + 1 ] = ' \ n | -'конецret [ # ret + 1 ] = ' \ n | 'ret [ # ret + 1 ] = sконецret [ # ret + 1 ] = ' \ n |}'вернуть table.concat ( ret )конец Навигатор функций : __tostring ()вернуть себя : makeMessageBox () ..' \ n ' .. self : makeArchiveLinksWikitable () .. '__NONEWSECTIONLINK__ __NOEDITSECTION__'конец-------------------------------------------------- ------------------------------ Экспорт-------------------------------------------------- -----------------------------местный p = {}функция p . _exportClasses ()return {Navigator = Навигатор}конецфункция p . _aan ( аргументы , cfg , currentTitle )cfg = cfg или mw . loadData ( 'Модуль: Автоматический навигатор архивов / конфигурация' )currentTitle = currentTitle или mw . название . getCurrentTitle ()local aan = навигатор . новый ( аргументы , cfg , currentTitle )вернуться в строку ( ан )конецфункция p . аан ( кадр )local args = require ( 'Модуль: аргументы' ). getArgs ( frame , {wrappers = 'Шаблон: автоматический навигатор архивов' ,})возврат п . _aan ( аргументы )конецвернуть p