Модуль: Navbox / песочница


< Модуль: Navbox
Документация по модулю [ просмотреть ] [ изменить ] [ историю ] [ очистить ]

Этот модуль реализует шаблон {{ Navbox }}. Пожалуйста, ознакомьтесь с инструкциями по использованию на странице шаблона .

Категории отслеживания / обслуживания

  • Категория: Навбоксы для детей-сирот  (13)
  • Категория: Навигационные блоки без горизонтальных списков  (1,948)
  • Категория: Навбоксы с использованием цветов фона  (64,288)
  • Категория: Возможно неразборчивые навигационные блоки  (7,539)
  • Категория: Навбоксы с использованием границ  (1,905)
-- Этот модуль реализует {{Navbox}}-местный  p  =  {}local  navbar  =  require ( 'Модуль: Navbar' ). _navbarlocal  getArgs  - лениво инициализируетсялокальный  cfg  =  mw . loadData ( 'Модуль: Navbox / конфигурация' )местные  аргументыместная  границаместные  спискиместный  ODD_EVEN_MARKER  =  ' \ 127 _ODDEVEN_ \ 127 'местный  RESTART_MARKER  =  ' \ 127 _ODDEVEN0_ \ 127 'локальный  REGEX_MARKER  =  ' \ 127 _ODDEVEN (% d?) _ \ 127 ' полосатая локальная функция  ( вики-текст )- Вернуть викитекст с замененными маркерами на нечетное / четное чередование.- Дочерние (подгруппы) навигационные блоки помечаются категорией, которая удаляется- родительскими навигационными блоками. В результате в категории отображаются все страницы.- если дочерний навигационный блок не содержится в родительском навигационном блоке.если  граница  ==  cfg . ключевое слово . border_subgroup  и  args [ cfg . арг . сирота ]  ~ =  cfg . ключевое слово . orphan_yes,  тогда-- Без изменений; чередование происходит во внешнем навигационном блоке.вернуть  wikitext  ..  cfg . категория . сиротаконецлокальный  первый ,  второй  =  cfg . класс . navbox_odd_part ,  cfg . класс . navbox_even_partесли  аргументы [ cfg . арг . evenodd ]  тогдаесли  аргументы [ cfg . арг . evenodd ]  ==  cfg . ключевое слово . evenodd_swap  тогдапервый ,  второй  =  второй ,  первыйещеfirst  =  args [ cfg . арг . evenodd ]второй  =  первыйконецконецместный  сменщикесли  первый  ==  второй,  точейнджер  =  первыйещелокальный  индекс  =  0changer  =  функция  ( код )  - где установлен код ???если  code  ==  '0'  тогда- Текущее вхождение для группы перед вложенной таблицей.- Установите его на первое место как допустимый, хотя и бессмысленный класс.- Следующим вхождением будет первая строка после заголовка.- в подгруппе и тоже будет первым.индекс  =  0вернуться  первымконециндекс  =  индекс  +  1 индекс  возврата %  2  ==  1  и  первый  или  второйконецконецлокальное  регулярное выражение  =  cfg . категория . сирота : gsub ( '([% [%]])' ,  '%%% 1' )return  ( wikitext : gsub ( regex ,  '' ): gsub ( REGEX_MARKER ,  changer ))  - () опускает счетчик gsubконецлокальная  функция  processItem ( item ,  nowrapitems )если  элемент : sub ( 1 ,  2 )  ==  '{|'  тогда- Применение nowrap к строкам в таблице не имеет смысла.- Добавьте новые строки, чтобы компенсировать обрезку x в | parm = x в шаблоне.вернуть  ' \ n '  ..  элемент  .. ' \ n 'конецесли  nowrapitems  ==  cfg . ключевое слово . nowrapitems_yes  тогдаместные  линии  =  {}для  строки  в  ( item  ..  ' \ n ' ): gmatch ( '([^ \ n ] *) \ n ' )  doлокальный  префикс ,  content  =  line : match ( '^ ([*:; #] +)% s * (. *)' )если  префикс,  а  не  содержимое : совпадение ( cfg . pattern . nowrap ),  тоline  =  mw . ustring . формат ( cfg . nowrap_item ,  префикс ,  содержимое )конецtable.insert ( строки ,  строка )конецitem  =  table.concat ( строки ,  ' \ n ' )конецесли  item : match ( '^ [*:; #]' ),  товернуть  ' \ n '  ..  элемент  .. ' \ n 'конецвернуть  товарконецлокальная  функция  renderNavBar ( titleCell )если  аргументы [ cfg . арг . навигационная панель ]  ~ =  cfg . ключевое слово . navbar_off  иargs [ cfg . арг . навигационная панель ]  ~ =  cfg . ключевое слово . navbar_plain  и( args [ cfg . arg . name ],  а  не  mw . getCurrentFrame (): getParent (): getTitle (): gsub ( cfg . pattern . sandbox ,  '' )  ==  cfg . pattern . navbox ),  затемtitleCell : wikitext ( navbar {args [ cfg . арг . имя ],[ cfg . навигационная панель . mini ]  =  1 ,[ cfg . навигационная панель . fontstyle ]  =  ( args [ cfg . arg . basestyle ]  или  '' )  ..  ';'  ..( аргументы [ cfg . arg . titlestyle ]  или  "" )  ..'; фон: непрозрачный; граница: нет; тень окна: нет; отступ: 0;'})конецконец-- Заголовок строки-локальная  функция  renderTitleRow ( tbl )если  не  аргументы [ cfg . арг . title ]  затем  верните  конецлокальный  titleRow  =  tbl : tag ( 'tr' )если  аргументы [ cfg . арг . titlegroup ]  тогдаtitleRow: tag ( 'th' ): attr ( 'область' ,  'строка' ): addClass ( cfg . class . navbox_group ): addClass ( args [ cfg . arg . titlegroupclass ]): cssText ( аргументы [ cfg . arg . basestyle ]): cssText ( аргументы [ cfg . arg . groupstyle ]): cssText ( args [ cfg . arg . titlegroupstyle ]): wikitext ( аргументы [ cfg . arg . titlegroup ])конецлокальный  titleCell  =  titleRow : tag ( 'th' ): attr ( 'scope' ,  'col' )если  аргументы [ cfg . арг . titlegroup ]  тогдаtitleCell: css ( 'border-left' ,  '2px solid #fdfdfd' ): css ( 'ширина' ;  '100%' )конецместный  titleColspan  =  2если  аргументы [ cfg . арг . imageleft ],  затем  titleColspan  =  titleColspan  +  1  конецесли  аргументы [ cfg . арг . изображение ],  затем  titleColspan  =  titleColspan  +  1  конецесли  аргументы [ cfg . арг . titlegroup ],  затем  titleColspan  =  titleColspan  -  1  конецtitleCell: cssText ( аргументы [ cfg . arg . basestyle ]): cssText ( аргументы [ cfg . arg . titlestyle ]): addClass ( cfg . class . navbox_title ): attr ( 'colspan' ,  titleColspan )renderNavBar ( titleCell )titleCell: tag ( 'div' )- идентификатор атрибута aria-labelledby: attr ( 'id' ,  mw . uri . anchorEncode ( args [ cfg . arg . title ])): addClass ( args [ cfg . arg . titleclass ]): css ( 'размер шрифта' ;  '114%' ): css ( 'маржа' ,  '0 4em' ): Вики - текст ( processItem ( арг [ CFG . Arg . Название ]))конец-- Верхние / нижние ряды-локальная  функция  getAboveBelowColspan ()местный  ret  =  2если  аргументы [ cfg . арг . imageleft ],  затем  ret  =  ret  +  1  endесли  аргументы [ cfg . арг . изображение ],  затем  ret  =  ret  +  1  endвозвращение в  отставкеконецлокальная  функция  renderAboveRow ( tbl )если  не  аргументы [ cfg . арг . выше ]  затем  верните  конецtbl : tag ( 'tr' ): tag ( 'td' ): addClass ( cfg . class . navbox_abovebelow ): addClass ( args [ cfg . arg . aboveclass ]): cssText ( аргументы [ cfg . arg . basestyle ]): cssText ( args [ cfg . arg . abovestyle ]): attr ( 'colspan' ,  getAboveBelowColspan ()): tag ( 'div' )- id атрибута aria-labelledby, если нет заголовка: attr ( 'id' ,  args [ cfg . arg . title ]  и  nil  или  mw . uri . anchorEncode ( args [ cfg . arg . выше ])): Вики - текста ( processItem ( арг [ CFG . Arg . Выше ],  арг [ CFG . Arg . Nowrapitems ]))конецлокальная  функция  renderBelowRow ( tbl )если  не  аргументы [ cfg . арг . ниже ]  затем  верните  конецtbl : tag ( 'tr' ): tag ( 'td' ): addClass ( cfg . class . navbox_abovebelow ): AddClass ( арг [ CFG . Arg . Belowclass ]): cssText ( аргументы [ cfg . arg . basestyle ]): cssText ( args [ cfg . arg . understyle ]): attr ( 'colspan' ,  getAboveBelowColspan ()): tag ( 'div' ): Вики - текста ( processItem ( арг [ CFG . Arg . Ниже ],  арг [ CFG . Arg . Nowrapitems ]))конец-- Список строк-локальная  функция  renderListRow ( tbl ,  index ,  listnum )локальная  строка  =  tbl : tag ( 'tr' )если  index  ==  1  и  args [ cfg . арг . imageleft ]  затемстрока: tag ( 'td' ): addClass ( cfg . class . noviewer ): addClass ( cfg . класс . изображение ): addClass ( args [ cfg . arg . imageclass ]): css ( 'width' ,  '1px' )  - Уменьшить ширину: css ( 'заполнение' ,  '0 2px 0 0' ): cssText ( args [ cfg . arg . imageleftstyle ]): attr ( 'rowspan' ,  # списки ): tag ( 'div' ): Вики - текст ( processItem ( арг [ CFG . Arg . Imageleft ]))конецесли  аргументы [ cfg . арг . group_part  ..  listnum ],  затемlocal  groupCell  =  row : tag ( 'th' )- id для атрибута aria-labelledby, если группа одинока без заголовка или вышеесли  listnum  ==  1,  а  не  ( args [ cfg . arg . title ]  или  args [ cfg . arg . выше ]  или  args [ cfg . arg . group2 ]),  тоgroupCell: attr ( 'id' ,  mw . uri . anchorEncode ( args [ cfg . arg . group1 ]))конецgroupCell: attr ( 'область' ,  'строка' ): addClass ( cfg . class . navbox_group ): addClass ( args [ cfg . arg . groupclass ]): cssText ( аргументы [ cfg . arg . basestyle ]): css ( 'width' ,  args [ cfg . arg . groupwidth ]  или  '1%' )  - Если ширина группы не указана, минимизировать ширинуgroupCell: cssText ( аргументы [ cfg . arg . groupstyle ]): cssText ( args [ cfg . arg . group_part  ..  listnum  ..  cfg . arg . style_part ]): wikitext ( args [ cfg . arg . group_part  ..  listnum ])конецлокальный  listCell  =  row : tag ( 'td' )если  аргументы [ cfg . арг . group_part  ..  listnum ],  затемlistCell: css ( 'выравнивание текста' ,  'влево' ): css ( 'ширина левой границы' ,  '2 пикселя' ): css ( 'граница-левый стиль' ,  'сплошной' )ещеlistCell : attr ( 'colspan' ,  2 )конецесли  не  аргументы [ cfg . арг . groupwidth ]  тогдаlistCell : css ( 'ширина' ,  '100%' )конецlocal  rowstyle  - обычно nil, поэтому cssText (rowstyle) обычно ничего не добавляетесли  индекс  %  2  ==  1,  тоrowstyle  =  args [ cfg . арг . oddstyle ]ещеrowstyle  =  args [ cfg . арг . evenstyle ]конецlocal  listText  =  args [ cfg . арг . list_part  ..  listnum ]местный  oddEven  =  ODD_EVEN_MARKERесли  listText : sub ( 1 ,  12 )  ==  '
то - Предположим, что текст списка предназначен для навигационного окна подгруппы, поэтому автоматическое чередование для этой строки отсутствует. oddEven = listText : find ( cfg . pattern . navbox_title ) и RESTART_MARKER или cfg . класс . navbox_odd_part конец listCell : css ( 'отступ' , '0' ) : cssText ( аргументы [ cfg . arg . liststyle ]) : cssText ( стиль строки ) : cssText ( args [ cfg . arg . list_part .. listnum .. cfg . arg . style_part ]) : addClass ( cfg . class . navbox_list ) : addClass ( cfg . class . navbox_part .. oddEven ) : addClass ( args [ cfg . arg . listclass ]) : addClass ( args [ cfg . arg . list_part .. listnum .. cfg . arg . class_part ]) : tag ( 'div' ) : css ( 'padding' , ( index == 1 и args [ cfg . arg . list1padding ]) или args [ cfg . arg . listpadding ] или '0 0,25em' ) : Вики - текст ( processItem ( listText , арг [ CFG . Arg . Nowrapitems ])) если index == 1 и args [ cfg . арг . изображение ] тогда строка : tag ( 'td' ) : addClass ( cfg . class . noviewer ) : addClass ( cfg . класс . navbox_image ) : addClass ( args [ cfg . arg . imageclass ]) : css ( 'width' , '1px' ) - Уменьшить ширину : css ( 'отступы' , '0 0 0 2 пикселя' ) : cssText ( аргументы [ cfg . аргумент . образный стиль ]) : attr ( 'rowspan' , # списки ) : tag ( 'div' ) : Вики - текст ( processItem ( арг [ CFG . Arg . Изображение ])) конецконец-- Категории отслеживания-локальная функция needHorizontalLists () если граница == cfg . ключевое слово . border_subgroup или args [ cfg . арг . отслеживание ] == cfg . ключевое слово . tracking_no тогда вернуть ложь конец - FIXME: они должны искать классы в list_classes, а не искать равенства. не возвращать ( cfg . list_classes [ args [ cfg . arg . listclass ]] или cfg . list_classes [ args [ cfg . arg . bodyclass ]])конецлокальная функция hasBackgroundColors () для _ , ключ в ipairs ({ CFG . Arg . titlestyle , CFG . Arg . GroupStyle , cfg . арг . basestyle , cfg . арг . abovestyle , CFG . арг . нижестиль }) делать если tostring ( args [ key ]): find ( 'background' , 1 , true ), то вернуть истину конец конецконецлокальная функция hasBorders () для _ , ключ в ipairs ({ CFG . Arg . GroupStyle , CFG . Arg . basestyle , cfg . арг . abovestyle , CFG . арг . нижестиль }) делать если tostring ( args [ key ]): find ( 'border' , 1 , true ), то вернуть истину конец конецконецлокальная функция isIllegible () local styleratio = require ( 'Модуль: Цветовой контраст' ). _styleratio для ключа , стиль в паре ( арг ) делать если tostring ( key ): match ( cfg . pattern . style ), то если styleratio { mw . текст . unstripNoWiki ( style )} < 4.5 тогда вернуть истину конец конец конец вернуть ложьконецлокальная функция getTrackingCategories () местные кошки = {} если needHorizontalLists (), то table.insert ( cats , cfg . category . horizontal_lists ) end если hasBackgroundColors (), то table.insert ( cats , cfg . category . background_colors ) end если isIllegible (), то table.insert ( коты , ср . категория . неразборчиво ) конец если hasBorders (), то table.insert ( cats , cfg . category . границ ) end вернуть кошекконецлокальная функция renderTrackingCategories ( построитель ) местное название = mw . название . getCurrentTitle () если заголовок . пространство имен ~ = 10, затем верните конец - не в пространстве шаблона локальная подстраница = заголовок . subpageText если подстраница == cfg . ключевое слово . subpage_doc или подстраниц == CFG . ключевое слово . subpage_sandbox или подстраница == cfg . ключевое слово . subpage_testcases, затем верните конец для _ , кот в ipairs ( getTrackingCategories ()) делать строитель : wikitext ( '[[Категория:' .. кошка .. ']]' ) конецконец-- Основные таблицы навигационного блока-локальная функция renderMainTable () местный tbl = mw . html . создать ( 'таблица' ) : addClass ( cfg . class . nowraplinks ) : addClass ( args [ cfg . arg . bodyclass ]) если аргументы [ cfg . арг . title ] и ( args [ cfg . arg . state ] ~ = cfg . keyword . state_plain и args [ cfg . арг . состояние ] ~ = cfg . ключевое слово . state_off ) тогда если аргументы [ cfg . арг . состояние ] == cfg . ключевое слово . state_collapsed, затем args [ cfg . арг . состояние ] = cfg . класс . рухнувший конец таблица : addClass ( cfg . class . сворачиваемый ) : addClass ( args [ cfg . arg . state ] или cfg . class . autocollapse ) конец tbl : css ( 'интервал границы' , 0 ) если граница == cfg . ключевое слово . border_subgroup или border == cfg . ключевое слово . border_none тогда таблица : addClass ( cfg . class . navbox_subgroup ) : cssText ( аргументы [ cfg . arg . bodystyle ]) : cssText ( аргументы [ cfg . arg . style ]) else - обычный navbox - к таблице-оболочке будут применены bodystyle и style таблица : addClass ( cfg . класс . navbox_inner ) : css ( 'фон' , 'прозрачный' ) : css ( 'цвет' , 'наследование' ) конец tbl : cssText ( аргументы [ cfg . arg . innerstyle ]) renderTitleRow ( tbl ) renderAboveRow ( tbl ) для i , listnum в ipairs ( listnums ) do renderListRow ( таблица , я , список ) конец renderBelowRow ( таблица ) вернуть таблицуконецфункция p . _navbox ( navboxArgs ) args = navboxArgs listnums = {} для k , _ в парах ( args ) do если type ( k ) == 'string', то local listnum = k : match ( ср . шаблон . список ) если listnum, то table.insert ( listnums , tonumber ( listnum )) end конец конец table.sort ( списки ) граница = mw . текст . обрезать ( args [ cfg . arg . border ] или args [ 1 ] или '' ) если граница == cfg . ключевое слово . border_child тогда граница = cfg . ключевое слово . border_subgroup конец - рендерить основную часть навигационного блока местный tbl = renderMainTable () - отобразить соответствующую оболочку вокруг навигационного блока, в зависимости от параметра границы местный res = mw . html . создать () если граница == cfg . ключевое слово . border_none тогда local nav = res : tag ( 'div' ) : attr ( 'роль' , 'навигация' ) : узел ( табл. ) - aria-labelledby title, в противном случае выше, в противном случае - lone group если аргументы [ cfg . арг . title ] или args [ cfg . арг . выше ] или ( args [ cfg . arg . group1 ], а не args [ cfg . arg . group2 ]), то nav : attr ( 'aria-labelledby' , mw . uri . anchorEncode ( args [ cfg . arg . title ] или args [ cfg . arg . выше ] или args [ cfg . arg . group1 ])) еще нав : атр ( 'ария-метка' , CFG . ARIA_LABEL ) конец elseif border == cfg . ключевое слово . border_subgroup, тогда - Мы предполагаем, что этот навигационный блок отображается в ячейке списка родительского навигационного блока и является - поэтому внутри div с заполнением: 0em 0,25em. Начнем с ',>
, чтобы избежать - применяется заполнение, и в конце добавьте
, чтобы сбалансировать родительский
res : wikitext ( '
' ) : узел ( табл. ) : wikitext ( '
'
)
еще local nav = res : tag ( 'div' ) : attr ( 'роль' , 'навигация' ) : addClass ( cfg . class . navbox ) : addClass ( args [ cfg . arg . navboxclass ]) : cssText ( аргументы [ cfg . arg . bodystyle ]) : cssText ( аргументы [ cfg . arg . style ]) : css ( 'отступ' , '3 пикселя' ) : узел ( табл. ) - aria-labelledby title, в противном случае выше, в противном случае - lone group если аргументы [ cfg . арг . title ] или args [ cfg . арг . выше ] или ( args [ cfg . arg . group1 ], а не args [ cfg . arg . group2 ]), то nav : attr ( 'aria-labelledby' , mw . uri . anchorEncode ( args [ cfg . arg . title ] или args [ cfg . arg . выше ] или args [ cfg . arg . group1 ])) еще нав : атр ( 'ария-метка' , CFG . ARIA_LABEL ) конец конец if ( args [ cfg . arg . nocat ] или cfg . keyword . nocat_false ): lower () == cfg . ключевое слово . nocat_false тогда renderTrackingCategories ( res ) конец возврат в полоску ( tostring ( res ))конецфункция p . navbox ( фрейм ) если не getArgs, то getArgs = require ( 'Модуль: аргументы' ). getArgs конец args = getArgs ( кадр ) - Прочтите аргументы в том порядке, в котором они будут выводиться, чтобы номера ссылок были в правильном порядке. местный _ _ = args [ cfg . арг . название ] _ = args [ cfg . арг . выше ] для i = 1 , 20 сделать _ = args [ cfg . арг . group_part .. tostring ( i )] _ = args [ cfg . арг . list_part .. tostring ( i )] конец _ = args [ cfg . арг . ниже ] возврат п . _navbox ( аргументы )конецвернуть p