Дружба – это Чудо Вики
Advertisement
Дружба – это Чудо Вики

Для документации этого модуля может быть создана страница Модуль:Инфобокс персонажа/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
Advertisement