Модуль:Infobox: различия между версиями
Материал из YastreWiki
Дополнительные действия
Нет описания правки |
мНет описания правки Метка: ручная отмена |
||
| (не показаны 34 промежуточные версии этого же участника) | |||
| Строка 2: | Строка 2: | ||
local function clean(val) | local function clean(val) | ||
if | if val == nil then | ||
return nil | |||
end | |||
local trimmed = mw.text.trim(val) | |||
if trimmed == '' then | |||
return nil | |||
end | |||
trimmed = trimmed:gsub('\r\n', '\n'):gsub('\r', '\n') | |||
return trimmed:gsub('\n', '<br>') | |||
end | |||
local customFieldPrefixes = { 'поле', 'field', 'custom' } | |||
local customLabelSuffixes = { 'название', 'Название', 'label', 'Label', 'name', 'Name' } | |||
local CUSTOM_FIELD_LIMIT = 20 | |||
local function addCustomLabel(key, args) | |||
for _, suffix in ipairs(customLabelSuffixes) do | |||
local label = clean(args[key .. suffix]) | |||
if label then | |||
return label | |||
end | |||
end | |||
return nil | |||
end | end | ||
function p.render(frame) | function p.render(frame) | ||
local styles = frame:extensionTag('templatestyles', '', { src = 'Шаблон:Инфобокс/styles.css' }) | |||
local args = frame:getParent().args | local args = frame:getParent().args | ||
local title = clean(args['название']) or mw.title.getCurrentTitle().text | local title = clean(args['название']) or mw.title.getCurrentTitle().text | ||
local | local imageParam = clean(args['изображение']) | ||
local | local captionParam = clean(args['подпись']) | ||
local | local container = mw.html.create('div') | ||
:addClass('infobox') | |||
container:tag('div') | |||
:addClass('infobox-title') | :addClass('infobox-title') | ||
:wikitext(title) | :wikitext(title) | ||
if | local tableRoot = container:tag('table') | ||
local imageRow = | :addClass('infobox-table') | ||
if imageParam then | |||
local imageRow = tableRoot:tag('tr'):addClass('infobox-image-row') | |||
local imageCell = imageRow:tag('td') | local imageCell = imageRow:tag('td') | ||
:attr('colspan', '2') | :attr('colspan', '2') | ||
:addClass('infobox-image') | :addClass('infobox-image') | ||
imageCell:wikitext(string.format('[[Файл:%s| | local images = mw.text.split(imageParam, '%s*;%s*') | ||
local captions = {} | |||
if captionParam then | |||
captions = mw.text.split(captionParam, '%s*;%s*') | |||
end | |||
for i, imgName in ipairs(images) do | |||
local trimmedImg = mw.text.trim(imgName) | |||
if trimmedImg ~= '' then | |||
local wrapper = imageCell:tag('div') | |||
:addClass('infobox-image-wrapper') | |||
wrapper:tag('div') | |||
:wikitext(string.format('[[Файл:%s|150px]]', trimmedImg)) | |||
local currentCaption = clean(captions[i]) | |||
if currentCaption then | |||
wrapper:tag('div') | |||
:addClass('infobox-caption') | |||
:wikitext(currentCaption) | |||
end | |||
end | |||
end | end | ||
end | end | ||
| Строка 37: | Строка 81: | ||
local val = clean(data) | local val = clean(data) | ||
if val then | if val then | ||
local row = | local row = tableRoot:tag('tr'):addClass('infobox-row') | ||
row:tag('th') | row:tag('th') | ||
:addClass('infobox-label') | :addClass('infobox-label') | ||
| Строка 47: | Строка 91: | ||
end | end | ||
local predefinedRows = { | |||
{ label = 'Настоящее имя', key = 'настоящее_имя' }, | |||
{ label = 'Имя', key = 'имя' }, | |||
{ label = 'Тип', key = 'тип' }, | |||
addRow(' | { label = 'Пол', key = 'пол' }, | ||
{ label = 'Описание', key = 'описание' }, | |||
{ label = 'Статус', key = 'статус' }, | |||
{ label = 'Создатель', key = 'создатель' }, | |||
{ label = 'Разработчик', key = 'разработчик' }, | |||
{ label = 'Дата создания', key = 'дата создания' }, | |||
{ label = 'Подписчики', key = 'подписчики' }, | |||
{ label = 'Просмотры', key = 'просмотры' }, | |||
{ label = 'Первая версия', key = 'первая версия' }, | |||
{ label = 'Последняя версия', key = 'последняя версия' }, | |||
{ label = 'Языки программирования', key = 'языки программирования' }, | |||
{ label = 'Лицензия', key = 'лицензия' }, | |||
{ label = 'Ссылки', key = 'ссылки' }, | |||
} | |||
for _, row in ipairs(predefinedRows) do | |||
addRow(row.label, args[row.key]) | |||
end | |||
local function addCustomFields() | |||
for _, prefix in ipairs(customFieldPrefixes) do | |||
for i = 1, CUSTOM_FIELD_LIMIT do | |||
local key = prefix .. i | |||
local rawValue = args[key] | |||
if rawValue then | |||
local cleanedValue = clean(rawValue) | |||
if cleanedValue then | |||
local label = addCustomLabel(key, args) | |||
if label then | |||
addRow(label, rawValue) | |||
end | |||
end | |||
end | |||
end | |||
end | |||
end | |||
local function addBracketFields() | |||
for key, rawValue in pairs(args) do | |||
if type(key) == 'string' then | |||
local base, label = key:match('^([^%(%)]+)%s*%((.-)%)$') | |||
if base and rawValue and mw.text.trim(rawValue) ~= '' then | |||
local labelText = clean(label) | |||
if not labelText then | |||
labelText = clean(base) | |||
end | |||
if labelText then | |||
addRow(labelText, rawValue) | |||
end | |||
end | |||
end | |||
end | |||
end | |||
addCustomFields() | |||
addBracketFields() | |||
local footerText = args['подвал'] | |||
if footerText and mw.text.trim(footerText) ~= '' then | |||
container:tag('div') | |||
:addClass('infobox-footer-block') | |||
:node(footerText) | |||
end | |||
return tostring( | return styles .. tostring(container) | ||
end | end | ||
return p | return p | ||
Текущая версия от 18:10, 5 июня 2026
Для документации этого модуля может быть создана страница Модуль:Infobox/doc
local p = {}
local function clean(val)
if val == nil then
return nil
end
local trimmed = mw.text.trim(val)
if trimmed == '' then
return nil
end
trimmed = trimmed:gsub('\r\n', '\n'):gsub('\r', '\n')
return trimmed:gsub('\n', '<br>')
end
local customFieldPrefixes = { 'поле', 'field', 'custom' }
local customLabelSuffixes = { 'название', 'Название', 'label', 'Label', 'name', 'Name' }
local CUSTOM_FIELD_LIMIT = 20
local function addCustomLabel(key, args)
for _, suffix in ipairs(customLabelSuffixes) do
local label = clean(args[key .. suffix])
if label then
return label
end
end
return nil
end
function p.render(frame)
local styles = frame:extensionTag('templatestyles', '', { src = 'Шаблон:Инфобокс/styles.css' })
local args = frame:getParent().args
local title = clean(args['название']) or mw.title.getCurrentTitle().text
local imageParam = clean(args['изображение'])
local captionParam = clean(args['подпись'])
local container = mw.html.create('div')
:addClass('infobox')
container:tag('div')
:addClass('infobox-title')
:wikitext(title)
local tableRoot = container:tag('table')
:addClass('infobox-table')
if imageParam then
local imageRow = tableRoot:tag('tr'):addClass('infobox-image-row')
local imageCell = imageRow:tag('td')
:attr('colspan', '2')
:addClass('infobox-image')
local images = mw.text.split(imageParam, '%s*;%s*')
local captions = {}
if captionParam then
captions = mw.text.split(captionParam, '%s*;%s*')
end
for i, imgName in ipairs(images) do
local trimmedImg = mw.text.trim(imgName)
if trimmedImg ~= '' then
local wrapper = imageCell:tag('div')
:addClass('infobox-image-wrapper')
wrapper:tag('div')
:wikitext(string.format('[[Файл:%s|150px]]', trimmedImg))
local currentCaption = clean(captions[i])
if currentCaption then
wrapper:tag('div')
:addClass('infobox-caption')
:wikitext(currentCaption)
end
end
end
end
local function addRow(label, data)
local val = clean(data)
if val then
local row = tableRoot:tag('tr'):addClass('infobox-row')
row:tag('th')
:addClass('infobox-label')
:wikitext(label)
row:tag('td')
:addClass('infobox-data')
:wikitext(val)
end
end
local predefinedRows = {
{ label = 'Настоящее имя', key = 'настоящее_имя' },
{ label = 'Имя', key = 'имя' },
{ label = 'Тип', key = 'тип' },
{ label = 'Пол', key = 'пол' },
{ label = 'Описание', key = 'описание' },
{ label = 'Статус', key = 'статус' },
{ label = 'Создатель', key = 'создатель' },
{ label = 'Разработчик', key = 'разработчик' },
{ label = 'Дата создания', key = 'дата создания' },
{ label = 'Подписчики', key = 'подписчики' },
{ label = 'Просмотры', key = 'просмотры' },
{ label = 'Первая версия', key = 'первая версия' },
{ label = 'Последняя версия', key = 'последняя версия' },
{ label = 'Языки программирования', key = 'языки программирования' },
{ label = 'Лицензия', key = 'лицензия' },
{ label = 'Ссылки', key = 'ссылки' },
}
for _, row in ipairs(predefinedRows) do
addRow(row.label, args[row.key])
end
local function addCustomFields()
for _, prefix in ipairs(customFieldPrefixes) do
for i = 1, CUSTOM_FIELD_LIMIT do
local key = prefix .. i
local rawValue = args[key]
if rawValue then
local cleanedValue = clean(rawValue)
if cleanedValue then
local label = addCustomLabel(key, args)
if label then
addRow(label, rawValue)
end
end
end
end
end
end
local function addBracketFields()
for key, rawValue in pairs(args) do
if type(key) == 'string' then
local base, label = key:match('^([^%(%)]+)%s*%((.-)%)$')
if base and rawValue and mw.text.trim(rawValue) ~= '' then
local labelText = clean(label)
if not labelText then
labelText = clean(base)
end
if labelText then
addRow(labelText, rawValue)
end
end
end
end
end
addCustomFields()
addBracketFields()
local footerText = args['подвал']
if footerText and mw.text.trim(footerText) ~= '' then
container:tag('div')
:addClass('infobox-footer-block')
:node(footerText)
end
return styles .. tostring(container)
end
return p