Module:GetEffect: Difference between revisions
Appearance
imported>Ziebster No edit summary |
imported>Ziebster No edit summary |
||
| Line 26: | Line 26: | ||
for _, part in ipairs(parts) do | for _, part in ipairs(parts) do | ||
part = mw.text.trim(part) | part = mw.text.trim(part) | ||
-- | -- Try standard pattern: +number%? stat (e.g., +15 W.PWR, +15% CRIT, +1.5 Speed) | ||
local num, percent, key = part:match('^([+-]?[%d%.]+)(%%?)%s+(.*)$') | local num, percent, key = part:match('^([+-]?[%d%.]+)(%%?)%s+(.*)$') | ||
if num and key then | if num and key then | ||
| Line 54: | Line 40: | ||
end | end | ||
return num | return num | ||
end | |||
-- Check if it's a range format in the key: stat to <number (paren) | |||
local range_stat, range_part, paren = key:match('^([%w%.]+)%s+(to%s*<[%d%.]+)%s*(%b())$') | |||
if range_stat then | |||
local normRangeStat = range_stat:lower() | |||
if normRangeStat == normalizedStat then | |||
-- Strip leading '+' from num if present | |||
if num:sub(1,1) == '+' then | |||
num = num:sub(2) | |||
end | |||
-- Reconstruct the range: "num to <num2" (ignore paren) | |||
local range = num .. ' ' .. range_part | |||
return mw.text.trim(range) | |||
end | |||
end | end | ||
end | end | ||
Revision as of 21:05, 9 February 2026
local p = {}
function p.getEffect(frame)
local pageName = frame.args[1] or mw.title.getCurrentTitle().text
local statName = frame.args[2]
local page = mw.title.new(pageName)
if not page then
return 'Page not found'
end
local content = page:getContent()
local effect = content:match('|%s*effects%s*=%s*(.-)\n%s*|') or content:match('|%s*effects%s*=%s*(.-)%s*}}') or ''
effect = mw.text.trim(effect)
if not statName or statName == '' then
-- Return full effect if no stat specified
return effect
end
-- Normalize statName for case-insensitive matching
local normalizedStat = statName:lower()
-- Split the effect into comma-separated parts
local parts = mw.text.split(effect, ',')
for _, part in ipairs(parts) do
part = mw.text.trim(part)
-- Try standard pattern: +number%? stat (e.g., +15 W.PWR, +15% CRIT, +1.5 Speed)
local num, percent, key = part:match('^([+-]?[%d%.]+)(%%?)%s+(.*)$')
if num and key then
local normKey = mw.text.trim(key):lower()
if normKey == normalizedStat then
-- Strip leading '+' if present
if num:sub(1,1) == '+' then
num = num:sub(2)
end
-- Append % if it existed
if percent ~= '' then
num = num .. percent
end
return num
end
-- Check if it's a range format in the key: stat to <number (paren)
local range_stat, range_part, paren = key:match('^([%w%.]+)%s+(to%s*<[%d%.]+)%s*(%b())$')
if range_stat then
local normRangeStat = range_stat:lower()
if normRangeStat == normalizedStat then
-- Strip leading '+' from num if present
if num:sub(1,1) == '+' then
num = num:sub(2)
end
-- Reconstruct the range: "num to <num2" (ignore paren)
local range = num .. ' ' .. range_part
return mw.text.trim(range)
end
end
end
end
-- If not found, return empty string
return ''
end
return p