پرش به محتوا

پودمان: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
return nil
end


    value = tostring(value)


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


    if value == '' then
        return nil
    end


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


    if value == '' then
        return nil
    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
            target[key] = value
        end


if key and value then
    end
target[key] = value
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]
    for key, value in pairs(rawArgs) do


        local canonical = lookup[key]


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


args[canonical] = value
    end


else
    return args
 
args[key] = value
 
end
 
end
 
 
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
 
 
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
    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
 
 
row:tag('th')
:addClass('person-infobox-label')
:wikitext(label)
 
 
 
row:tag('td')
:addClass('person-infobox-value')
:wikitext(value)
 
 
 
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
    if not hasValue(medals) then
        return
    end


return
    local frame = mw.getCurrentFrame()


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


 
    box:tag('tr')
local frame = mw.getCurrentFrame()
        :tag('td')
 
        :attr('colspan','2')
 
        :addClass('person-infobox-medals')
local content = frame:expandTemplate{
        :wikitext(content)
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]
            )


box:tag('tr')
        end
:tag('td')
:attr('colspan', '2')
:addClass('person-infobox-medals')
:wikitext(args[field])


end
    end


end


else
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(
addMedals(
        box,
box,
        args
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