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