Перейти к навигации Перейти к поиску
Документация по модулю [ просмотреть ] [ изменить ] [ историю ] [ очистить ]
Этот модуль Lua используется примерно на 3 700 000 страницах, или примерно на 7% всех страниц . Чтобы избежать серьезных сбоев и нагрузки на сервер, любые изменения следует тестировать на подстраницах модуля / sandbox или / testcases , либо в изолированной программной среде вашего собственного модуля . Протестированные изменения могут быть добавлены на эту страницу одним редактированием. Обсудите изменения на странице обсуждения, прежде чем внедрять их. |
Этот модуль подлежит защите страницы . Это хорошо заметный модуль, который используется на очень большом количестве страниц или очень часто заменяется . Поскольку вандализм или ошибки могут повлиять на многие страницы, и даже простое редактирование может вызвать значительную нагрузку на серверы, они защищены от редактирования. |
Этот модуль зависит от следующих других модулей: |
Модуль: Infobox - это модуль , реализующий шаблон {{ Infobox }}. Пожалуйста, ознакомьтесь с инструкциями по использованию на странице шаблона.
Категории отслеживания
местный p = {}местные аргументы = {}local origArgs = {}локальный кореньместный empty_row_categories = {}local category_in_empty_row_pattern = '% [% [% s * [Cc] [Aa] [Tt] [Ee] [Gg] [Oo] [Rr] [Yy]% s *: [^]] *]]' 'локальная функция fixChildBoxes ( sval , tt )локальная функция notempty ( s ) return s и s : match ( '% S' ) endесли notempty ( sval ), тоlocal marker = '<span class = special_infobox_marker>'местный s = svals = mw . ustring . gsub ( s , '(<% s * [Tt] [Rr])' , маркер .. '% 1' )s = mw . ustring . gsub ( s , '(</ [Tt] [Rr]% s *>)' , '% 1' .. маркер )если s : match ( маркер ), тоs = mw . ustring . gsub ( s , marker .. '% s *' .. marker , '' )s = mw . ustring . gsub ( s , '([ \ r \ n ] | - [^ \ r \ n ] * [ \ r \ n ])% s *' .. маркер , '% 1' )s = mw . ustring . gsub ( s , маркер .. '% s * ([ \ r \ n ] | -)' , '% 1' )s = mw . ustring . gsub ( s , '(</ [Cc] [Aa] [Pp] [Tt] [Ii] [Oo] [Nn]% s *>% s *)' .. marker , '% 1' )s = mw . ustring . gsub ( s , '(<% s * [Tt] [Aa] [Bb] [Ll] [Ee] [^ <>] *>% s *)' .. marker , '% 1' )s = mw . ustring . gsub ( s , '^ (% {| [^ \ r \ n ] * [ \ r \ n ]% s *)' .. маркер , '% 1' )s = mw . ustring . gsub ( s , '([ \ r \ n ]% {| [^ \ r \ n ] * [ \ r \ n ]% s *)' .. маркер , '% 1' )s = mw . ustring . gsub ( s , marker .. '(% s * </ [Tt] [Aa] [Bb] [Ll] [Ee]% s *>)' , '% 1' )s = mw . ustring . gsub ( s , маркер .. '(% s * \ n |%})' , '% 1' )конецесли s : match ( маркер ), толокальные подъячейки = mw . текст . split ( s , маркер )s = ''для k = 1 , # подъячейки делаютесли k == 1, тоs = s .. subcells [ k ] .. '</' .. tt .. '> </tr>'elseif k == # подъячейки, тоlocal rowstyle = 'style = "display: none"'если notempty ( subcells [ k ]), то rowstyle = '' ends = s .. '<tr' .. rowstyle .. '> <' .. tt .. 'colspan = 2> \ n ' ..подъячейки [ k ]elseif notempty ( subcells [ k ]), тоесли ( k % 2 ) == 0, тоs = s .. подъячейки [ k ]ещеs = s .. '<tr> <' .. tt .. 'colspan = 2> \ n ' ..подъячейки [ k ] .. '</' .. tt .. '> </tr>'конецконецконецконец- следующие две строки добавляют новую строку в конец списков для парсера PHP- [[Special: Diff / 849054481]]- удалить, когда [[: phab: T191516]] исправлен или OBEs = mw . ustring . gsub ( s , '([ \ r \ n ] [% * # ;:] [^ \ r \ n ] *) $' , '% 1 \ n ' )s = mw . ustring . gsub ( s , '^ ([% * # ;:] [^ \ r \ n ] *) $' , '% 1 \ n ' )s = mw . ustring . gsub ( s , '^ ([% * # ;:])' , ' \ n % 1' )s = mw . ustring . gsub ( s , '^ (% {% |)' , ' \ n % 1' )вернуть sещевернуть свалконецконец- Возвращает объединение значений двух таблиц в виде последовательности.локальная функция union ( t1 , t2 )местные валс = {}для к , V в паре ( t1 ) делаетvals [ v ] = правдаконецдля к , V в паре ( t2 ) делаетvals [ v ] = правдаконецместное ret = {}для k , v в парах ( валсах ) делаемtable.insert ( ret , k )конецвозвращение в отставкеконец- Возвращает таблицу, содержащую номера существующих аргументов- для указанного префикса. Например, если префикс был «данные» и- существуют 'data1', 'data2' и 'data5', он вернет {1, 2, 5}.локальная функция getArgNums ( префикс )местный НУМС = {}для k , v в парах ( args ) делаемlocal num = tostring ( k ): match ( '^' .. prefix .. '([1-9]% d *) $' )если Num затем table.insert ( НУМС , ToNumber ( Num )) конецконецtable.sort ( НУМС )возвращение НУМСконец- Добавляет строку в информационное окно с ячейкой заголовка.- или комбинация метка / ячейка данных.локальная функция addRow ( rowArgs )если rowArgs . заголовок и rowArgs . header ~ = '_BLANK_', затемкорень: tag ( 'tr' ): addClass ( rowArgs . rowclass ): cssText ( rowArgs . стиль строки ): tag ( 'th' ): attr ( 'colspan' , '2' ): addClass ( 'заголовок информационного окна ' ): addClass ( rowArgs . класс ): addClass ( args . headerclass )- @deprecated next; целевой .infobox- <имя> .infobox-header: CssText ( арг . Headerstyle ): cssText ( rowArgs . rowcellstyle ): wikitext ( fixChildBoxes ( rowArgs . header , 'th' ))если rowArgs . данные тогдакорень : wikitext ('[[Категория: страницы, на которых используются шаблоны инфобоксов с игнорируемыми ячейками данных]]')конецelseif rowArgs . data и rowArgs . данные : gsub (category_in_empty_row_pattern , ''): совпадение ( '^% S' ), затемлокальная строка = корень : тег ( 'тр' )строка : addClass ( rowArgs . rowclass )строка : cssText ( rowArgs . rowstyle )если rowArgs . тогда лейбл строка: tag ( 'th' ): attr ( 'область' , 'строка' ): addClass ( 'метка-инфобокса' )- @deprecated next; целевой .infobox- <имя> .infobox-label: cssText ( аргумент . стиль метки ): cssText ( rowArgs . rowcellstyle ): Вики - текст ( rowArgs . Этикетка ): сделано ()конецлокальные данныеCell = row : tag ( 'td' )dataCell: attr ( 'colspan' , а не rowArgs . label и '2' или ноль ): AddClass ( не rowArgs . Этикетка и «инфобокс-полные данные» или «инфобокс-данные» ): addClass ( rowArgs . класс )- @deprecated next; целевой .infobox- <имя> .infobox (-full) -data: CssText ( rowArgs . Datastyle ): cssText ( rowArgs . rowcellstyle ): wikitext ( fixChildBoxes ( rowArgs . data , 'td' ))ещеtable.insert ( empty_row_categories , rowArgs . data или '' )конецконецлокальная функция renderTitle ()если не аргументы . название, затем верните конецкорень: tag ( 'подпись' ): addClass ( 'заголовок информационного окна ' ): addClass ( аргумент . titleclass )- @deprecated next; целевой .infobox- <имя> .infobox-title: cssText ( аргумент . стиль заголовка ): wikitext ( аргумент . название )конецлокальная функция renderAboveRow ()если не аргументы . выше, затем верните конецкорень: tag ( 'tr' ): tag ( 'th' ): attr ( 'colspan' , '2' ): addClass ( 'информационное окно -выше' ): AddClass ( арг . Aboveclass )- @deprecated next; target .infobox- <имя> .infobox-выше: CssText ( арг . Abovestyle ): Вики - текст ( fixChildBoxes ( арг . Выше , 'й' ))конецлокальная функция renderBelowRow ()если не аргументы . ниже, затем вернуться в конецкорень: tag ( 'tr' ): tag ( 'td' ): attr ( 'colspan' , '2' ): addClass ( 'информационное окно -ниже' ): AddClass ( арг . Belowclass )- @deprecated next; целевой .infobox- <имя> .infobox-ниже: CssText ( арг . Belowstyle ): Вики - текст ( fixChildBoxes ( арг . Ниже , 'тд' ))конецлокальная функция addSubheaderRow ( subheaderArgs )если subheaderArgs . данные иsubheaderArgs . data : gsub ( category_in_empty_row_pattern , '' ): match ( '^% S' ) затемлокальная строка = корень : тег ( 'тр' )строка : addClass ( subheaderArgs . rowclass )локальные данныеCell = row : tag ( 'td' )dataCell: attr ( 'colspan' , '2' ): addClass ( 'инфобокс-подзаголовок' ): addClass ( класс subheaderArgs . ): CssText ( subheaderArgs . Datastyle ): cssText ( subheaderArgs . rowcellstyle ): wikitext ( fixChildBoxes ( subheaderArgs . data , 'td' ))ещеtable.insert ( empty_row_categories , subheaderArgs . data или '' )конецконецлокальная функция renderSubheaders ()если args . тогда подзаголовок аргументы . subheader1 = аргументы . подзаголовокконецесли args . subheaderrowclass тогдааргументы . subheaderrowclass1 = аргументы . подзаголовокконецлокальные подзаголовки = getArgNums ( 'подзаголовок' )для k , число в ipairs ( subheadernums ) сделатьaddSubheaderRow ({data = args [ 'subheader' .. tostring ( num )],- @deprecated next; целевой .infobox- <имя> .infobox-подзаголовокdatastyle = args . subheaderstyle ,rowcellstyle = args [ 'subheaderstyle' .. tostring ( num )],class = args . subheaderclass ,rowclass = args [ 'subheaderrowclass' .. tostring ( число )]})конецконецлокальная функция addImageRow ( imageArgs )если imageArgs . данные иimageArgs . data : gsub ( category_in_empty_row_pattern , '' ): match ( '^% S' ) затемлокальная строка = корень : тег ( 'тр' )строка : addClass ( imageArgs . rowclass )локальные данныеCell = row : tag ( 'td' )dataCell: attr ( 'colspan' , '2' ): addClass ( 'инфобокс-изображение' ): addClass ( класс imageArgs . ): CssText ( imageArgs . Datastyle ): wikitext ( fixChildBoxes ( imageArgs . data , 'td' ))ещеtable.insert ( empty_row_categories , imageArgs . data или '' )конецконецлокальная функция renderImages ()если args . изображение тогдааргументы . изображение1 = аргументы . изображениеконецесли args . подпись тогдааргументы . caption1 = аргументы . подписьконецлокальные изображения = getArgNums ( 'изображение' )для k , число в ipairs ( images ) сделатьlocal caption = args [ 'подпись' .. tostring ( число )]локальные данные = mw . html . create (): wikitext ( args [ 'изображение' .. tostring ( число )])если подпись, тоданные: tag ( 'div' ): addClass ( 'заголовок информационного окна ' )- @deprecated next; целевой .infobox- <имя> .infobox-caption: cssText ( args . captionstyle ): wikitext ( подпись )конецaddImageRow ({data = tostring ( данные ),- @deprecated next; целевой .infobox- <имя> .infobox-изображениеdatastyle = args . imagestyle ,class = args . imageclass ,rowclass = args [ 'imagerowclass' .. tostring ( число )]})конецконец- Когда автозаголовки включены, предварительная обработка строклокальная функция preprocessRows ()если не аргументы . autoheaders затем верните конецlocal rownums = union ( getArgNums ( 'заголовок' ), getArgNums ( 'данные' ))table.sort ( rownums )местный последний заголовокдля k , число в ipairs ( rownums ) сделатьесли args [ 'header' .. tostring ( num )], тоесли последний заголовок, тоargs [ 'header' .. tostring ( lastheader )] = нольконецlastheader = числоelseif args [ 'data' .. tostring ( num )] иargs [ 'data' .. tostring ( num )]: gsub (category_in_empty_row_pattern , ''): совпадение ( '^% S' ), затемлокальные данные = аргументы [ 'данные' .. строка ( число )]если data : gsub ( category_in_empty_row_pattern , '' ): match ( '% S' ), тоlastheader = nilконецконецконецесли последний заголовок, тоargs [ 'header' .. tostring ( lastheader )] = нольконецконец- Получает объединение номеров аргументов заголовка и данных,- и выводит их все по порядкулокальная функция renderRows ()local rownums = union ( getArgNums ( 'заголовок' ), getArgNums ( 'данные' ))table.sort ( rownums )для k , число в ipairs ( rownums ) сделатьaddRow ({header = args [ 'header' .. tostring ( num )],label = args [ 'label' .. tostring ( num )],data = args [ 'данные' .. tostring ( num )],datastyle = args . datastyle ,class = args [ 'class' .. tostring ( num )],rowclass = args [ 'rowclass' .. tostring ( число )],- @deprecated next; целевой .infobox- <имя> rowclassrowstyle = args [ 'rowstyle' .. tostring ( num )],rowcellstyle = args [ 'rowcellstyle' .. tostring ( число )]})конецконецлокальная функция renderNavBar ()если не аргументы . имя, затем верни конецкорень: tag ( 'tr' ): tag ( 'td' ): attr ( 'colspan' , '2' ): addClass ( 'infobox-navbar' ): wikitext ( require ( 'Module: Navbar' ). _navbar {аргументы . имя ,mini = 1 ,})конецлокальная функция renderItalicTitle ()local italicTitle = args [ 'курсивный заголовок' ] и mw . ustring . нижний ( args [ 'курсивное название' ])если italicTitle == '' или italicTitle == 'force' или italicTitle == 'yes', тогдакорень : wikitext ( mw . getCurrentFrame (): expandTemplate ({ title = 'italic title' }))конецконец- Категории в пустых строках собираются в empty_row_categories.- Эта функция добавляет их в вывод модуля. На это не влияет- args.decat, потому что этот модуль не должен предотвращать внешние категории модуля- от рендеринга.локальная функция renderEmptyRowCategories ()для _ , s в ipairs ( empty_row_categories ) сделайтекорень : wikitext ( s )конецконец- Категории отслеживания рендеринга. args.decat == отключает категории отслеживания.локальная функция renderTrackingCategories ()если args . decat == 'yes', затем верните конецесли args . ребенок == 'да' тогдаесли args . название тогдакорень : wikitext ('[[Категория: страницы, на которых используются встроенные шаблоны инфобоксов с параметром заголовка]]')конецelseif # ( getArgNums ( 'data' )) == 0 и mw . название . getCurrentTitle (). namespace == 0, тогдаroot : wikitext ( '[[Категория: статьи, в которых используются шаблоны инфобоксов без строк данных]]' )конецконецзнак равноЗагружает шаблоны стилей для информационного окна.ЗАДАЧИ: загрузите базовые стили шаблонов здесь, а не в MediaWiki: Common.cssМы пока этого не делаем, потому что есть 4-5000 страниц с «сырым» инфобоксом.столы. См. [[Mediawiki_talk: Common.css / to_do # Infobox]] и / или приходите на помощь :).Когда мы это сделаем, мы также должны очистить встроенный CSS ниже.Придется сделать какую-то причудливую категорию конверсии, например, с боковой панелью.знак равнолокальная функция loadTemplateStyles ()локальный кадр = mw . getCurrentFrame ()- См. Описание функции- local base_templatestyles = frame: extensionTag {- name = 'templatestyles', args = {src = cfg.i18n.templatestyles}-}местные templatestyles = ''если args [ 'templatestyles' ], то templatestyles = frame : extensionTag {name = 'templatestyles' , args = { src = args [ 'templatestyles' ] }}конецместный child_templatestyles = ''если args [ 'дочерние шаблоны стилей ' ], то child_templatestyles = frame : extensionTag {name = 'templatestyles' , args = { src = args [ 'child templatestyles' ] }}конецместный grandchild_templatestyles = ''if args [ 'grandchild templatestyles' ] then grandchild_templatestyles = frame : extensionTag {name = 'templatestyles' , args = { src = args [ 'grandchild templatestyles' ] }}конецreturn table.concat ({- base_templatestyles, - см. описание функцииtemplatestyles ,child_templatestyles ,grandchild_templatestyles})конец- Укажите общий вид информационного окна со специальными настройками, если- инфобокс используется как «ребенок» внутри другого инфобокса.локальная функция _infobox ()если args . ребенок ~ = 'да' тогдакорень = mw . html . создать ( 'таблица' )корень: addClass ( args . subbox == 'yes' и 'infobox-subbox' или 'infobox' ): addClass ( аргумент . bodyclass )- @deprecated next; target .infobox- <имя>: cssText ( аргумент . стиль тела )renderTitle ()renderAboveRow ()ещекорень = mw . html . создать ()корень: wikitext ( аргумент . название )конецrenderSubheaders ()renderImages ()preprocessRows ()renderRows ()renderBelowRow ()renderNavBar ()renderItalicTitle ()renderEmptyRowCategories ()renderTrackingCategories ()вернуть loadTemplateStyles () .. tostring ( корень )конец- Если аргумент существует и не пустой, добавьте его в таблицу аргументов.- Пустые аргументы обрабатываются как nil, чтобы соответствовать поведению ParserFunctions.локальная функция preprocessSingleArg ( имя_аргумента )если origArgs [ argName ] и origArgs [ argName ] ~ = '', тоargs [ argName ] = origArgs [ argName ]конецконец- Назначьте параметры с заданными префиксами таблице args по порядку в- партии указанного шага. Это сделано для предотвращения ссылок и т. Д.- появляются в неправильном порядке. PrefixTable должен быть массивом, содержащим- таблицы, каждая из которых имеет два возможных поля, строку «префикс» и строку- таблица "зависимостей". Функция всегда анализирует параметры, содержащие "префикс".- строка, но анализирует параметры в таблице «зависимостей» только если префикс- параметр присутствует и не пустой.локальная функция preprocessArgs ( prefixTable , step )если type ( prefixTable ) ~ = 'table', тоerror ( "Для таблицы префиксов обнаружено не табличное значение" , 2 )конецесли type ( step ) ~ = 'number', тоerror ( «Обнаружено недопустимое значение шага» , 2 )конец- Получите аргументы без суффикса числа и проверьте правильность ввода.для i , v в ipairs ( prefixTable ) сделайтеif type ( v ) ~ = 'table' или type ( v . prefix ) ~ = "string" или( v . зависеть и тип ( v . зависеть ) ~ = 'table' ), тоerror ( 'В таблице префиксов preprocessArgs обнаружен недопустимый ввод' , 2 )конецpreprocessSingleArg ( v . префикс )- Разбирать зависимый параметр только в том случае, если присутствует префиксный параметр.- и не пусто.если args [ v . префикс ] и v . зависеть тогдадля j , укажите значение в ipairs ( v . зависеть ) сделайтеесли type ( dependsValue ) ~ = 'string', тоerror ( 'В preprocessArgs обнаружено недопустимое "зависимое" значение параметра )конецpreprocessSingleArg ( зависимое значение )конецконецконец- Получить аргументы с суффиксами числа.local a = 1 - переменная счетчика.местный moreArgumentsExist = trueв то время как moreArgumentsExist == true делатьmoreArgumentsExist = falseдля i = a , a + step - 1 doдля j , v в ipairs ( prefixTable ) сделайтелокальный prefixArgName = v . префикс .. tostring ( i )если origArgs [ prefixArgName ], то- Сделайте еще один цикл, если найдены какие-либо аргументы, даже пустые.moreArgumentsExist = truepreprocessSingleArg ( prefixArgName )конец- Обработка таблицы зависимостей, если присутствует аргумент префикса- и не пустое, или мы обрабатываем «префикс1», а «префикс» - это- присутствует, а не пусто, и если таблица зависимостей присутствует.если v . зависимости и ( args [ prefixArgName ] или ( i == 1 и args [ v . prefix ])), тодля j , укажите значение в ipairs ( v . зависеть ) сделайтелокальное имя зависимости = значение зависимости .. tostring ( i )preprocessSingleArg ( имя_ зависимой )конецконецконецконеца = а + шагконецконец- Проанализируйте параметры данных в том же порядке, что и старый {{infobox}}, поэтому- ссылки и т. д. будут отображаться в ожидаемых местах. Параметры, которые- зависят от другого параметра, обрабатываются, только если этот параметр присутствует,- чтобы в списках литературы к статьям не появлялись фантомные ссылки.локальная функция parseDataParameters ()preprocessSingleArg ( 'автозаголовки' )preprocessSingleArg ( 'ребенок' )preprocessSingleArg ( 'bodyclass' )preprocessSingleArg ( 'вложенный блок' )preprocessSingleArg ( 'стиль тела' )preprocessSingleArg ( 'название' )preprocessSingleArg ( 'titleclass' )preprocessSingleArg ( 'стиль заголовка' )preprocessSingleArg ( 'выше' )preprocessSingleArg ( 'надкласс' )preprocessSingleArg ( 'выше стиля' )preprocessArgs ({{ префикс = 'подзаголовок' , зависимость = { 'стиль подзаголовка' , 'subheaderrowclass' }}}, 10 )preprocessSingleArg ( 'стиль подзаголовка' )preprocessSingleArg ( 'подкласс' )preprocessArgs ({{ префикс = 'изображение' , зависимость = { 'подпись' , 'imagerowclass' }}}, 10 )preprocessSingleArg ( 'стиль заголовка' )preprocessSingleArg ( 'образный стиль' )preprocessSingleArg ( 'класс изображений' )preprocessArgs ({{ prefix = 'header' },{ префикс = 'данные' , зависимость = { 'ярлык' }},{ prefix = 'rowclass' },{ prefix = 'rowstyle' },{ prefix = 'rowcellstyle' },{ префикс = 'класс' }}, 50 )preprocessSingleArg ( 'заголовочный класс' )preprocessSingleArg ( 'стиль заголовка' )preprocessSingleArg ( 'стиль метки' )preprocessSingleArg ( 'стиль данных' )preprocessSingleArg ( 'ниже' )preprocessSingleArg ( 'нижний класс' )preprocessSingleArg ( 'нижний стиль' )preprocessSingleArg ( 'имя' )- различное поведение курсива, если он пуст или отсутствуетargs [ 'курсивное название' ] = origArgs [ 'курсивное название' ]preprocessSingleArg ( 'декат' )preprocessSingleArg ( 'шаблоны стилей' )preprocessSingleArg ( 'дочерние шаблоны стилей' )preprocessSingleArg ( 'стили внуков' )конец- Если вызывается через #invoke, используйте аргументы, переданные в вызывающий шаблон.- В противном случае в целях тестирования предположим, что аргументы передаются напрямую.функция p . информационное окно ( фрейм )если frame == mw . getCurrentFrame (), затемorigArgs = кадр : getParent (). аргументыещеorigArgs = frameконецparseDataParameters ()вернуть _infobox ()конец- Для вызова через #invoke в шаблонефункция p . infoboxTemplate ( фрейм )origArgs = {}для к , v в парах ( кадр . арг ) делают origArgs [ K ] = мВт . текст . обрезать ( v ) конецparseDataParameters ()вернуть _infobox ()конецвернуть p