Modül:RolBox: Revizyonlar arasındaki fark
Değişiklik özeti yok |
Değişiklik özeti yok |
||
| (Bir diğer kullanıcıdan 2 ara revizyon gösterilmiyor) | |||
| 7. satır: | 7. satır: | ||
end | end | ||
return t | return t | ||
end | |||
-- Açıklamada kritik/ikincil kelimeleri otomatik [[link]] haline getir | |||
local function autoLink(desc, words) | |||
if desc == "" then | |||
return desc | |||
end | |||
-- Küçük-büyük harf eşitleme | |||
for _, word in ipairs(words) do | |||
local escaped = mw.ustring.gsub(word, "([%%%-%^%$%(%)%.%[%]%*%+%-%?])", "%%%1") | |||
-- kelime sınırları: tam eşleşme olsun | |||
desc = mw.ustring.gsub( | |||
desc, | |||
"([^%wığüşöçİĞÜŞÖÇ])(" .. escaped .. ")([^%wığüşöçİĞÜŞÖÇ])", | |||
"%1[[%2]]%3" | |||
) | |||
-- kelime başı/sonu için özel tahminler | |||
-- satır başı | |||
desc = mw.ustring.gsub(desc, "^(" .. escaped .. ")([^%wığüşöçİĞÜŞÖÇ])", "[[%1]]%2") | |||
-- satır sonu | |||
desc = mw.ustring.gsub(desc, "([^%wığüşöçİĞÜŞÖÇ])(" .. escaped .. ")$", "%1[[%2]]") | |||
end | |||
return desc | |||
end | |||
local function buildBadges(list, baseClass) | |||
local html = "" | |||
for _, v in ipairs(list) do | |||
html = html .. string.format('<span class="%s">%s</span>', baseClass, v) | |||
end | |||
return html | |||
end | end | ||
function p.render(frame) | function p.render(frame) | ||
local | local parent = frame:getParent() or frame | ||
local args = parent.args | |||
local name = args["ad"] or "" | |||
local code = args["kod"] or "" | |||
local duty = args["gorev"] or "" | |||
local position = args["pozisyon"] or "" | |||
local desc = args["aciklama"] or "" | |||
local critical = args["kritik"] or "" | |||
local secondary = args["ikincil"] or "" | |||
local icons = args["simgeler"] or "" | |||
local | local criticalList = critical ~= "" and splitList(critical) or {} | ||
local | local secondaryList = secondary ~= "" and splitList(secondary) or {} | ||
local iconList = icons ~= "" and splitList(icons) or {} | |||
local | |||
local | -- Otomatik linklenecek tüm kelimeler | ||
local autoWords = {} | |||
for _,v in ipairs(criticalList) do table.insert(autoWords, v) end | |||
for _,v in ipairs(secondaryList) do table.insert(autoWords, v) end | |||
-- Açıklamaya otomatik link uygulama | |||
if desc ~= "" then | |||
desc = autoLink(desc, autoWords) | |||
end | end | ||
local | -- Görev badge sınıfı | ||
local dutyClass = "fm-rolecard__duty" | |||
local dl = mw.ustring.lower(duty or "") | |||
if dl ~= "" then | |||
if dl:find("support") or dl:find("destek") then | |||
dutyClass = dutyClass .. " fm-rolecard__duty--support" | |||
elseif dl:find("attack") or dl:find("hücum") then | |||
dutyClass = dutyClass .. " fm-rolecard__duty--attack" | |||
elseif dl:find("defend") or dl:find("savunma") then | |||
dutyClass = dutyClass .. " fm-rolecard__duty--defend" | |||
end | |||
end | end | ||
local | local criticalHtml = buildBadges(criticalList, "fm-rolecard__badge fm-rolecard__badge--critical") | ||
if | local secondaryHtml = buildBadges(secondaryList, "fm-rolecard__badge fm-rolecard__badge--secondary") | ||
<div class="fm- | -- simgeler | ||
<div class="fm- | local iconsHtml = "" | ||
<div class="fm- | for _, v in ipairs(iconList) do | ||
iconsHtml = iconsHtml .. string.format('<span class="fm-rolecard__icon">%s</span>', v) | |||
end | |||
-- meta satırı | |||
local metaLine = "" | |||
local parts = {} | |||
if code ~= "" then table.insert(parts, code) end | |||
if position ~= "" then table.insert(parts, position) end | |||
if #parts > 0 then | |||
metaLine = '<div class="fm-rolecard__meta">' .. table.concat(parts, " • ") .. '</div>' | |||
end | |||
local descHtml = "" | |||
if desc ~= "" then | |||
descHtml = string.format('<div class="fm-rolecard__description">%s</div>', desc) | |||
end | |||
local criticalBlock = "" | |||
if critical ~= "" then | |||
criticalBlock = string.format([[ | |||
<div class="fm-rolecard__section"> | |||
<div class="fm-rolecard__section-title">Kritik Özellikler</div> | |||
<div class="fm-rolecard__badge-list">%s</div> | |||
</div> | </div> | ||
]], | ]], criticalHtml) | ||
end | end | ||
local | local secondaryBlock = "" | ||
if | if secondary ~= "" then | ||
secondaryBlock = string.format([[ | |||
<div class="fm- | <div class="fm-rolecard__section"> | ||
]], | <div class="fm-rolecard__section-title">İkincil Özellikler</div> | ||
<div class="fm-rolecard__badge-list">%s</div> | |||
</div> | |||
]], secondaryHtml) | |||
end | end | ||
local | local iconsBlock = "" | ||
if icons ~= "" then | |||
iconsBlock = string.format([[ | |||
<div class="fm-rolecard__section fm-rolecard__section--icons"> | |||
<div class="fm-rolecard__badge-list">%s</div> | |||
</div> | |||
]], iconsHtml) | |||
end | end | ||
local html = string.format([[ | |||
<div class="fm-rolecard"> | <div class="fm-rolecard"> | ||
<div class="fm- | <div class="fm-rolecard__header"> | ||
<div class="fm- | <div class="fm-rolecard__title-group"> | ||
<div class=" | <div class="fm-rolecard__name">%s</div> | ||
%s | |||
</div> | |||
<div class="%s">%s</div> | |||
</div> | </div> | ||
%s | %s | ||
%s | |||
%s | |||
%s | |||
</div> | </div> | ||
]], | ]], | ||
name, | |||
metaLine, | |||
dutyClass, duty, | |||
descHtml, | |||
criticalBlock, | |||
secondaryBlock, | |||
iconsBlock | |||
) | ) | ||
return html | |||
end | end | ||
return p | return p | ||
08.32, 4 Aralık 2025 itibarı ile sayfanın şu anki hâli
Bu modül için bir Modül:RolBox/belge belgelendirmesi oluşturabilirsiniz
local p = {}
local function splitList(str)
local t = {}
for item in string.gmatch(str, "([^,]+)") do
table.insert(t, mw.text.trim(item))
end
return t
end
-- Açıklamada kritik/ikincil kelimeleri otomatik [[link]] haline getir
local function autoLink(desc, words)
if desc == "" then
return desc
end
-- Küçük-büyük harf eşitleme
for _, word in ipairs(words) do
local escaped = mw.ustring.gsub(word, "([%%%-%^%$%(%)%.%[%]%*%+%-%?])", "%%%1")
-- kelime sınırları: tam eşleşme olsun
desc = mw.ustring.gsub(
desc,
"([^%wığüşöçİĞÜŞÖÇ])(" .. escaped .. ")([^%wığüşöçİĞÜŞÖÇ])",
"%1[[%2]]%3"
)
-- kelime başı/sonu için özel tahminler
-- satır başı
desc = mw.ustring.gsub(desc, "^(" .. escaped .. ")([^%wığüşöçİĞÜŞÖÇ])", "[[%1]]%2")
-- satır sonu
desc = mw.ustring.gsub(desc, "([^%wığüşöçİĞÜŞÖÇ])(" .. escaped .. ")$", "%1[[%2]]")
end
return desc
end
local function buildBadges(list, baseClass)
local html = ""
for _, v in ipairs(list) do
html = html .. string.format('<span class="%s">%s</span>', baseClass, v)
end
return html
end
function p.render(frame)
local parent = frame:getParent() or frame
local args = parent.args
local name = args["ad"] or ""
local code = args["kod"] or ""
local duty = args["gorev"] or ""
local position = args["pozisyon"] or ""
local desc = args["aciklama"] or ""
local critical = args["kritik"] or ""
local secondary = args["ikincil"] or ""
local icons = args["simgeler"] or ""
local criticalList = critical ~= "" and splitList(critical) or {}
local secondaryList = secondary ~= "" and splitList(secondary) or {}
local iconList = icons ~= "" and splitList(icons) or {}
-- Otomatik linklenecek tüm kelimeler
local autoWords = {}
for _,v in ipairs(criticalList) do table.insert(autoWords, v) end
for _,v in ipairs(secondaryList) do table.insert(autoWords, v) end
-- Açıklamaya otomatik link uygulama
if desc ~= "" then
desc = autoLink(desc, autoWords)
end
-- Görev badge sınıfı
local dutyClass = "fm-rolecard__duty"
local dl = mw.ustring.lower(duty or "")
if dl ~= "" then
if dl:find("support") or dl:find("destek") then
dutyClass = dutyClass .. " fm-rolecard__duty--support"
elseif dl:find("attack") or dl:find("hücum") then
dutyClass = dutyClass .. " fm-rolecard__duty--attack"
elseif dl:find("defend") or dl:find("savunma") then
dutyClass = dutyClass .. " fm-rolecard__duty--defend"
end
end
local criticalHtml = buildBadges(criticalList, "fm-rolecard__badge fm-rolecard__badge--critical")
local secondaryHtml = buildBadges(secondaryList, "fm-rolecard__badge fm-rolecard__badge--secondary")
-- simgeler
local iconsHtml = ""
for _, v in ipairs(iconList) do
iconsHtml = iconsHtml .. string.format('<span class="fm-rolecard__icon">%s</span>', v)
end
-- meta satırı
local metaLine = ""
local parts = {}
if code ~= "" then table.insert(parts, code) end
if position ~= "" then table.insert(parts, position) end
if #parts > 0 then
metaLine = '<div class="fm-rolecard__meta">' .. table.concat(parts, " • ") .. '</div>'
end
local descHtml = ""
if desc ~= "" then
descHtml = string.format('<div class="fm-rolecard__description">%s</div>', desc)
end
local criticalBlock = ""
if critical ~= "" then
criticalBlock = string.format([[
<div class="fm-rolecard__section">
<div class="fm-rolecard__section-title">Kritik Özellikler</div>
<div class="fm-rolecard__badge-list">%s</div>
</div>
]], criticalHtml)
end
local secondaryBlock = ""
if secondary ~= "" then
secondaryBlock = string.format([[
<div class="fm-rolecard__section">
<div class="fm-rolecard__section-title">İkincil Özellikler</div>
<div class="fm-rolecard__badge-list">%s</div>
</div>
]], secondaryHtml)
end
local iconsBlock = ""
if icons ~= "" then
iconsBlock = string.format([[
<div class="fm-rolecard__section fm-rolecard__section--icons">
<div class="fm-rolecard__badge-list">%s</div>
</div>
]], iconsHtml)
end
local html = string.format([[
<div class="fm-rolecard">
<div class="fm-rolecard__header">
<div class="fm-rolecard__title-group">
<div class="fm-rolecard__name">%s</div>
%s
</div>
<div class="%s">%s</div>
</div>
%s
%s
%s
%s
</div>
]],
name,
metaLine,
dutyClass, duty,
descHtml,
criticalBlock,
secondaryBlock,
iconsBlock
)
return html
end
return p