پرش به محتوا

پودمان:AlborzSports: تفاوت میان نسخه‌ها

از ویکی البرز
جزبدون خلاصۀ ویرایش
جزبدون خلاصۀ ویرایش
خط ۵: خط ۵:
-- Version 2.2
-- Version 2.2
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local p = {}
local p = {}
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- LOAD DATA
-- LOAD DATA
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local data = mw.loadData("Module:AlborzSports/Data")
local data = mw.loadData("Module:AlborzSports/Data")
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- CONFIG
-- CONFIG
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local DEFAULT_IMAGE_WIDTH =
local DEFAULT_IMAGE_WIDTH =
data.meta.imageWidth or "280px"
data.meta.imageWidth or "280px"
 
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- UTILITY FUNCTIONS
-- UTILITY FUNCTIONS
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local function clean(value)
local function clean(value)
if value == nil then
if value == nil then
return nil
return nil
end
end
if type(value) == "string" then
if type(value) == "string" then
value = mw.text.trim(value)
value = mw.text.trim(value)
if value == "" then
if value == "" then
return nil
return nil
end
end
end
end
return value
return value
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- GET ARGUMENTS
-- GET ARGUMENTS
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local function getArgs(frame)
local function getArgs(frame)
local args = {}
local args = {}
local source = frame
local source = frame
local parent = frame:getParent()
local parent = frame:getParent()
if parent and next(parent.args) then
if parent and next(parent.args) then
source = parent
source = parent
end
end
for key, value in pairs(source.args) do
for key, value in pairs(source.args) do
local cleanKey =
local cleanKey =
mw.text.trim(tostring(key))
mw.text.trim(tostring(key))
 
local cleanValue =
local cleanValue =
clean(value)
clean(value)
 
if cleanKey ~= "" and cleanValue then
if cleanKey ~= "" and cleanValue then
args[cleanKey] = cleanValue
args[cleanKey] = cleanValue
end
end
end
end
return args
return args
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- NORMALIZE INPUT
-- NORMALIZE INPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local function normalize(args)
local function normalize(args)
local result = {}
local result = {}
for key, value in pairs(args) do
for key, value in pairs(args) do
local field =
local field =
data.lookup[key] or key
data.lookup[key] or key
 
result[field] = value
result[field] = value
end
end
return result
return result
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- ENTITY ALIASES
-- ENTITY ALIASES
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local entityAliases = {
local entityAliases = {
-- People
-- People
 
player = "player",
player         = "player",
athlete = "player",
athlete         = "player",
["بازیکن"] = "player",
 
["ورزشکار"] = "player",
["بازیکن"]     = "player",
coach = "coach",
["ورزشکار"]     = "player",
["مربی"] = "coach",
 
referee = "referee",
coach           = "coach",
["داور"] = "referee",
["مربی"]       = "coach",
manager = "manager",
 
["مدیر ورزشی"] = "manager",
referee         = "referee",
["داور"]       = "referee",
 
manager         = "manager",
["مدیر ورزشی"] = "manager",
 
-- Clubs
-- Clubs
 
club = "club",
club           = "club",
sports_club = "club",
sports_club     = "club",
sport_club = "club",
sport_club     = "club",
["باشگاه"] = "club",
 
["باشگاه"]     = "club",
["باشگاه ورزشی"] = "club",
["باشگاه ورزشی"] = "club",
-- Academy
-- Academy
 
academy = "academy",
academy         = "academy",
["آکادمی"] = "academy",
["آکادمی"]     = "academy",
["آکادمی ورزشی"] = "academy",
["آکادمی ورزشی"] = "academy",
-- Facilities
-- Facilities
 
stadium = "stadium",
stadium         = "stadium",
["ورزشگاه"] = "stadium",
["ورزشگاه"]     = "stadium",
gym = "gym",
 
gymnasium = "gym",
gym             = "gym",
["سالن"] = "gym",
gymnasium       = "gym",
["سالن ورزشی"] = "gym",
["سالن"]       = "gym",
pool = "pool",
["سالن ورزشی"] = "gym",
swimming_pool = "pool",
 
["استخر"] = "pool",
pool           = "pool",
zurkhaneh = "zurkhaneh",
swimming_pool   = "pool",
["زورخانه"] = "zurkhaneh",
["استخر"]       = "pool",
sports_school = "sports_school",
 
zurkhaneh       = "zurkhaneh",
["زورخانه"]     = "zurkhaneh",
 
sports_school   = "sports_school",
["مدرسه ورزشی"] = "sports_school",
["مدرسه ورزشی"] = "sports_school",
 
sports_complex = "sports_complex",
sports_complex = "sports_complex",
["مجموعه ورزشی"] = "sports_complex",
["مجموعه ورزشی"] = "sports_complex",
 
facility = "facility",
facility       = "facility",
["مجموعه"] = "facility",
["مجموعه"]     = "facility",
 
-- Organization / Board
-- Organization / Board
 
board = "board",
board           = "board",
sports_board = "board",
sports_board   = "board",
["هیئت"] = "board",
["هیئت"]       = "board",
["هیئت ورزشی"] = "board",
["هیئت ورزشی"] = "board",
 
-- Competition
-- Competition
 
competition = "competition",
competition     = "competition",
["مسابقه"] = "competition",
["مسابقه"]     = "competition",
["مسابقات"] = "competition"
["مسابقات"]     = "competition"
 
}
}
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- ENTITY DETECTION
-- ENTITY DETECTION
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local function getEntity(args)
local function getEntity(args)
 
local entity = clean(args.entity_type)
local entity =
clean(args.entity_type)


----------------------------------------------------------------
----------------------------------------------------------------
-- DEFAULT ENTITY
-- DEFAULT ENTITY
----------------------------------------------------------------
----------------------------------------------------------------
if not entity then
if not entity then
 
entity = data.defaults.entity_type
entity =
data.defaults.entity_type
 
end
end


خط ۲۰۴: خط ۱۳۲:
-- NORMALIZE ENTITY
-- NORMALIZE ENTITY
----------------------------------------------------------------
----------------------------------------------------------------
 
entity = entityAliases[entity] or entity
entity =
entityAliases[entity]
or entity


----------------------------------------------------------------
----------------------------------------------------------------
-- VALID ENTITY
-- VALID ENTITY
----------------------------------------------------------------
----------------------------------------------------------------
if data.entities[entity] then
if data.entities[entity] then
return entity
end


return entity
----------------------------------------------------------------
-- INFERENCE FROM SUBTYPE (نوع)
----------------------------------------------------------------
local subtype = clean(args.subtype)
if subtype then
-- باشگاه
if mw.ustring.find(subtype, "باشگاه") or mw.ustring.find(mw.ustring.lower(subtype), "club") then
return "club"
end
-- آکادمی
if mw.ustring.find(subtype, "آکادمی") or mw.ustring.find(mw.ustring.lower(subtype), "academy") then
return "academy"
end
-- ورزشگاه
if mw.ustring.find(subtype, "ورزشگاه") or mw.ustring.find(mw.ustring.lower(subtype), "stadium") then
return "stadium"
end
-- سالن ورزشی
if mw.ustring.find(subtype, "سالن") or mw.ustring.find(mw.ustring.lower(subtype), "gym") then
return "gym"
end
-- استخر
if mw.ustring.find(subtype, "استخر") or mw.ustring.find(mw.ustring.lower(subtype), "pool") then
return "pool"
end
-- زورخانه
if mw.ustring.find(subtype, "زورخانه") then
return "zurkhaneh"
end
-- مدرسه ورزشی
if mw.ustring.find(subtype, "مدرسه") then
return "sports_school"
end
-- مجموعه ورزشی
if mw.ustring.find(subtype, "مجموعه") then
return "sports_complex"
end
-- هیئت
if mw.ustring.find(subtype, "هیئت") then
return "board"
end
end


----------------------------------------------------------------
-- INFERENCE FROM FIELDS (اگر subtype هم نبود)
----------------------------------------------------------------
if args.established
or args.manager
or args.owner
or args.president
or args.ceo
or args.stadium
or args.capacity
or args.facilities
or args.services
or (args.address and args.city)
then
-- اگر فیلدهای سازمانی وجود داشت → باشگاه/مجموعه
if args.stadium or args.capacity then
return "stadium"
end
return "club"
end
end


خط ۲۲۲: خط ۲۰۸:
-- SAFE FALLBACK
-- SAFE FALLBACK
----------------------------------------------------------------
----------------------------------------------------------------
 
local defaultEntity = data.defaults.entity_type or "player"
local defaultEntity =
defaultEntity = entityAliases[defaultEntity] or defaultEntity
data.defaults.entity_type or "player"
 
defaultEntity =
entityAliases[defaultEntity]
or defaultEntity


if data.entities[defaultEntity] then
if data.entities[defaultEntity] then
return defaultEntity
return defaultEntity
end
end


return "player"
return "player"
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- TITLE
-- TITLE
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local function getTitle(entity, args)
local function getTitle(entity, args)
if args.name then
if args.name then
return args.name
return args.name
end
end
local entityData =
local entityData =
data.entities[entity]
data.entities[entity]
 
if entityData and entityData.title then
if entityData and entityData.title then
return entityData.title
return entityData.title
end
end
return data.meta.title
return data.meta.title
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- IMAGE HANDLING
-- IMAGE HANDLING
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local function buildImage(args)
local function buildImage(args)
if not args.image then
if not args.image then
return nil
return nil
end
end
local width =
local width =
args.image_width
args.image_width
or DEFAULT_IMAGE_WIDTH
or DEFAULT_IMAGE_WIDTH
 
local caption =
local caption =
args.caption
args.caption
or ""
or ""
 
return {
return {
type = "image",
type = "image",
image = args.image,
image = args.image,
size = width,
size = width,
caption = caption
caption = caption
}
}
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- FIELD BUILDER
-- FIELD BUILDER
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local function buildFields(layout, args)
local function buildFields(layout, args)
local fields = {}
local fields = {}
for _, item in ipairs(layout) do
for _, item in ipairs(layout) do
local label =
local label =
item[1]
item[1]
 
local key =
local key =
item[2]
item[2]
 
local value =
local value =
clean(args[key])
clean(args[key])
 
----------------------------------------------------------------
----------------------------------------------------------------
-- ONLY ADD EXISTING VALUES
-- ONLY ADD EXISTING VALUES
----------------------------------------------------------------
----------------------------------------------------------------
if value then
if value then
table.insert(
table.insert(
fields,
fields,
{
{
 
label = label,
label = label,
value = value
 
}
value = value
 
}
)
)
end
end
end
end
return fields
return fields
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- GROUP BUILDER
-- GROUP BUILDER
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local function buildGroups(entity, args)
local function buildGroups(entity, args)
local groups = {}
local groups = {}
local entityData =
local entityData =
data.entities[entity]
data.entities[entity]
 
if not entityData then
if not entityData then
return groups
return groups
end
end
----------------------------------------------------------------
----------------------------------------------------------------
-- USE ONLY ENTITY-SPECIFIC LAYOUTS
-- USE ONLY ENTITY-SPECIFIC LAYOUTS
خط ۳۶۲: خط ۲۹۶:
-- in the entity's layouts.
-- in the entity's layouts.
----------------------------------------------------------------
----------------------------------------------------------------
for _, layoutName in ipairs(entityData.layouts or {}) do
for _, layoutName in ipairs(entityData.layouts or {}) do
local layout =
local layout =
data.layouts[layoutName]
data.layouts[layoutName]
 
if layout then
if layout then
local fields =
local fields =
buildFields(
buildFields(
layout,
layout,
args
args
)
)
 
----------------------------------------------------------------
----------------------------------------------------------------
-- DO NOT DISPLAY EMPTY GROUPS
-- DO NOT DISPLAY EMPTY GROUPS
----------------------------------------------------------------
----------------------------------------------------------------
if #fields > 0 then
if #fields > 0 then
local title =
local title =
data.layoutTitles[layoutName]
data.layoutTitles[layoutName]
or layoutName
or layoutName
 
table.insert(
table.insert(
groups,
groups,
{
{
 
name = title,
name = title,
fields = fields
 
}
fields = fields
 
}
)
)
end
end
end
end
end
end
return groups
return groups
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- MEDAL BUILDER
-- MEDAL BUILDER
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local function buildMedals(args)
local function buildMedals(args)
local medals =
local medals =
clean(args.medaltemplates)
clean(args.medaltemplates)
 
if not medals then
if not medals then
medals =
medals =
clean(args.medals)
clean(args.medals)
 
end
end
if not medals then
if not medals then
return nil
return nil
end
end
local frame =
local frame =
mw.getCurrentFrame()
mw.getCurrentFrame()
 
local content =
local content =
frame:expandTemplate{
frame:expandTemplate{
 
title = "Infobox medal templates",
title = "Infobox medal templates",
args = {
 
medals = medals,
args = {
title =
 
args.medaltemplates_title
medals = medals,
or "",
 
expand = "yes"
title =
args.medaltemplates_title
or "",
 
expand = "yes"
 
}
 
}
}
 
}
content =
content =
clean(content)
clean(content)
 
if not content then
if not content then
return nil
return nil
end
end
return content
return content
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- INFOBOX BUILDER
-- INFOBOX BUILDER
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local function buildInfobox(entity, args)
local function buildInfobox(entity, args)
local box = {}
local box = {}
----------------------------------------------------------------
----------------------------------------------------------------
-- TITLE
-- TITLE
----------------------------------------------------------------
----------------------------------------------------------------
box.title =
box.title =
getTitle(
getTitle(
entity,
entity,
args
args
)
)
 
----------------------------------------------------------------
----------------------------------------------------------------
-- IMAGE
-- IMAGE
----------------------------------------------------------------
----------------------------------------------------------------
local image =
local image =
buildImage(args)
buildImage(args)
 
if image then
if image then
box.image = image
box.image = image
end
end
----------------------------------------------------------------
----------------------------------------------------------------
-- GROUPS
-- GROUPS
----------------------------------------------------------------
----------------------------------------------------------------
box.groups =
box.groups =
buildGroups(
buildGroups(
entity,
entity,
args
args
)
)
 
----------------------------------------------------------------
----------------------------------------------------------------
-- MEDALS
-- MEDALS
----------------------------------------------------------------
----------------------------------------------------------------
box.medals =
box.medals =
buildMedals(args)
buildMedals(args)
 
return box
return box
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- RENDER VALUE
-- RENDER VALUE
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local function renderValue(value)
local function renderValue(value)
if type(value) == "table" then
if type(value) == "table" then
return table.concat(
return table.concat(
value,
value,
"، "
"، "
)
)
end
end
return tostring(value)
return tostring(value)
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- ESCAPE HTML
-- ESCAPE HTML
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local function escape(value)
local function escape(value)
if value == nil then
if value == nil then
return ""
return ""
end
end
return mw.text.nowiki(
return mw.text.nowiki(
tostring(value)
tostring(value)
)
)
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- RENDER INFOBOX
-- RENDER INFOBOX
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
local function renderInfobox(box)
local function renderInfobox(box)
local result = {}
local result = {}
----------------------------------------------------------------
----------------------------------------------------------------
-- OPEN TABLE
-- OPEN TABLE
----------------------------------------------------------------
----------------------------------------------------------------
table.insert(
table.insert(
result,
result,
 
'<table class="sport-infobox">'
'<table class="sport-infobox">'
 
)
)
----------------------------------------------------------------
----------------------------------------------------------------
-- TITLE
-- TITLE
----------------------------------------------------------------
----------------------------------------------------------------
if box.title then
if box.title then
table.insert(
table.insert(
result,
result,
 
'<tr class="sport-infobox-title">' ..
'<tr class="sport-infobox-title">' ..
'<th colspan="2">' ..
 
box.title ..
'<th colspan="2">' ..
'</th></tr>'
 
box.title ..
 
'</th></tr>'
 
)
)
end
end
----------------------------------------------------------------
----------------------------------------------------------------
-- IMAGE
-- IMAGE
----------------------------------------------------------------
----------------------------------------------------------------
if box.image then
if box.image then
local image =
local image =
box.image
box.image
 
local file =
local file =
image.image
image.image
 
local size =
local size =
image.size
image.size
or DEFAULT_IMAGE_WIDTH
or DEFAULT_IMAGE_WIDTH
 
local caption =
local caption =
image.caption
image.caption
or ""
or ""
 
table.insert(
table.insert(
result,
result,
 
'<tr>' ..
'<tr>' ..
'<td colspan="2" class="sport-infobox-image">' ..
 
'[[File:' ..
'<td colspan="2" class="sport-infobox-image">' ..
file ..
 
'|' ..
'[[File:' ..
size ..
file ..
']]'
'|' ..
size ..
']]'
 
)
)
if caption ~= "" then
if caption ~= "" then
table.insert(
table.insert(
result,
result,
 
'<div class="sport-infobox-caption">' ..
'<div class="sport-infobox-caption">' ..
caption ..
 
'</div>'
caption ..
 
'</div>'
 
)
)
end
end
table.insert(
table.insert(
result,
result,
 
'</td></tr>'
'</td></tr>'
 
)
)
end
end
----------------------------------------------------------------
----------------------------------------------------------------
-- GROUPS
-- GROUPS
----------------------------------------------------------------
----------------------------------------------------------------
for _, group in ipairs(box.groups) do
for _, group in ipairs(box.groups) do
----------------------------------------------------------------
----------------------------------------------------------------
-- GROUP HEADER
-- GROUP HEADER
----------------------------------------------------------------
----------------------------------------------------------------
table.insert(
table.insert(
result,
result,
 
'<tr class="sport-infobox-header">' ..
'<tr class="sport-infobox-header">' ..
'<th colspan="2">' ..
 
group.name ..
'<th colspan="2">' ..
'</th></tr>'
 
group.name ..
 
'</th></tr>'
 
)
)
----------------------------------------------------------------
----------------------------------------------------------------
-- GROUP FIELDS
-- GROUP FIELDS
----------------------------------------------------------------
----------------------------------------------------------------
for _, field in ipairs(group.fields) do
for _, field in ipairs(group.fields) do
table.insert(
table.insert(
result,
result,
 
'<tr>' ..
'<tr>' ..
'<th class="sport-infobox-label">' ..
 
field.label ..
'<th class="sport-infobox-label">' ..
'</th>' ..
 
'<td class="sport-infobox-value">' ..
field.label ..
renderValue(field.value) ..
 
'</td>' ..
'</th>' ..
'</tr>'
 
'<td class="sport-infobox-value">' ..
 
renderValue(field.value) ..
 
'</td>' ..
 
'</tr>'
 
)
)
end
end
end
end
----------------------------------------------------------------
----------------------------------------------------------------
-- MEDALS
-- MEDALS
خط ۷۰۴: خط ۵۱۴:
-- Medals remain INSIDE the infobox table.
-- Medals remain INSIDE the infobox table.
----------------------------------------------------------------
----------------------------------------------------------------
if box.medals then
if box.medals then
table.insert(
table.insert(
result,
result,
 
'<tr>' ..
'<tr>' ..
'<td colspan="2" class="sport-infobox-medals">' ..
 
box.medals ..
'<td colspan="2" class="sport-infobox-medals">' ..
'</td>' ..
 
'</tr>'
box.medals ..
 
'</td>' ..
 
'</tr>'
 
)
)
end
end
----------------------------------------------------------------
----------------------------------------------------------------
-- CLOSE TABLE
-- CLOSE TABLE
----------------------------------------------------------------
----------------------------------------------------------------
table.insert(
table.insert(
result,
result,
 
'</table>'
'</table>'
 
)
)
return table.concat(
return table.concat(
result,
result,
"\n"
"\n"
)
)
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- PUBLIC FUNCTION
-- PUBLIC FUNCTION
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
function p.main(frame)
function p.main(frame)
----------------------------------------------------------------
----------------------------------------------------------------
-- GET ARGUMENTS
-- GET ARGUMENTS
----------------------------------------------------------------
----------------------------------------------------------------
local args =
local args =
getArgs(frame)
getArgs(frame)
 
----------------------------------------------------------------
----------------------------------------------------------------
-- NORMALIZE INPUT
-- NORMALIZE INPUT
----------------------------------------------------------------
----------------------------------------------------------------
args =
args =
normalize(args)
normalize(args)
 
----------------------------------------------------------------
----------------------------------------------------------------
-- ENTITY
-- ENTITY
----------------------------------------------------------------
----------------------------------------------------------------
local entity =
local entity =
getEntity(args)
getEntity(args)
 
----------------------------------------------------------------
----------------------------------------------------------------
-- BUILD INFOBOX
-- BUILD INFOBOX
----------------------------------------------------------------
----------------------------------------------------------------
local box =
local box =
buildInfobox(
buildInfobox(
entity,
entity,
args
args
)
)
 
----------------------------------------------------------------
----------------------------------------------------------------
-- RENDER
-- RENDER
----------------------------------------------------------------
----------------------------------------------------------------
return renderInfobox(box)
return renderInfobox(box)
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- TEMPLATE ENTRY
-- TEMPLATE ENTRY
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
function p.infobox(frame)
function p.infobox(frame)
return p.main(frame)
return p.main(frame)
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- DEBUG FUNCTION
-- DEBUG FUNCTION
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
function p.test(frame)
function p.test(frame)
local args =
local args =
getArgs(frame)
getArgs(frame)
 
----------------------------------------------------------------
----------------------------------------------------------------
-- NORMALIZE
-- NORMALIZE
----------------------------------------------------------------
----------------------------------------------------------------
args =
args =
normalize(args)
normalize(args)
 
----------------------------------------------------------------
----------------------------------------------------------------
-- ENTITY
-- ENTITY
----------------------------------------------------------------
----------------------------------------------------------------
local entity =
local entity =
getEntity(args)
getEntity(args)
 
----------------------------------------------------------------
----------------------------------------------------------------
-- ENTITY DATA
-- ENTITY DATA
----------------------------------------------------------------
----------------------------------------------------------------
local entityData =
local entityData =
data.entities[entity]
data.entities[entity]
 
if not entityData then
if not entityData then
return "Entity not found: " .. tostring(entity)
return "Entity not found: " .. tostring(entity)
end
end
----------------------------------------------------------------
----------------------------------------------------------------
-- RESULT
-- RESULT
----------------------------------------------------------------
----------------------------------------------------------------
local result = {}
local result = {}
table.insert(
table.insert(
result,
result,
 
"Entity: " ..
"Entity: " ..
entity
entity
 
)
)
table.insert(
table.insert(
result,
result,
 
"Title: " ..
"Title: " ..
tostring(
tostring(
entityData.title
entityData.title
)
)
 
)
)
table.insert(
table.insert(
result,
result,
 
"Layouts: " ..
"Layouts: " ..
table.concat(
 
entityData.layouts or {},
table.concat(
", "
entityData.layouts or {},
)
", "
)
 
)
)
----------------------------------------------------------------
----------------------------------------------------------------
-- DEBUG TYPE
-- DEBUG TYPE
----------------------------------------------------------------
----------------------------------------------------------------
table.insert(
table.insert(
result,
result,
 
"Subtype: " ..
"Subtype: " ..
tostring(
 
args.subtype
tostring(
or "NOT FOUND"
args.subtype
)
or "NOT FOUND"
)
 
)
)
----------------------------------------------------------------
----------------------------------------------------------------
-- DEBUG COACH
-- DEBUG COACH
----------------------------------------------------------------
----------------------------------------------------------------
table.insert(
table.insert(
result,
result,
 
"Coach: " ..
"Coach: " ..
tostring(
 
args.coach
tostring(
or "NOT FOUND"
args.coach
)
or "NOT FOUND"
)
 
)
)
----------------------------------------------------------------
----------------------------------------------------------------
-- DEBUG MEDALS
-- DEBUG MEDALS
----------------------------------------------------------------
----------------------------------------------------------------
table.insert(
table.insert(
result,
result,
 
"Medals: " ..
"Medals: " ..
tostring(
 
args.medaltemplates
tostring(
or args.medals
args.medaltemplates
or "NOT FOUND"
or args.medals
)
or "NOT FOUND"
)
 
)
)
return table.concat(
return table.concat(
result,
result,
"\n"
"\n"
)
)
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- GET ENTITY LIST
-- GET ENTITY LIST
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
function p.entities()
function p.entities()
local result = {}
local result = {}
for key, value in pairs(data.entities) do
for key, value in pairs(data.entities) do
table.insert(
table.insert(
 
result,
result,
key ..
 
" : " ..
key ..
tostring(
" : " ..
value.title
tostring(
)
value.title
)
 
)
)
end
end
table.sort(result)
table.sort(result)
return table.concat(
return table.concat(
result,
result,
"\n"
"\n"
)
)
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- GET VERSION
-- GET VERSION
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
function p.version()
function p.version()
return
return
 
data.version.name ..
data.version.name ..
" v" ..
 
data.version.major ..
" v" ..
"." ..
 
data.version.minor
data.version.major ..
 
"." ..
 
data.version.minor
 
end
end
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- EXPORT
-- EXPORT
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
return p
return p

نسخهٔ ‏۱۰ اوت ۲۰۲۶، ساعت ۱۸:۱۷

توضیحات این پودمان می‌تواند در پودمان:AlborzSports/توضیحات قرار گیرد.

--------------------------------------------------------------------------------
-- Module:AlborzSports
-- Wiki Alborz Sports Information System
-- Core Engine
-- Version 2.2
--------------------------------------------------------------------------------
local p = {}
--------------------------------------------------------------------------------
-- LOAD DATA
--------------------------------------------------------------------------------
local data = mw.loadData("Module:AlborzSports/Data")
--------------------------------------------------------------------------------
-- CONFIG
--------------------------------------------------------------------------------
local DEFAULT_IMAGE_WIDTH =
data.meta.imageWidth or "280px"
--------------------------------------------------------------------------------
-- UTILITY FUNCTIONS
--------------------------------------------------------------------------------
local function clean(value)
	if value == nil then
		return nil
	end
	if type(value) == "string" then
		value = mw.text.trim(value)
		if value == "" then
			return nil
		end
	end
	return value
end
--------------------------------------------------------------------------------
-- GET ARGUMENTS
--------------------------------------------------------------------------------
local function getArgs(frame)
	local args = {}
	local source = frame
	local parent = frame:getParent()
	if parent and next(parent.args) then
		source = parent
	end
	for key, value in pairs(source.args) do
		local cleanKey =
		mw.text.trim(tostring(key))
		local cleanValue =
		clean(value)
		if cleanKey ~= "" and cleanValue then
			args[cleanKey] = cleanValue
		end
	end
	return args
end
--------------------------------------------------------------------------------
-- NORMALIZE INPUT
--------------------------------------------------------------------------------
local function normalize(args)
	local result = {}
	for key, value in pairs(args) do
		local field =
		data.lookup[key] or key
		result[field] = value
	end
	return result
end
--------------------------------------------------------------------------------
-- ENTITY ALIASES
--------------------------------------------------------------------------------
local entityAliases = {
	-- People
	player = "player",
	athlete = "player",
	["بازیکن"] = "player",
	["ورزشکار"] = "player",
	coach = "coach",
	["مربی"] = "coach",
	referee = "referee",
	["داور"] = "referee",
	manager = "manager",
	["مدیر ورزشی"] = "manager",
	-- Clubs
	club = "club",
	sports_club = "club",
	sport_club = "club",
	["باشگاه"] = "club",
	["باشگاه ورزشی"] = "club",
	-- Academy
	academy = "academy",
	["آکادمی"] = "academy",
	["آکادمی ورزشی"] = "academy",
	-- Facilities
	stadium = "stadium",
	["ورزشگاه"] = "stadium",
	gym = "gym",
	gymnasium = "gym",
	["سالن"] = "gym",
	["سالن ورزشی"] = "gym",
	pool = "pool",
	swimming_pool = "pool",
	["استخر"] = "pool",
	zurkhaneh = "zurkhaneh",
	["زورخانه"] = "zurkhaneh",
	sports_school = "sports_school",
	["مدرسه ورزشی"] = "sports_school",
	sports_complex = "sports_complex",
	["مجموعه ورزشی"] = "sports_complex",
	facility = "facility",
	["مجموعه"] = "facility",
	-- Organization / Board
	board = "board",
	sports_board = "board",
	["هیئت"] = "board",
	["هیئت ورزشی"] = "board",
	-- Competition
	competition = "competition",
	["مسابقه"] = "competition",
	["مسابقات"] = "competition"
}
--------------------------------------------------------------------------------
-- ENTITY DETECTION
--------------------------------------------------------------------------------
local function getEntity(args)
	local entity = clean(args.entity_type)

	----------------------------------------------------------------
	-- DEFAULT ENTITY
	----------------------------------------------------------------
	if not entity then
		entity = data.defaults.entity_type
	end

	----------------------------------------------------------------
	-- NORMALIZE ENTITY
	----------------------------------------------------------------
	entity = entityAliases[entity] or entity

	----------------------------------------------------------------
	-- VALID ENTITY
	----------------------------------------------------------------
	if data.entities[entity] then
		return entity
	end

	----------------------------------------------------------------
	-- INFERENCE FROM SUBTYPE (نوع)
	----------------------------------------------------------------
	local subtype = clean(args.subtype)
	if subtype then
		-- باشگاه
		if mw.ustring.find(subtype, "باشگاه") or mw.ustring.find(mw.ustring.lower(subtype), "club") then
			return "club"
		end
		-- آکادمی
		if mw.ustring.find(subtype, "آکادمی") or mw.ustring.find(mw.ustring.lower(subtype), "academy") then
			return "academy"
		end
		-- ورزشگاه
		if mw.ustring.find(subtype, "ورزشگاه") or mw.ustring.find(mw.ustring.lower(subtype), "stadium") then
			return "stadium"
		end
		-- سالن ورزشی
		if mw.ustring.find(subtype, "سالن") or mw.ustring.find(mw.ustring.lower(subtype), "gym") then
			return "gym"
		end
		-- استخر
		if mw.ustring.find(subtype, "استخر") or mw.ustring.find(mw.ustring.lower(subtype), "pool") then
			return "pool"
		end
		-- زورخانه
		if mw.ustring.find(subtype, "زورخانه") then
			return "zurkhaneh"
		end
		-- مدرسه ورزشی
		if mw.ustring.find(subtype, "مدرسه") then
			return "sports_school"
		end
		-- مجموعه ورزشی
		if mw.ustring.find(subtype, "مجموعه") then
			return "sports_complex"
		end
		-- هیئت
		if mw.ustring.find(subtype, "هیئت") then
			return "board"
		end
	end

	----------------------------------------------------------------
	-- INFERENCE FROM FIELDS (اگر subtype هم نبود)
	----------------------------------------------------------------
	if args.established
		or args.manager
		or args.owner
		or args.president
		or args.ceo
		or args.stadium
		or args.capacity
		or args.facilities
		or args.services
		or (args.address and args.city)
	then
		-- اگر فیلدهای سازمانی وجود داشت → باشگاه/مجموعه
		if args.stadium or args.capacity then
			return "stadium"
		end
		return "club"
	end

	----------------------------------------------------------------
	-- SAFE FALLBACK
	----------------------------------------------------------------
	local defaultEntity = data.defaults.entity_type or "player"
	defaultEntity = entityAliases[defaultEntity] or defaultEntity

	if data.entities[defaultEntity] then
		return defaultEntity
	end

	return "player"
end
--------------------------------------------------------------------------------
-- TITLE
--------------------------------------------------------------------------------
local function getTitle(entity, args)
	if args.name then
		return args.name
	end
	local entityData =
	data.entities[entity]
	if entityData and entityData.title then
		return entityData.title
	end
	return data.meta.title
end
--------------------------------------------------------------------------------
-- IMAGE HANDLING
--------------------------------------------------------------------------------
local function buildImage(args)
	if not args.image then
		return nil
	end
	local width =
	args.image_width
	or DEFAULT_IMAGE_WIDTH
	local caption =
	args.caption
	or ""
	return {
		type = "image",
		image = args.image,
		size = width,
		caption = caption
	}
end
--------------------------------------------------------------------------------
-- FIELD BUILDER
--------------------------------------------------------------------------------
local function buildFields(layout, args)
	local fields = {}
	for _, item in ipairs(layout) do
		local label =
		item[1]
		local key =
		item[2]
		local value =
		clean(args[key])
		----------------------------------------------------------------
		-- ONLY ADD EXISTING VALUES
		----------------------------------------------------------------
		if value then
			table.insert(
			fields,
			{
				label = label,
				value = value
			}
			)
		end
	end
	return fields
end
--------------------------------------------------------------------------------
-- GROUP BUILDER
--------------------------------------------------------------------------------
local function buildGroups(entity, args)
	local groups = {}
	local entityData =
	data.entities[entity]
	if not entityData then
		return groups
	end
	----------------------------------------------------------------
	-- USE ONLY ENTITY-SPECIFIC LAYOUTS
	--
	-- IMPORTANT:
	-- "base" is NOT automatically added.
	-- It is displayed only when explicitly included
	-- in the entity's layouts.
	----------------------------------------------------------------
	for _, layoutName in ipairs(entityData.layouts or {}) do
		local layout =
		data.layouts[layoutName]
		if layout then
			local fields =
			buildFields(
			layout,
			args
			)
			----------------------------------------------------------------
			-- DO NOT DISPLAY EMPTY GROUPS
			----------------------------------------------------------------
			if #fields > 0 then
				local title =
				data.layoutTitles[layoutName]
				or layoutName
				table.insert(
				groups,
				{
					name = title,
					fields = fields
				}
				)
			end
		end
	end
	return groups
end
--------------------------------------------------------------------------------
-- MEDAL BUILDER
--------------------------------------------------------------------------------
local function buildMedals(args)
	local medals =
	clean(args.medaltemplates)
	if not medals then
		medals =
		clean(args.medals)
	end
	if not medals then
		return nil
	end
	local frame =
	mw.getCurrentFrame()
	local content =
	frame:expandTemplate{
		title = "Infobox medal templates",
		args = {
			medals = medals,
			title =
			args.medaltemplates_title
			or "",
			expand = "yes"
		}
	}
	content =
	clean(content)
	if not content then
		return nil
	end
	return content
end
--------------------------------------------------------------------------------
-- INFOBOX BUILDER
--------------------------------------------------------------------------------
local function buildInfobox(entity, args)
	local box = {}
	----------------------------------------------------------------
	-- TITLE
	----------------------------------------------------------------
	box.title =
	getTitle(
	entity,
	args
	)
	----------------------------------------------------------------
	-- IMAGE
	----------------------------------------------------------------
	local image =
	buildImage(args)
	if image then
		box.image = image
	end
	----------------------------------------------------------------
	-- GROUPS
	----------------------------------------------------------------
	box.groups =
	buildGroups(
	entity,
	args
	)
	----------------------------------------------------------------
	-- MEDALS
	----------------------------------------------------------------
	box.medals =
	buildMedals(args)
	return box
end
--------------------------------------------------------------------------------
-- RENDER VALUE
--------------------------------------------------------------------------------
local function renderValue(value)
	if type(value) == "table" then
		return table.concat(
		value,
		"، "
		)
	end
	return tostring(value)
end
--------------------------------------------------------------------------------
-- ESCAPE HTML
--------------------------------------------------------------------------------
local function escape(value)
	if value == nil then
		return ""
	end
	return mw.text.nowiki(
	tostring(value)
	)
end
--------------------------------------------------------------------------------
-- RENDER INFOBOX
--------------------------------------------------------------------------------
local function renderInfobox(box)
	local result = {}
	----------------------------------------------------------------
	-- OPEN TABLE
	----------------------------------------------------------------
	table.insert(
	result,
	'<table class="sport-infobox">'
	)
	----------------------------------------------------------------
	-- TITLE
	----------------------------------------------------------------
	if box.title then
		table.insert(
		result,
		'<tr class="sport-infobox-title">' ..
		'<th colspan="2">' ..
		box.title ..
		'</th></tr>'
		)
	end
	----------------------------------------------------------------
	-- IMAGE
	----------------------------------------------------------------
	if box.image then
		local image =
		box.image
		local file =
		image.image
		local size =
		image.size
		or DEFAULT_IMAGE_WIDTH
		local caption =
		image.caption
		or ""
		table.insert(
		result,
		'<tr>' ..
		'<td colspan="2" class="sport-infobox-image">' ..
		'[[File:' ..
		file ..
		'|' ..
		size ..
		']]'
		)
		if caption ~= "" then
			table.insert(
			result,
			'<div class="sport-infobox-caption">' ..
			caption ..
			'</div>'
			)
		end
		table.insert(
		result,
		'</td></tr>'
		)
	end
	----------------------------------------------------------------
	-- GROUPS
	----------------------------------------------------------------
	for _, group in ipairs(box.groups) do
		----------------------------------------------------------------
		-- GROUP HEADER
		----------------------------------------------------------------
		table.insert(
		result,
		'<tr class="sport-infobox-header">' ..
		'<th colspan="2">' ..
		group.name ..
		'</th></tr>'
		)
		----------------------------------------------------------------
		-- GROUP FIELDS
		----------------------------------------------------------------
		for _, field in ipairs(group.fields) do
			table.insert(
			result,
			'<tr>' ..
			'<th class="sport-infobox-label">' ..
			field.label ..
			'</th>' ..
			'<td class="sport-infobox-value">' ..
			renderValue(field.value) ..
			'</td>' ..
			'</tr>'
			)
		end
	end
	----------------------------------------------------------------
	-- MEDALS
	--
	-- IMPORTANT:
	-- Medals remain INSIDE the infobox table.
	----------------------------------------------------------------
	if box.medals then
		table.insert(
		result,
		'<tr>' ..
		'<td colspan="2" class="sport-infobox-medals">' ..
		box.medals ..
		'</td>' ..
		'</tr>'
		)
	end
	----------------------------------------------------------------
	-- CLOSE TABLE
	----------------------------------------------------------------
	table.insert(
	result,
	'</table>'
	)
	return table.concat(
	result,
	"\n"
	)
end
--------------------------------------------------------------------------------
-- PUBLIC FUNCTION
--------------------------------------------------------------------------------
function p.main(frame)
	----------------------------------------------------------------
	-- GET ARGUMENTS
	----------------------------------------------------------------
	local args =
	getArgs(frame)
	----------------------------------------------------------------
	-- NORMALIZE INPUT
	----------------------------------------------------------------
	args =
	normalize(args)
	----------------------------------------------------------------
	-- ENTITY
	----------------------------------------------------------------
	local entity =
	getEntity(args)
	----------------------------------------------------------------
	-- BUILD INFOBOX
	----------------------------------------------------------------
	local box =
	buildInfobox(
	entity,
	args
	)
	----------------------------------------------------------------
	-- RENDER
	----------------------------------------------------------------
	return renderInfobox(box)
end
--------------------------------------------------------------------------------
-- TEMPLATE ENTRY
--------------------------------------------------------------------------------
function p.infobox(frame)
	return p.main(frame)
end
--------------------------------------------------------------------------------
-- DEBUG FUNCTION
--------------------------------------------------------------------------------
function p.test(frame)
	local args =
	getArgs(frame)
	----------------------------------------------------------------
	-- NORMALIZE
	----------------------------------------------------------------
	args =
	normalize(args)
	----------------------------------------------------------------
	-- ENTITY
	----------------------------------------------------------------
	local entity =
	getEntity(args)
	----------------------------------------------------------------
	-- ENTITY DATA
	----------------------------------------------------------------
	local entityData =
	data.entities[entity]
	if not entityData then
		return "Entity not found: " .. tostring(entity)
	end
	----------------------------------------------------------------
	-- RESULT
	----------------------------------------------------------------
	local result = {}
	table.insert(
	result,
	"Entity: " ..
	entity
	)
	table.insert(
	result,
	"Title: " ..
	tostring(
	entityData.title
	)
	)
	table.insert(
	result,
	"Layouts: " ..
	table.concat(
	entityData.layouts or {},
	", "
	)
	)
	----------------------------------------------------------------
	-- DEBUG TYPE
	----------------------------------------------------------------
	table.insert(
	result,
	"Subtype: " ..
	tostring(
	args.subtype
	or "NOT FOUND"
	)
	)
	----------------------------------------------------------------
	-- DEBUG COACH
	----------------------------------------------------------------
	table.insert(
	result,
	"Coach: " ..
	tostring(
	args.coach
	or "NOT FOUND"
	)
	)
	----------------------------------------------------------------
	-- DEBUG MEDALS
	----------------------------------------------------------------
	table.insert(
	result,
	"Medals: " ..
	tostring(
	args.medaltemplates
	or args.medals
	or "NOT FOUND"
	)
	)
	return table.concat(
	result,
	"\n"
	)
end
--------------------------------------------------------------------------------
-- GET ENTITY LIST
--------------------------------------------------------------------------------
function p.entities()
	local result = {}
	for key, value in pairs(data.entities) do
		table.insert(
		result,
		key ..
		" : " ..
		tostring(
		value.title
		)
		)
	end
	table.sort(result)
	return table.concat(
	result,
	"\n"
	)
end
--------------------------------------------------------------------------------
-- GET VERSION
--------------------------------------------------------------------------------
function p.version()
	return
	data.version.name ..
	" v" ..
	data.version.major ..
	"." ..
	data.version.minor
end
--------------------------------------------------------------------------------
-- EXPORT
--------------------------------------------------------------------------------
return p