Для документации этого модуля может быть создана страница Модуль:Инфобокс персонажа/doc
local infoboxCharacter = {}
--верхний уровень - группа инфобоксов
function infoboxCharacter.blockCreate(frame)
local args = frame.args
--функции
--разбиение строки на массив подстрок по определенному символу
function split(str, separator, reg)
local result = {}
--Проверка на образец
if (not reg) then
regExp = true
else
regExp = false
end
--переменные позиций
local n
local k
--управляющие переменные
local s = 0
local i = 1
--обработка строки
while k ~= str:len() do
--поиск сепаратора
local substring
n, k = str:find(separator, s + 1, regExp)
--если поиск не дал результатов
if (k == nil or n == nil) then
result[i] = str:sub(s + 1, str:len())
break
end
--если сепаратор найден
substring = str:sub(s + 1, n - 1)
--добавление результата
if substring ~= '' then
result[i] = substring
i = i + 1
end
s = k
end
return result
end
--проверка параметров
function paramCheck(param)
if param and param ~= '' then
return true
else
return false
end
end
--создание инфобокса
function infoboxCreate(prefix)
--обработка аргументов
local data = {}
--имя
if paramCheck(args[prefix..'имя']) then
data.name = args[prefix..'имя']
elseif prefix ~= '' then
data.name = prefix:sub(1, prefix:len() - 1)
else
data.name = tostring(mw.title.getCurrentTitle())
end
--титул
if paramCheck(args[prefix..'титул']) then
data.title = args[prefix..'титул']
end
--возраст
if paramCheck(args[prefix..'возраст']) then
data.age = mw.ustring.lower(args[prefix..'возраст'])
end
--вид
if paramCheck(args[prefix..'вид']) then
data.kind = mw.ustring.lower(args[prefix..'вид'])
end
--пол
if paramCheck(args[prefix..'пол']) then
data.gender = mw.ustring.lower(args[prefix..'пол'])
end
--разная информация
data.differentInfo = {}
--занятие
if paramCheck(args[prefix..'занятие']) then
data.differentInfo[#data.differentInfo + 1] = {'Занятие', args[prefix..'занятие']}
end
--место проживания
if paramCheck(args[prefix..'место проживания']) then
data.differentInfo[#data.differentInfo + 1] = {'Место проживания', args[prefix..'место проживания']}
end
--остальная
local dIC = 1
while paramCheck(args[prefix..'разная информация '..dIC]) do
local dInfo = split(args[prefix..'разная информация '..dIC], ':')
if dInfo[2] then
data.differentInfo[#data.differentInfo + 1] = {dInfo[1], dInfo[2]}
end
dIC = dIC + 1
end
--озвучка
data.voiceInfo = {}
--русская
if paramCheck(args[prefix..'русская озвучка']) then
data.voiceInfo[#data.voiceInfo + 1] = {'Русская', args[prefix..'русская озвучка']}
end
--английская
if paramCheck(args[prefix..'английская озвучка']) then
data.voiceInfo[#data.voiceInfo + 1] = {'Оригинальная', args[prefix..'английская озвучка']}
end
--русская озвучка песен
if paramCheck(args[prefix..'русская озвучка песен']) then
data.voiceInfo[#data.voiceInfo + 1] = {'Русская песен', args[prefix..'русская озвучка песен']}
end
--английская озвучка песен
if paramCheck(args[prefix..'английская озвучка песен']) then
data.voiceInfo[#data.voiceInfo + 1] = {'Оригинальная песен', args[prefix..'английская озвучка песен']}
end
--другая
local vIC = 1
while paramCheck(args[prefix..'другая озвучка '..vIC]) do
local vInfo = split(args[prefix..'другая озвучка '..vIC], ':')
if vInfo[2] then
data.voiceInfo[#data.voiceInfo + 1] = {vInfo[1], vInfo[2]}
end
vIC = vIC + 1
end
--родственники
data.relativesInfo = {}
local rIC = 1
while paramCheck(args[prefix..'родственники '..rIC]) do
local rInfo = split(args[prefix..'родственники '..rIC], ':')
if rInfo[2] then
data.relativesInfo[#data.relativesInfo + 1] = {rInfo[1], rInfo[2]}
end
rIC = rIC + 1
end
--цвета персонажа
data.colorTable = {}
if paramCheck(args[prefix..'окрас']) then
local colors = split(args[prefix..'окрас'], '/')
data.colorTable[#data.colorTable + 1] = {'Окрас', colors}
--предварительное определение цветовой схемы - фон
data.bgColor = colors[1]
end
if paramCheck(args[prefix..'цвета гривы']) then
local colors = split(args[prefix..'цвета гривы'], '/')
data.colorTable[#data.colorTable + 1] = {'Грива', colors}
--предварительное определение цветовой схемы - текст
data.fontColor = colors[1]
end
if paramCheck(args[prefix..'цвета глаз']) then
local colors = split(args[prefix..'цвета глаз'], '/')
data.colorTable[#data.colorTable + 1] = {'Глаза', colors}
end
local ctc = 1
while args[prefix..'дополнительный цвет '..ctc] do
local color = split(args[prefix..'дополнительный цвет '..ctc], ':')
if color[2] then
local parsedColor = split(color[2], '/')
data.colorTable[#data.colorTable + 1] = {color[1], parsedColor}
end
ctc = ctc + 1
end
--метки
data.cutieMarks = {}
local cMC = 1
while paramCheck(args[prefix..'изображение метки '..cMC]) or paramCheck(args[prefix..'описание метки '..cMC]) do
data.cutieMarks[cMC] = {}
--цвет фона
if paramCheck(args[prefix..'цвет фона метки '..cMC]) then
data.cutieMarks[cMC].cmBackground = args[prefix..'цвет фона метки '..cMC]
elseif data.bgColor then
data.cutieMarks[cMC].cmBackground = data.bgColor
else
data.cutieMarks[cMC].cmBackground = 'inherit'
end
--размер
if paramCheck(args[prefix..'размер метки '..cMC]) then
data.cutieMarks[cMC].cmSize = args[prefix..'размер метки '..cMC]
else
data.cutieMarks[cMC].cmSize = '38x38px'
end
--изображение
if paramCheck(args[prefix..'изображение метки '..cMC]) then
data.cutieMarks[cMC].cmImage = args[prefix..'изображение метки '..cMC]
end
--описание
if paramCheck(args[prefix..'описание метки '..cMC]) then
data.cutieMarks[cMC].cmDescription = args[prefix..'описание метки '..cMC]
end
cMC = cMC + 1
end
--цветовая тема
--цвет фона
if paramCheck(args[prefix..'цвет фона заголовка']) then
data.bgColor = args[prefix..'цвет фона заголовка']
elseif not data.bgColor then
data.bgColor = 'inherit'
end
--цвет текста
if paramCheck(args[prefix..'цвет текста заголовка']) then
data.fontColor = args[prefix..'цвет текста заголовка']
elseif not data.fontColor then
data.fontColor = 'transparent'
end
--обёртка содержимого
local infoboxOuter = mw.html.create('div')
--основа инфобокса
local infobox = mw.html.create('div')
infoboxOuter:addClass('ib1_infoboxCharacter')
--функции
----------------------------------------------------------
--создание изображений и кнопок (устаревшее)
function imageCreateOld(name, dNone)
local image = mw.html.create('div')
image:addClass('infBlock')
if not args[prefix..'титул'] or args[prefix..'титул'] == '' then
image:css('margin', '6px 0 0 0')
end
if dNone then
image:css('display', 'none')
end
image:wikitext('[[Файл:'..args[name]..'|240px|link=]]')
return image
end
function buttonCreateOld(name)
local button = mw.html.create('div')
button:addClass('infButton')
button:css('color', data.fontColor)
button:css('background', data.bgColor)
button:wikitext(args[name])
return button
end
-------------------------------------------------------------
--создание плашек с информацией о поле и возрасте
function kindGenderCreate(text, image)
local label = mw.html.create('div')
if image then
local imgBlock = mw.html.create('div')
imgBlock:wikitext('[[файл:'..image..'.png|link=]]')
label:css('padding-left', '23px')
label:node(imgBlock)
else
label:css('padding-left', '3px')
end
label:wikitext(text)
return label
end
--создание строки таблицы
function lineCreate(title, text)
local line = mw.html.create('tr')
local leftColumn = mw.html.create('th')
leftColumn:wikitext(title)
line:node(leftColumn)
local rightColumn = mw.html.create('td')
rightColumn:wikitext(text)
line:node(rightColumn)
return line
end
--создание пустой сворачивающейся таблицы с заголовком
function collapsibleTableCreate(label)
local colTable = mw.html.create('table')
colTable:addClass('mw-collapsible mw-collapsed')
local headerLine = mw.html.create('tr')
local header = mw.html.create('th')
header:css('background-color', data.bgColor)
header:css('color', data.fontColor)
header:wikitext(label)
header:attr('colspan', '6')
headerLine:node(header)
colTable:node(headerLine)
return colTable
end
--Создание колорбокса
function colorBoxCreate(colors, borderColor)
local colorBox = mw.html.create('div')
colorBox:addClass('infoboxCharacter_colorBox')
if (borderColor) then
colorBox:css('border', '2px solid '..borderColor)
else
colorBox:css('border', '1px solid gray')
end
width = 100 / #colors
for i = 1, #colors do
local innerElement = mw.html.create('div')
innerElement:css('background-color', colors[i])
innerElement:css('width', width..'%')
innerElement:attr('title', colors[i])
colorBox:node(innerElement)
end
return colorBox
end
--содержимое
--заголовок
local header = mw.html.create('div')
header:addClass('infoboxCharacter_header')
header:css('background-color', data.bgColor)
local headerText = mw.html.create('div')
headerText:wikitext(data.name )
headerText:css('color', data.fontColor)
header:node(headerText)
--титул
local title
if data.title then
title = mw.html.create('div')
title:addClass('infoboxCharacter_title')
title:wikitext(data.title)
end
------------------------------
--изображения и кнопки (устаревшие)
local imgOld1, imgOld2, imgOld3, imgOld4, imgOld5, imgOld6, imgOld7, imgOld8, imgOld9, imgOld10
if paramCheck(args[prefix..'изображение']) then
imgOld1 = imageCreateOld(prefix..'изображение')
end
if paramCheck(args[prefix..'изображение2']) then
imgOld2 = imageCreateOld(prefix..'изображение2', true)
end
if paramCheck(args[prefix..'изображение3']) then
imgOld3 = imageCreateOld(prefix..'изображение3', true)
end
if paramCheck(args[prefix..'изображение4']) then
imgOld4 = imageCreateOld(prefix..'изображение4', true)
end
if paramCheck(args[prefix..'изображение5']) then
imgOld5 = imageCreateOld(prefix..'изображение5', true)
end
if paramCheck(args[prefix..'изображение6']) then
imgOld6 = imageCreateOld(prefix..'изображение6', true)
end
if paramCheck(args[prefix..'изображение7']) then
imgOld7 = imageCreateOld(prefix..'изображение7', true)
end
if paramCheck(args[prefix..'изображение8']) then
imgOld8 = imageCreateOld(prefix..'изображение8', true)
end
if paramCheck(args[prefix..'изображение9']) then
imgOld9 = imageCreateOld(prefix..'изображение9', true)
end
if paramCheck(args[prefix..'изображение10']) then
imgOld10 = imageCreateOld(prefix..'изображение10', true)
end
local butOld
if paramCheck(args[prefix..'изображение2']) then
butOld = mw.html.create('div')
butOld:cssText('width:100%; margin:6px 0 6px; text-align:center')
butOld:node(buttonCreateOld(prefix..'подпись1'))
butOld:node(buttonCreateOld(prefix..'подпись2'))
if paramCheck(args[prefix..'изображение3']) then
butOld:node(buttonCreateOld(prefix..'подпись3'))
end
if paramCheck(args[prefix..'изображение4']) then
butOld:node(buttonCreateOld(prefix..'подпись4'))
end
if paramCheck(args[prefix..'изображение5']) then
butOld:node(buttonCreateOld(prefix..'подпись5'))
end
if paramCheck(args[prefix..'изображение6']) then
butOld:node(buttonCreateOld(prefix..'подпись6'))
end
if paramCheck(args[prefix..'изображение7']) then
butOld:node(buttonCreateOld(prefix..'подпись7'))
end
if paramCheck(args[prefix..'изображение8']) then
butOld:node(buttonCreateOld(prefix..'подпись8'))
end
if paramCheck(args[prefix..'изображение9']) then
butOld:node(buttonCreateOld(prefix..'подпись9'))
end
if paramCheck(args[prefix..'изображение10']) then
butOld:node(buttonCreateOld(prefix..'подпись10'))
end
end
---------------------------
--вид и пол
local kindGender
if data.kind or data.gender then
kindGender = mw.html.create('div')
kindGender:addClass('infoboxCharacter_kindGender colorlink')
local customKind
--вид
if data.kind then
local kind = mw.html.create('div')
local textKind
local kindImg
if data.kind == 'единорог' then
textKind = '[[Единороги|Единорог]]'
kindImg = 'Unicorn picto'
elseif data.kind == 'пегас' then
textKind = '[[Пегасы|Пегас]]'
kindImg = 'Pegasus picto'
elseif data.kind == 'земнопони' or data.kind == 'земной пони' or data.kind == 'земная пони' then
if data.gender and data.gender == 'жен' then
textKind = '[[Земные пони|Земная пони]]'
else
textKind = '[[Земные пони|Земной пони]]'
end
kindImg = 'Earthpony picto'
elseif data.kind == 'аликорн' then
textKind = '[[Аликорны|Аликорн]]'
kindImg = 'Alicorn picto'
else
textKind = data.kind
customKind = true
end
local kind = kindGenderCreate(textKind, kindImg)
kindGender:node(kind)
end
--пол
if data.gender and data.gender == 'муж' or data.gender == 'жен' then
local gender = mw.html.create("div")
local genderText
local genderImg
if data.gender == 'муж' or data.gender == 'мужской' then
if customKind then
genderText = 'Муж.'
elseif data.age == 'дет' then
genderText = 'Жеребёнок'
else
genderText = 'Жеребец'
end
genderImg = 'Male picto'
else
if customKind then
genderText = 'Жен.'
elseif data.age == 'дет' then
genderText = 'Кобылка'
else
genderText = 'Кобыла'
end
genderImg = 'Female picto'
end
local gender = kindGenderCreate(genderText, genderImg)
kindGender:node(gender)
end
end
--разная информация
local diffInfoTable
if #data.differentInfo ~= 0 then
diffInfoTable = mw.html.create('table')
diffInfoTable:addClass('infoboxCharacter_infoTable')
for i = 1, #data.differentInfo do
local line = lineCreate(data.differentInfo[i][1], data.differentInfo[i][2])
diffInfoTable:node(line)
end
end
--озвучка
local voiceTable
if #data.voiceInfo ~= 0 then
voiceTable = collapsibleTableCreate('Озвучка')
voiceTable:addClass('infoboxCharacter_collapsibleInfoTable')
for i = 1, #data.voiceInfo do
local line = lineCreate(data.voiceInfo[i][1], data.voiceInfo[i][2])
voiceTable:node(line)
end
end
--родственники
local relativesTable
if #data.relativesInfo ~= 0 then
relativesTable = collapsibleTableCreate('Родственники')
relativesTable:addClass('infoboxCharacter_collapsibleInfoTable')
for i = 1, #data.relativesInfo do
local line = lineCreate(data.relativesInfo[i][1], data.relativesInfo[i][2])
relativesTable:node(line)
end
end
--внешний вид
local appearanceTable
if data.colorTable[1] or data.cmImage or data.cmDescription then
appearanceTable = collapsibleTableCreate('Внешний вид')
appearanceTable:addClass('infoboxCharacter_appearanceTable')
--цвета
if data.colorTable[1] then
local length = #data.colorTable
local colspan
local tr
for i = 1, length do
if length - i == 1 and length % 3 == 2 then
colspan = '3'
elseif length - i == 0 and length % 3 == 1 then
colspan = '6'
else
colspan = '2'
end
if i % 3 == 1 then
tr = mw.html.create('tr')
end
local th = mw.html.create('th')
th:attr('colspan', colspan)
th:wikitext(data.colorTable[i][1]..'<br />')
local colorBox = colorBoxCreate(data.colorTable[i][2])
th:node(colorBox)
tr:node(th)
if (i % 3 == 0 or length - i == 0) then
appearanceTable:node(tr)
end
end
end
--метка
if #data.cutieMarks > 0 then
local tr = mw.html.create('tr')
local td = mw.html.create('td')
td:attr("colspan", "6")
local label = mw.html.create('span')
label:wikitext('Метка')
--кнопки
local rButton
if #data.cutieMarks > 1 then
--левая
local lButton = mw.html.create('div')
lButton:addClass('ib1_appearance_lButton ib1_cmButton')
lButton:css('background-color', data.bgColor)
lButton:attr('title', 'Предыдущая метка')
local lArrow = mw.html.create('div')
lArrow:css('border-right-color', data.fontColor)
lButton:node(lArrow)
--добавление левой
td:node(lButton)
--правая
rButton = mw.html.create('div')
rButton:addClass('ib1_appearance_rButton ib1_cmButton')
rButton:css('background-color', data.bgColor)
rButton:attr('title', 'Следующая метка')
local rArrow = mw.html.create('div')
rArrow:css('border-left-color', data.fontColor)
rButton:node(rArrow)
end
--описание и картинка
for i = 1, #data.cutieMarks do
--описание
local description
if data.cutieMarks[i].cmDescription then
description = mw.html.create('div')
description:node(label)
description:wikitext('<br />'..data.cutieMarks[i].cmDescription)
end
--изображение
local image
if data.cutieMarks[i].cmImage then
image = mw.html.create('div')
image:wikitext('[[файл:'..data.cutieMarks[i].cmImage..'|'..data.cutieMarks[i].cmSize..'|link=]]')
image:css("background-color", data.cutieMarks[i].cmBackground)
end
--обертка
local wrapper
if description and image then
wrapper = mw.html.create('div')
wrapper:addClass('ib1_appearance_cmComplete ib1_cm')
wrapper:node(description)
wrapper:node(image)
elseif description then
wrapper = description
wrapper:addClass('ib1_appearance_cmDescription ib1_cm')
else
wrapper = mw.html.create('div')
wrapper:node(label)
wrapper:node(image)
wrapper:addClass('ib1_appearance_cmImage ib1_cm')
end
--сокрытие лишних меток
if i > 1 then
wrapper:css('display', 'none')
end
--добавление
td:node(wrapper)
end
--добавление правой кнопки
if rButton then
td:node(rButton)
end
tr:node(td)
appearanceTable:node(tr)
end
end
--галерея
local gallery
if paramCheck(args[prefix..'галерея']) then
gallery = mw.html.create('div')
gallery:addClass('infoboxCharacter_gallery colorlink')
gallery:css('color', data.fontColor)
gallery:css('background-color', data.bgColor)
gallery:wikitext('[['..args[prefix..'галерея']..'|Галерея]]')
end
--построение
infobox:node(header)
if title then
infobox:node(title)
end
----------------------------------
--изображения и кнопки (устаревшие)
if imgOld1 then
infobox:node(imgOld1)
end
if imgOld2 then
infobox:node(imgOld2)
end
if imgOld3 then
infobox:node(imgOld3)
end
if imgOld4 then
infobox:node(imgOld4)
end
if imgOld4 then
infobox:node(imgOld5)
end
if imgOld4 then
infobox:node(imgOld6)
end
if imgOld4 then
infobox:node(imgOld7)
end
if imgOld4 then
infobox:node(imgOld8)
end
if imgOld4 then
infobox:node(imgOld9)
end
if imgOld4 then
infobox:node(imgOld10)
end
if butOld then
infobox:node(butOld)
end
-------------------------------
if kindGender then
infobox:node(kindGender)
end
if diffInfoTable then
infobox:node(diffInfoTable)
end
if voiceTable then
infobox:node(voiceTable)
end
if relativesTable then
infobox:node(relativesTable)
end
if appearanceTable then
infobox:node(appearanceTable)
end
if gallery then
infobox:node(gallery)
end
infoboxOuter:node(infobox)
return {infoboxOuter, data}
end
--создание блока инфобоксов
function infoboxBlockCreate()
--создание
--обертка
local infoboxBlock = mw.html.create('div')
infoboxBlock:addClass('ib1_ibBlock')
--инфобоксы
local infoboxes = {}
if args['инфобокс 1'] then
local ibC = 1
while args['инфобокс '..ibC] do
infoboxes[ibC] = infoboxCreate(args['инфобокс '..ibC]..' ')
infoboxes[ibC][1]:attr('data-name', infoboxes[ibC][2].name)
infoboxes[ibC][1]:attr('data-bgcolor', infoboxes[ibC][2].bgColor)
infoboxes[ibC][1]:attr('data-fontcolor', infoboxes[ibC][2].fontColor)
if ibC > 1 then
infoboxes[ibC][1]:css('display', 'none')
end
ibC = ibC + 1
end
else
infoboxes[1] = infoboxCreate('')
end
--управляющие кнопки
local buttonsContainer
if #infoboxes > 1 then
buttonsContainer = mw.html.create('div')
buttonsContainer:addClass('ib1_cb_block')
local prevKey = mw.html.create('div')
prevKey:wikitext(infoboxes[#infoboxes][2].name)
prevKey:css('background-color', infoboxes[#infoboxes][2].bgColor)
prevKey:css('color', infoboxes[#infoboxes][2].fontColor)
buttonsContainer:node(prevKey)
if #infoboxes > 2 then
local nextKey = mw.html.create('div')
nextKey:wikitext(infoboxes[2][2].name)
nextKey:css('background-color', infoboxes[2][2].bgColor)
nextKey:css('color', infoboxes[2][2].fontColor)
buttonsContainer:node(nextKey)
end
end
--построение
--управляющие кнопки
if buttonsContainer then
infoboxBlock:node(buttonsContainer)
end
--инфобоксы
for i = 1, #infoboxes do
infoboxBlock:node(infoboxes[i][1])
end
return infoboxBlock
end
return infoboxBlockCreate()
end
return infoboxCharacter