Module:GetEffect: Difference between revisions
Appearance
imported>Ziebster No edit summary |
imported>Ziebster No edit summary |
||
| Line 13: | Line 13: | ||
local effect = content:match('|%s*effects%s*=%s*(.-)\n%s*|') or content:match('|%s*effects%s*=%s*(.-)%s*}}') or '' | local effect = content:match('|%s*effects%s*=%s*(.-)\n%s*|') or content:match('|%s*effects%s*=%s*(.-)%s*}}') or '' | ||
effect = mw.text.trim(effect) | effect = mw.text.trim(effect) | ||
if not statName or statName == '' then | if not statName or statName == '' then | ||
| Line 22: | Line 21: | ||
-- Normalize statName for case-insensitive matching | -- Normalize statName for case-insensitive matching | ||
local normalizedStat = statName:lower() | local normalizedStat = statName:lower() | ||
local debugOutput = 'Debug Info:\n' | |||
debugOutput = debugOutput .. 'Extracted effect: ' .. effect .. '\n' | |||
debugOutput = debugOutput .. 'Normalized stat: ' .. normalizedStat .. '\n' | |||
-- Split the effect into comma-separated parts | -- Split the effect into comma-separated parts | ||
| Line 27: | Line 30: | ||
for _, part in ipairs(parts) do | for _, part in ipairs(parts) do | ||
part = mw.text.trim(part) | part = mw.text.trim(part) | ||
debugOutput = debugOutput .. 'Part: ' .. part .. '\n' | |||
-- First, try range pattern: +number stat to <number (optional (paren)) | -- First, try range pattern: +number stat to <number (optional (paren)) | ||
local num1, stat, less_than, num2, paren = part:match('^([+-]?[%d%.]+)%s+([%w%.]+)%s+to%s*(<)?([%d%.]+)%s*(%b())?$') | local num1, stat, less_than, num2, paren = part:match('^([+-]?[%d%.]+)%s+([%w%.]+)%s+to%s*(<)?([%d%.]+)%s*(%b())?$') | ||
| Line 40: | Line 45: | ||
return mw.text.trim(range) | return mw.text.trim(range) | ||
end | end | ||
debugOutput = debugOutput .. 'Range match: num1=' .. num1 .. ', stat=' .. stat .. ', less_than=' .. (less_than or '') .. ', num2=' .. num2 .. ', paren=' .. (paren or '') .. '\n' | |||
else | |||
debugOutput = debugOutput .. 'Range match: no match\n' | |||
end | end | ||
-- If not, try standard pattern: +number%? stat (e.g., +15 W.PWR, +15% CRIT, +1.5 Speed) | -- If not, 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+(.*)$') | ||
| Line 52: | Line 61: | ||
return num | return num | ||
end | end | ||
debugOutput = debugOutput .. 'Standard match: num=' .. num .. ', percent=' .. (percent or '') .. ', key=' .. key .. '\n' | |||
else | |||
debugOutput = debugOutput .. 'Standard match: no match\n' | |||
end | end | ||
end | end | ||
-- If not found, return empty string | -- If not found, return debug output instead of empty string | ||
return | return debugOutput | ||
end | end | ||
return p | return p | ||
Revision as of 20:26, 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()
local debugOutput = 'Debug Info:\n'
debugOutput = debugOutput .. 'Extracted effect: ' .. effect .. '\n'
debugOutput = debugOutput .. 'Normalized stat: ' .. normalizedStat .. '\n'
-- Split the effect into comma-separated parts
local parts = mw.text.split(effect, ',')
for _, part in ipairs(parts) do
part = mw.text.trim(part)
debugOutput = debugOutput .. 'Part: ' .. part .. '\n'
-- First, try range pattern: +number stat to <number (optional (paren))
local num1, stat, less_than, num2, paren = part:match('^([+-]?[%d%.]+)%s+([%w%.]+)%s+to%s*(<)?([%d%.]+)%s*(%b())?$')
if num1 and stat and num2 then
local normStat = stat:lower()
if normStat == normalizedStat then
-- Strip leading '+' from num1 if present
if num1:sub(1,1) == '+' then
num1 = num1:sub(2)
end
-- Reconstruct the range: "num1 to <num2" (less_than is optional)
local range = num1 .. ' to ' .. (less_than or '') .. num2
return mw.text.trim(range)
end
debugOutput = debugOutput .. 'Range match: num1=' .. num1 .. ', stat=' .. stat .. ', less_than=' .. (less_than or '') .. ', num2=' .. num2 .. ', paren=' .. (paren or '') .. '\n'
else
debugOutput = debugOutput .. 'Range match: no match\n'
end
-- If not, 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
return num
end
debugOutput = debugOutput .. 'Standard match: num=' .. num .. ', percent=' .. (percent or '') .. ', key=' .. key .. '\n'
else
debugOutput = debugOutput .. 'Standard match: no match\n'
end
end
-- If not found, return debug output instead of empty string
return debugOutput
end
return p