پرش به محتوا

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

از ویکی البرز
جزبدون خلاصۀ ویرایش
جزبدون خلاصۀ ویرایش
 
خط ۱۶: خط ۱۶:
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 = mw.text.trim(value)
 


if value == '' then
    value = tostring(value)
return nil
end


    value = mw.text.trim(value)


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


    -- Remove invisible Unicode characters
    value = mw.ustring.gsub(
        value,
        '[\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


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


        key = normalize(key)
        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()
 
 
if parent then
readArguments(parent.args, args)
end


    local parent = frame:getParent()


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


    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
 
local canonical = lookup[key]
 
 
if canonical then
 
args[canonical] = value
 
else


args[key] = value
    for key, value in pairs(rawArgs) do


end
        local canonical = lookup[key]


end
        if canonical then
            args[canonical] = value
        else
            args[key] = value
        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
    if not hasValue(title) then
        title = mw.title.getCurrentTitle().text
    end


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


    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
    if hasValue(args.caption) then


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


end
    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
return
    end
 
end
 


box:tag('tr')
    box:tag('tr')
:tag('th')
        :tag('th')
:attr('colspan', '2')
        :attr('colspan', '2')
:addClass('person-infobox-header')
        :addClass('person-infobox-header')
:wikitext(title)
        :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
return false
    end
 
end
 
 
local row = box:tag('tr')
 
 
row:tag('th')
:addClass('person-infobox-label')
:wikitext(label)
 
 


row:tag('td')
    local row = box:tag('tr')
:addClass('person-infobox-value')
:wikitext(value)


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


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


return true
    return true


end
end


----------------------------------------------------------
----------------------------------------------------------
خط ۳۱۷: خط ۲۸۵:
local function addMedals(box, args)
local function addMedals(box, args)


local medals = args.medaltemplates
    local medals = args.medaltemplates
 
 
if not hasValue(medals) then
 
medals = args.medals


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


    if not hasValue(medals) then
        return
    end


if not hasValue(medals) then
    local frame = mw.getCurrentFrame()


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


end
    box:tag('tr')
 
        :tag('td')
 
        :attr('colspan','2')
local frame = mw.getCurrentFrame()
        :addClass('person-infobox-medals')
 
        :wikitext(content)
 
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
end
خط ۳۶۰: خط ۳۱۹:
local function renderLayout(box, layout, args)
local function renderLayout(box, layout, args)


if not layout then
    if not layout then
return
        return
end
    end


    for i = 1, #layout do


for i = 1, #layout do
        local item = layout[i]


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


local label = item[1]
        --------------------------------------------------
local field = item[2]
        -- MEDAL TEMPLATES
        -- Render directly inside infobox
        --------------------------------------------------


        if field == "medaltemplates" then


--------------------------------------------------
            if hasValue(args[field]) then
-- MEDAL TEMPLATES
                addMedals(box, args)
-- Render directly inside infobox
            end
--------------------------------------------------


if field == "medaltemplates" then
        else


if hasValue(args[field]) then
            addRow(
                box,
                label,
                args[field]
            )


addMedals(box,args)
        end


end
    end


else
end
 
addRow(
box,
label,
args[field]
)
 
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
    for i = 1, #group.trigger do


local field = group.trigger[i]
        local field = group.trigger[i]


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


if hasValue(args[field]) then
    end


return true
    return false
 
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
return
    end
 
end
 
 
 
if hasValue(group.title) then
 
addHeader(
box,
group.title
)


end
    if hasValue(group.title) then


        addHeader(
            box,
            group.title
        )


    end


renderLayout(
    renderLayout(
box,
        box,
layouts[group.layout],
        layouts[group.layout],
args
        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
        if args[key] == nil then
            args[key] = value
        end


args[key] = value
    end


end
    return args
 
end


end


return args
end
----------------------------------------------------------
----------------------------------------------------------
-- RENDER INFOBOX
-- RENDER INFOBOX
خط ۵۱۴: خط ۴۴۷:
local function render(args)
local function render(args)


local box = createBox()
    local box = createBox()
 
 
 
addTitle(
box,
args
)
 
 
 
addImage(
box,
args
)
 
 
 
renderGroups(
box,
args
)


    addTitle(
        box,
        args
    )


    addImage(
        box,
        args
    )


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


    -- Render medal templates inside the same infobox


 
    return loadStyles()
return loadStyles()
        .. tostring(box)
.. tostring(box)


end
end
----------------------------------------------------------
----------------------------------------------------------
-- MAIN ENTRY POINT
-- MAIN ENTRY POINT
خط ۵۵۷: خط ۴۷۶:
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