پودمان: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" | |||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
-- 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)) | |||
local cleanValue = | local cleanValue = | ||
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 | |||
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 | athlete = "player", | ||
athlete | ["بازیکن"] = "player", | ||
["ورزشکار"] = "player", | |||
["بازیکن"] | coach = "coach", | ||
["ورزشکار"] | ["مربی"] = "coach", | ||
referee = "referee", | |||
coach | ["داور"] = "referee", | ||
["مربی"] | manager = "manager", | ||
["مدیر ورزشی"] = "manager", | |||
referee | |||
["داور"] | |||
manager | |||
["مدیر ورزشی"] | |||
-- Clubs | -- Clubs | ||
club = "club", | |||
club | sports_club = "club", | ||
sports_club | sport_club = "club", | ||
sport_club | ["باشگاه"] = "club", | ||
["باشگاه"] | |||
["باشگاه ورزشی"] = "club", | ["باشگاه ورزشی"] = "club", | ||
-- Academy | -- Academy | ||
academy = "academy", | |||
academy | ["آکادمی"] = "academy", | ||
["آکادمی"] | |||
["آکادمی ورزشی"] = "academy", | ["آکادمی ورزشی"] = "academy", | ||
-- Facilities | -- Facilities | ||
stadium = "stadium", | |||
stadium | ["ورزشگاه"] = "stadium", | ||
["ورزشگاه"] | gym = "gym", | ||
gymnasium = "gym", | |||
gym | ["سالن"] = "gym", | ||
gymnasium | ["سالن ورزشی"] = "gym", | ||
["سالن"] | pool = "pool", | ||
["سالن ورزشی"] | swimming_pool = "pool", | ||
["استخر"] = "pool", | |||
pool | zurkhaneh = "zurkhaneh", | ||
swimming_pool | ["زورخانه"] = "zurkhaneh", | ||
["استخر"] | sports_school = "sports_school", | ||
zurkhaneh | |||
["زورخانه"] | |||
sports_school | |||
["مدرسه ورزشی"] = "sports_school", | ["مدرسه ورزشی"] = "sports_school", | ||
sports_complex = "sports_complex", | |||
sports_complex | |||
["مجموعه ورزشی"] = "sports_complex", | ["مجموعه ورزشی"] = "sports_complex", | ||
facility = "facility", | |||
facility | ["مجموعه"] = "facility", | ||
["مجموعه"] | |||
-- Organization / Board | -- Organization / Board | ||
board = "board", | |||
board | sports_board = "board", | ||
sports_board | ["هیئت"] = "board", | ||
["هیئت"] | ["هیئت ورزشی"] = "board", | ||
["هیئت ورزشی"] | |||
-- 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 = | |||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
-- DEFAULT ENTITY | -- DEFAULT ENTITY | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
if not entity then | if not entity then | ||
entity = data.defaults.entity_type | |||
entity = | |||
end | end | ||
| خط ۲۰۴: | خط ۱۳۲: | ||
-- NORMALIZE ENTITY | -- NORMALIZE ENTITY | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
entity = entityAliases[entity] or entity | |||
entity = | |||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
-- VALID ENTITY | -- VALID ENTITY | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
if data.entities[entity] then | if data.entities[entity] then | ||
return entity | |||
end | |||
return | ---------------------------------------------------------------- | ||
-- 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 | ||
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] | |||
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 | |||
or DEFAULT_IMAGE_WIDTH | |||
local caption = | local caption = | ||
args.caption | |||
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] | |||
local key = | local key = | ||
item[2] | |||
local value = | local value = | ||
clean(args[key]) | |||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
-- ONLY ADD EXISTING VALUES | -- ONLY ADD EXISTING VALUES | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
if value then | if value then | ||
table.insert( | table.insert( | ||
fields, | |||
{ | |||
label = label, | |||
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] | |||
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] | |||
if layout then | if layout then | ||
local fields = | local fields = | ||
buildFields( | |||
layout, | |||
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] | |||
or layoutName | |||
table.insert( | table.insert( | ||
groups, | |||
{ | |||
name = title, | |||
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) | |||
if not medals then | if not medals then | ||
medals = | 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() | |||
local content = | local content = | ||
frame:expandTemplate{ | |||
title = "Infobox medal templates", | |||
args = { | |||
medals = medals, | |||
title = | |||
args.medaltemplates_title | |||
or "", | |||
expand = "yes" | |||
} | } | ||
} | |||
content = | 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( | |||
entity, | |||
args | |||
) | |||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
-- IMAGE | -- IMAGE | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
local image = | local image = | ||
buildImage(args) | |||
if image then | if image then | ||
box.image = image | box.image = image | ||
end | end | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
-- GROUPS | -- GROUPS | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
box.groups = | box.groups = | ||
buildGroups( | |||
entity, | |||
args | |||
) | |||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
-- MEDALS | -- MEDALS | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
box.medals = | box.medals = | ||
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, | |||
"، " | |||
) | ) | ||
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) | |||
) | ) | ||
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, | |||
'<table class="sport-infobox">' | |||
) | ) | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
-- TITLE | -- TITLE | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
if box.title then | if box.title then | ||
table.insert( | table.insert( | ||
result, | |||
'<tr class="sport-infobox-title">' .. | |||
'<th colspan="2">' .. | |||
box.title .. | |||
'</th></tr>' | |||
) | ) | ||
end | end | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
-- IMAGE | -- IMAGE | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
if box.image then | if box.image then | ||
local image = | local image = | ||
box.image | |||
local file = | local file = | ||
image.image | |||
local size = | local size = | ||
image.size | |||
or DEFAULT_IMAGE_WIDTH | |||
local caption = | local caption = | ||
image.caption | |||
or "" | |||
table.insert( | table.insert( | ||
result, | |||
'<tr>' .. | |||
'<td colspan="2" class="sport-infobox-image">' .. | |||
'[[File:' .. | |||
file .. | |||
'|' .. | |||
size .. | |||
']]' | |||
) | ) | ||
if caption ~= "" then | if caption ~= "" then | ||
table.insert( | table.insert( | ||
result, | |||
'<div class="sport-infobox-caption">' .. | |||
caption .. | |||
'</div>' | |||
) | ) | ||
end | end | ||
table.insert( | table.insert( | ||
result, | |||
'</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, | |||
'<tr class="sport-infobox-header">' .. | |||
'<th colspan="2">' .. | |||
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, | |||
'<tr>' .. | |||
'<th class="sport-infobox-label">' .. | |||
field.label .. | |||
'</th>' .. | |||
'<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, | |||
'<tr>' .. | |||
'<td colspan="2" class="sport-infobox-medals">' .. | |||
box.medals .. | |||
'</td>' .. | |||
'</tr>' | |||
) | ) | ||
end | end | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
-- CLOSE TABLE | -- CLOSE TABLE | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
table.insert( | table.insert( | ||
result, | |||
'</table>' | |||
) | ) | ||
return table.concat( | return table.concat( | ||
result, | |||
"\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) | |||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
-- NORMALIZE INPUT | -- NORMALIZE INPUT | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
args = | args = | ||
normalize(args) | |||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
-- ENTITY | -- ENTITY | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
local entity = | local entity = | ||
getEntity(args) | |||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
-- BUILD INFOBOX | -- BUILD INFOBOX | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
local box = | local box = | ||
buildInfobox( | |||
entity, | |||
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) | |||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
-- NORMALIZE | -- NORMALIZE | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
args = | args = | ||
normalize(args) | |||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
-- ENTITY | -- ENTITY | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
local entity = | local entity = | ||
getEntity(args) | |||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
-- ENTITY DATA | -- ENTITY DATA | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
local entityData = | local entityData = | ||
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, | |||
"Entity: " .. | |||
entity | |||
) | ) | ||
table.insert( | table.insert( | ||
result, | |||
"Title: " .. | |||
tostring( | |||
entityData.title | |||
) | |||
) | ) | ||
table.insert( | table.insert( | ||
result, | |||
"Layouts: " .. | |||
table.concat( | |||
entityData.layouts or {}, | |||
", " | |||
) | |||
) | ) | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
-- DEBUG TYPE | -- DEBUG TYPE | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
table.insert( | table.insert( | ||
result, | |||
"Subtype: " .. | |||
tostring( | |||
args.subtype | |||
or "NOT FOUND" | |||
) | |||
) | ) | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
-- DEBUG COACH | -- DEBUG COACH | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
table.insert( | table.insert( | ||
result, | |||
"Coach: " .. | |||
tostring( | |||
args.coach | |||
or "NOT FOUND" | |||
) | |||
) | ) | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
-- DEBUG MEDALS | -- DEBUG MEDALS | ||
---------------------------------------------------------------- | ---------------------------------------------------------------- | ||
table.insert( | table.insert( | ||
result, | |||
"Medals: " .. | |||
tostring( | |||
args.medaltemplates | |||
or args.medals | |||
or "NOT FOUND" | |||
) | |||
) | ) | ||
return table.concat( | return table.concat( | ||
result, | |||
"\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, | |||
key .. | |||
" : " .. | |||
tostring( | |||
value.title | |||
) | |||
) | ) | ||
end | end | ||
table.sort(result) | table.sort(result) | ||
return table.concat( | return table.concat( | ||
result, | |||
"\n" | |||
) | ) | ||
end | end | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
-- GET VERSION | -- GET VERSION | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
function p.version() | function p.version() | ||
return | return | ||
data.version.name .. | |||
" v" .. | |||
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