پرش به محتوا

پودمان:InfoboxPerson/Core: تفاوت میان نسخه‌ها

از ویکی البرز
جزبدون خلاصۀ ویرایش
جزبدون خلاصۀ ویرایش
 
(۳ نسخهٔ میانیِ ایجادشده توسط همین کاربر نشان داده نشد)
خط ۴: خط ۴:
-- Module:InfoboxPerson/Core
-- Module:InfoboxPerson/Core
-- WikiAlborz Infobox Engine
-- WikiAlborz Infobox Engine
-- Version 1.0
-- Version 1.1
-- Medal support added
----------------------------------------------------------
----------------------------------------------------------


خط ۱۵: خط ۱۶:
local groups  = data.groups
local groups  = data.groups
local defaults = data.defaults
local defaults = data.defaults


----------------------------------------------------------
----------------------------------------------------------
خط ۲۴: خط ۲۳:
local function loadStyles()
local function loadStyles()


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


end
end


----------------------------------------------------------
----------------------------------------------------------
خط ۴۱: خط ۳۸:
local function normalize(value)
local function normalize(value)


if value == nil then
    if value == nil then
return nil
        return nil
end
    end


value = tostring(value)
    value = tostring(value)


value = mw.text.trim(value)
    value = mw.text.trim(value)


if value == '' then
    if value == '' then
return nil
        return nil
end
    end


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


if value == '' then
    if value == '' then
return nil
        return nil
end
    end


return value
    return value


end
end


----------------------------------------------------------
----------------------------------------------------------
خط ۷۶: خط ۷۱:
local function hasValue(value)
local function hasValue(value)


return normalize(value) ~= nil
    return normalize(value) ~= nil


end
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


----------------------------------------------------------
----------------------------------------------------------
خط ۸۸: خط ۹۷:
local function readArguments(source, target)
local function readArguments(source, target)


if not source then
    if not source then
return
        return
end
    end


for key, value in pairs(source) do
    for key, value in pairs(source) do


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


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


end
    end


end
end


----------------------------------------------------------
----------------------------------------------------------
خط ۱۱۳: خط ۱۲۰:
local function collectArgs(frame)
local function collectArgs(frame)


local args = {}
    local args = {}


local parent = frame:getParent()
    local parent = frame:getParent()


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


readArguments(frame.args, args)
    readArguments(frame.args, args)


return args
    return args


end
end
----------------------------------------------------------
----------------------------------------------------------
-- RESOLVE ALIASES
-- RESOLVE ALIASES
خط ۱۳۵: خط ۱۳۹:
local function resolveArgs(rawArgs)
local function resolveArgs(rawArgs)


local args = {}
    local args = {}


for key, value in pairs(rawArgs) do
    for key, value in pairs(rawArgs) do


local canonical = lookup[key]
        local canonical = lookup[key]


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


end
    end


return args
    return args


end
end


----------------------------------------------------------
----------------------------------------------------------
خط ۱۶۱: خط ۱۶۳:
local function createBox()
local function createBox()


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


end
end
----------------------------------------------------------
----------------------------------------------------------
-- ADD TITLE
-- ADD TITLE
خط ۱۷۲: خط ۱۷۵:
local function addTitle(box, args)
local function addTitle(box, args)


local title = args.name
    local title = args.name
 
if not hasValue(title) then
 
title = mw.title.getCurrentTitle().text


end
    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')
    box:tag('tr')
:tag('th')
        :tag('th')
:attr('colspan', '2')
        :attr('colspan', '2')
:addClass('person-infobox-title')
        :addClass('person-infobox-title')
:wikitext(title)
        :wikitext(title)


end
end


----------------------------------------------------------
----------------------------------------------------------
خط ۱۹۷: خط ۲۰۸:
local function addImage(box, args)
local function addImage(box, args)


local image = args.image
    local image = args.image
 
if not hasValue(image) then
 
return
 
end


    if not hasValue(image) then
        return
    end


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


    if hasValue(args.caption) then


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


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


end
end
----------------------------------------------------------
----------------------------------------------------------
-- ADD HEADER
-- ADD HEADER
خط ۲۳۹: خط ۲۴۳:
local function addHeader(box, title)
local function addHeader(box, title)


if not hasValue(title) then
    if not hasValue(title) then
        return
    end


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


end
end


----------------------------------------------------------
----------------------------------------------------------
خط ۲۶۲: خط ۲۶۱:
local function addRow(box, label, value)
local function addRow(box, label, value)


if not hasValue(value) then
    if not hasValue(value) then
        return false
    end


return false
    local row = box:tag('tr')


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


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


local row = box:tag('tr')
    return true


end
----------------------------------------------------------
-- ADD MEDALS
----------------------------------------------------------


row:tag('th')
local function addMedals(box, args)
:addClass('person-infobox-label')
:wikitext(label)


    local medals = args.medaltemplates


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


row:tag('td')
    if not hasValue(medals) then
:addClass('person-infobox-value')
        return
:wikitext(value)
    end


    local frame = mw.getCurrentFrame()


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


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


end
end
----------------------------------------------------------
----------------------------------------------------------
-- RENDER LAYOUT
-- RENDER LAYOUT
خط ۲۹۶: خط ۳۱۹:
local function renderLayout(box, layout, args)
local function renderLayout(box, layout, args)


if not layout then
    if not layout then
        return
    end


return
    for i = 1, #layout do


end
        local item = layout[i]


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


for i = 1, #layout do
        --------------------------------------------------
        -- MEDAL TEMPLATES
        -- Render directly inside infobox
        --------------------------------------------------


local item = layout[i]
        if field == "medaltemplates" then


local label = item[1]
            if hasValue(args[field]) then
local field = item[2]
                addMedals(box, args)
            end


        else


addRow(
            addRow(
box,
                box,
label,
                label,
args[field]
                args[field]
)
            )


end
        end
 
    end


end
end
----------------------------------------------------------
----------------------------------------------------------
-- CHECK GROUP TRIGGER
-- CHECK GROUP TRIGGER
خط ۳۲۶: خط ۳۶۱:
local function checkTrigger(group, args)
local function checkTrigger(group, args)


if not group.trigger then
    if not group.trigger then
 
        return true
return true
    end


end
    for i = 1, #group.trigger do


        local field = group.trigger[i]


for i = 1, #group.trigger do
        if hasValue(args[field]) then
            return true
        end


local field = group.trigger[i]
    end


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


end
end


----------------------------------------------------------
----------------------------------------------------------
خط ۳۵۹: خط ۳۸۵:
local function renderGroup(box, group, args)
local function renderGroup(box, group, args)


if not checkTrigger(group, args) then
    if not checkTrigger(group, args) then
        return
    end


return
    if hasValue(group.title) then


end
        addHeader(
            box,
            group.title
        )


    end


 
    renderLayout(
if hasValue(group.title) then
        box,
 
        layouts[group.layout],
addHeader(
        args
box,
    )
group.title
)
 
end
 
 
 
renderLayout(
box,
layouts[group.layout],
args
)


end
end
----------------------------------------------------------
----------------------------------------------------------
-- RENDER ALL GROUPS
-- RENDER ALL GROUPS
خط ۳۹۴: خط ۴۱۱:
local function renderGroups(box, args)
local function renderGroups(box, args)


for i = 1, #groups do
    for i = 1, #groups do


renderGroup(
        renderGroup(
box,
            box,
groups[i],
            groups[i],
args
            args
)
        )


end
    end


end
end


----------------------------------------------------------
----------------------------------------------------------
خط ۴۱۴: خط ۴۲۹:
local function prepareArgs(args)
local function prepareArgs(args)


for key, value in pairs(defaults) do
    for key, value in pairs(defaults) do
 
if args[key] == nil then
 
args[key] = value
 
end


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


    end


return args
    return args


end
end


----------------------------------------------------------
----------------------------------------------------------
خط ۴۳۷: خط ۴۴۷:
local function render(args)
local function render(args)


local box = createBox()
    local box = createBox()


    addTitle(
        box,
        args
    )


addTitle(
    addImage(
box,
        box,
args
        args
)
    )


    renderGroups(
        box,
        args
    )


addImage(
    -- Render medal templates inside the same infobox
box,
args
)


 
    return loadStyles()
renderGroups(
        .. tostring(box)
box,
args
)
 
 
return loadStyles()
.. tostring(box)


end
end
خط ۴۶۸: خط ۴۷۶:
function p.main(frame)
function p.main(frame)


local rawArgs = collectArgs(frame)
    local rawArgs = collectArgs(frame)


    local args = resolveArgs(rawArgs)


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)


args = prepareArgs(args)
    return render(args)
 
 
return render(args)


end
end


----------------------------------------------------------
----------------------------------------------------------

نسخهٔ کنونی تا ‏۱۹ ژوئیهٔ ۲۰۲۶، ساعت ۱۲:۲۶

توضیحات این پودمان می‌تواند در پودمان: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