پرش به محتوا

پودمان:InfoboxPerson/Core

از ویکی البرز

توضیحات این پودمان می‌تواند در پودمان:InfoboxPerson/Core/توضیحات قرار گیرد.

local p = {}

----------------------------------------------------------
-- Module:InfoboxPerson/Core
-- WikiAlborz Infobox Engine
-- Version 1.1
-- Medal support added
----------------------------------------------------------

local html = mw.html

local data = require('Module:InfoboxPerson/Data')

local lookup   = data.lookup
local layouts  = data.layouts
local groups   = data.groups
local defaults = data.defaults

----------------------------------------------------------
-- LOAD TEMPLATESTYLES
----------------------------------------------------------

local function loadStyles()

    return mw.getCurrentFrame():extensionTag{
        name = 'templatestyles',
        args = {
            src = 'Module:InfoboxPerson/styles.css'
        }
    }

end

----------------------------------------------------------
-- NORMALIZE
----------------------------------------------------------

local function normalize(value)

    if value == nil then
        return nil
    end

    value = tostring(value)

    value = mw.text.trim(value)

    if value == '' then
        return nil
    end

    -- Remove invisible Unicode characters
    value = mw.ustring.gsub(
        value,
        '[\226\128\139\226\128\141\239\187\191]',
        ''
    )

    if value == '' then
        return nil
    end

    return value

end

----------------------------------------------------------
-- HAS VALUE
----------------------------------------------------------

local function hasValue(value)

    return normalize(value) ~= nil

end
----------------------------------------------------------
-- MAKE TERM DISPLAY
----------------------------------------------------------

local function makeTerm(startDate, endDate)

    if hasValue(startDate) and hasValue(endDate) then
        return startDate .. " تا " .. endDate
    elseif hasValue(startDate) then
        return startDate .. " تاکنون"
    elseif hasValue(endDate) then
        return "تا " .. endDate
    end

    return nil
end

----------------------------------------------------------
-- READ ARGUMENT TABLE
----------------------------------------------------------

local function readArguments(source, target)

    if not source then
        return
    end

    for key, value in pairs(source) do

        key = normalize(key)
        value = normalize(value)

        if key and value then
            target[key] = value
        end

    end

end

----------------------------------------------------------
-- COLLECT ARGUMENTS
----------------------------------------------------------

local function collectArgs(frame)

    local args = {}

    local parent = frame:getParent()

    if parent then
        readArguments(parent.args, args)
    end

    readArguments(frame.args, args)

    return args

end
----------------------------------------------------------
-- RESOLVE ALIASES
----------------------------------------------------------

local function resolveArgs(rawArgs)

    local args = {}

    for key, value in pairs(rawArgs) do

        local canonical = lookup[key]

        if canonical then
            args[canonical] = value
        else
            args[key] = value
        end

    end

    return args

end

----------------------------------------------------------
-- CREATE INFOBOX
----------------------------------------------------------

local function createBox()

    return html.create('table')
        :addClass('infobox')
        :addClass('person-infobox')

end

----------------------------------------------------------
-- ADD TITLE
----------------------------------------------------------

local function addTitle(box, args)

    local title = args.name

    if not hasValue(title) then
        title = mw.title.getCurrentTitle().text
    end

    -- نمایش عنوان شهید در بالای جعبه
    if args.status == "شهید" then
        box:tag("tr")
            :tag("th")
            :attr("colspan", "2")
            :css("background", "#b22222")
            :css("color", "white")
            :css("text-align", "center")
            :css("font-size", "120%")
            :css("padding", "8px")
            :wikitext("شهید")
    end

    box:tag('tr')
        :tag('th')
        :attr('colspan', '2')
        :addClass('person-infobox-title')
        :wikitext(title)

end

----------------------------------------------------------
-- ADD IMAGE
----------------------------------------------------------

local function addImage(box, args)

    local image = args.image

    if not hasValue(image) then
        return
    end

    box:tag('tr')
        :tag('td')
        :attr('colspan', '2')
        :addClass('person-infobox-image')
        :wikitext(
            '[[File:' ..
            image ..
            '|' ..
            (defaults.image_size or '250px') ..
            ']]'
        )

    if hasValue(args.caption) then

        box:tag('tr')
            :tag('td')
            :attr('colspan', '2')
            :addClass('person-infobox-caption')
            :wikitext(args.caption)

    end

end
----------------------------------------------------------
-- ADD HEADER
----------------------------------------------------------

local function addHeader(box, title)

    if not hasValue(title) then
        return
    end

    box:tag('tr')
        :tag('th')
        :attr('colspan', '2')
        :addClass('person-infobox-header')
        :wikitext(title)

end

----------------------------------------------------------
-- ADD ROW
----------------------------------------------------------

local function addRow(box, label, value)

    if not hasValue(value) then
        return false
    end

    local row = box:tag('tr')

    row:tag('th')
        :addClass('person-infobox-label')
        :wikitext(label)

    row:tag('td')
        :addClass('person-infobox-value')
        :wikitext(value)

    return true

end

----------------------------------------------------------
-- ADD MEDALS
----------------------------------------------------------

local function addMedals(box, args)

    local medals = args.medaltemplates

    if not hasValue(medals) then
        medals = args.medals
    end

    if not hasValue(medals) then
        return
    end

    local frame = mw.getCurrentFrame()

    local content = frame:expandTemplate{
        title = 'Infobox medal templates',
        args = {
            medals = medals,
            title = args.medaltemplates_title or '',
            expand = 'yes'
        }
    }

    box:tag('tr')
        :tag('td')
        :attr('colspan','2')
        :addClass('person-infobox-medals')
        :wikitext(content)

end
----------------------------------------------------------
-- RENDER LAYOUT
----------------------------------------------------------

local function renderLayout(box, layout, args)

    if not layout then
        return
    end

    for i = 1, #layout do

        local item = layout[i]

        local label = item[1]
        local field = item[2]

        --------------------------------------------------
        -- MEDAL TEMPLATES
        -- Render directly inside infobox
        --------------------------------------------------

        if field == "medaltemplates" then

            if hasValue(args[field]) then
                addMedals(box, args)
            end

        else

            addRow(
                box,
                label,
                args[field]
            )

        end

    end

end

----------------------------------------------------------
-- CHECK GROUP TRIGGER
----------------------------------------------------------

local function checkTrigger(group, args)

    if not group.trigger then
        return true
    end

    for i = 1, #group.trigger do

        local field = group.trigger[i]

        if hasValue(args[field]) then
            return true
        end

    end

    return false

end

----------------------------------------------------------
-- RENDER GROUP
----------------------------------------------------------

local function renderGroup(box, group, args)

    if not checkTrigger(group, args) then
        return
    end

    if hasValue(group.title) then

        addHeader(
            box,
            group.title
        )

    end

    renderLayout(
        box,
        layouts[group.layout],
        args
    )

end
----------------------------------------------------------
-- RENDER ALL GROUPS
----------------------------------------------------------

local function renderGroups(box, args)

    for i = 1, #groups do

        renderGroup(
            box,
            groups[i],
            args
        )

    end

end

----------------------------------------------------------
-- PREPARE ARGUMENTS
----------------------------------------------------------

local function prepareArgs(args)

    for key, value in pairs(defaults) do

        if args[key] == nil then
            args[key] = value
        end

    end

    return args

end

----------------------------------------------------------
-- RENDER INFOBOX
----------------------------------------------------------

local function render(args)

    local box = createBox()

    addTitle(
        box,
        args
    )

    addImage(
        box,
        args
    )

    renderGroups(
        box,
        args
    )

    -- Render medal templates inside the same infobox

    return loadStyles()
        .. tostring(box)

end
----------------------------------------------------------
-- MAIN ENTRY POINT
----------------------------------------------------------

function p.main(frame)

    local rawArgs = collectArgs(frame)

    local args = resolveArgs(rawArgs)

    -- ساخت خودکار دوره مسئولیت
    args.term_display  = makeTerm(args.term_start,  args.term_end)
    args.term_display2 = makeTerm(args.term_start2, args.term_end2)
    args.term_display3 = makeTerm(args.term_start3, args.term_end3)

    args = prepareArgs(args)

    return render(args)

end

----------------------------------------------------------
-- EXPORT
----------------------------------------------------------

return p