پودمان:InfoboxPerson/Core: تفاوت میان نسخهها
ظاهر
صفحهای تازه حاوی «local p = {} --================================================== -- Module:InfoboxPerson/Core -- Version 2 -- Part 1 --================================================== local html = mw.html ---------------------------------------------------- -- LOAD DATA ---------------------------------------------------- local data = require("Module:InfoboxPerson/Data") local lookup = data.lookup or {} local layouts = data.layouts or {} loc...» ایجاد کرد |
جزبدون خلاصۀ ویرایش |
||
| (۵ نسخهٔ میانیِ ایجادشده توسط همین کاربر نشان داده نشد) | |||
| خط ۱: | خط ۱: | ||
local p = {} | local p = {} | ||
-- | ---------------------------------------------------------- | ||
-- Module:InfoboxPerson/Core | -- Module:InfoboxPerson/Core | ||
-- Version | -- WikiAlborz Infobox Engine | ||
-- | -- Version 1.1 | ||
-- | -- Medal support added | ||
---------------------------------------------------------- | |||
local html = mw.html | local html = mw.html | ||
local data = require('Module:InfoboxPerson/Data') | |||
local data = | local lookup = data.lookup | ||
local layouts = data.layouts | |||
local groups = data.groups | |||
local defaults = data.defaults | |||
---------------------------------------------------------- | |||
-- LOAD TEMPLATESTYLES | |||
---------------------------------------------------------- | |||
local | local function loadStyles() | ||
return mw.getCurrentFrame():extensionTag{ | |||
name = 'templatestyles', | |||
args = { | |||
src = 'Module:InfoboxPerson/styles.css' | |||
} | |||
} | |||
end | |||
---------------------------------------------------------- | |||
---------------------------------------------------- | |||
-- NORMALIZE | -- NORMALIZE | ||
---------------------------------------------------- | ---------------------------------------------------------- | ||
local function normalize(value) | 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 | |||
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) | local function hasValue(value) | ||
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 | |||
---------------------------------------------------------- | |||
-- 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 | end | ||
---------------------------------------------------------- | |||
---------------------------------------------------- | |||
-- RESOLVE ALIASES | -- RESOLVE ALIASES | ||
---------------------------------------------------- | ---------------------------------------------------------- | ||
local function resolveArgs(rawArgs) | 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 | end | ||
---------------------------------------------------------- | |||
------ | |||
---------------------------------------------------- | |||
-- CREATE INFOBOX | -- CREATE INFOBOX | ||
---------------------------------------------------- | ---------------------------------------------------------- | ||
local function createBox() | local function createBox() | ||
return html.create('table') | |||
:addClass('infobox') | |||
:addClass('person-infobox') | |||
end | end | ||
---------------------------------------------------------- | |||
---------------------------------------------------- | |||
-- ADD TITLE | -- 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 | end | ||
---------------------------------------------------------- | |||
---------------------------------------------------- | |||
-- ADD IMAGE | -- 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 | end | ||
---------------------------------------------------------- | |||
---------------------------------------------------- | |||
-- ADD HEADER | -- 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 | end | ||
---------------------------------------------------------- | |||
---------------------------------------------------- | |||
-- ADD ROW | -- ADD ROW | ||
---------------------------------------------------- | ---------------------------------------------------------- | ||
local function addRow(box,label,value) | 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 | end | ||
---------------------------------------------------- | ---------------------------------------------------------- | ||
-- RENDER LAYOUT | -- RENDER LAYOUT | ||
---------------------------------------------------- | ---------------------------------------------------------- | ||
local function renderLayout(box, layout, args) | 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 | 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 | 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 | end | ||
---------------------------------------------------------- | |||
---------------------------------------------------- | |||
-- RENDER INFOBOX | -- RENDER INFOBOX | ||
---------------------------------------------------- | ---------------------------------------------------------- | ||
local function render(args) | 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 | |||
نسخهٔ کنونی تا ۱۹ ژوئیهٔ ۲۰۲۶، ساعت ۱۲:۲۶
توضیحات این پودمان میتواند در پودمان: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