Module:RestrictionChecker: Difference between revisions
From Terra Invicta Official Wiki
No edit summary |
Added support for inequality checks |
||
| (8 intermediate revisions by one other user not shown) | |||
| Line 4: | Line 4: | ||
local CommaSplitModule = require('Module:CommaSplit') | local CommaSplitModule = require('Module:CommaSplit') | ||
local StringReplaceModule = require('Module:StringReplace') | |||
local sreplace = StringReplaceModule.replace | |||
local slen = string.len | local slen = string.len | ||
local sfind = string.find | local sfind = string.find | ||
| Line 13: | Line 14: | ||
---@return true if all restrictions pass | ---@return true if all restrictions pass | ||
function p.AllPass(restrictionsTable, dataRow) | function p.AllPass(restrictionsTable, dataRow) | ||
if not restrictionsTable or restrictionsTable == '' then | |||
return true | |||
end | |||
local passesAllRestrictions = true | local passesAllRestrictions = true | ||
for _, restrictionsRowText in ipairs(restrictionsTable) do -- Consider each restrictionsTable row one by one: | for _, restrictionsRowText in ipairs(restrictionsTable) do -- Consider each restrictionsTable row one by one: | ||
| Line 19: | Line 23: | ||
if restrictionsRow[1] == 'Match' then | if restrictionsRow[1] == 'Match' then | ||
if dataRow[restrictionsRow[2]] ~= restrictionsRow[3] then | if dataRow[restrictionsRow[2]] ~= restrictionsRow[3] then | ||
passesAllRestrictions = false | |||
end | |||
elseif restrictionsRow[1] == 'Match Any' then | |||
local foundMatch = false | |||
for i = 3, 100 do | |||
if dataRow[restrictionsRow[2]] == restrictionsRow[i] then | |||
foundMatch = true | |||
end | |||
end | |||
if not foundMatch then | |||
passesAllRestrictions = false | passesAllRestrictions = false | ||
end | end | ||
| Line 31: | Line 45: | ||
elseif restrictionsRow[1] == 'In List' then | elseif restrictionsRow[1] == 'In List' then | ||
local inList = false | local inList = false | ||
local found = {} | |||
if sfind(restrictionsRow[2],'{i}',1,true) then | |||
found[1] = true | |||
end | |||
if sfind(restrictionsRow[2],'{j}',1,true) then | |||
found[2] = true | |||
end | |||
if sfind(restrictionsRow[2],'{k}',1,true) then | |||
found[3] = true | |||
end | |||
for i = 0, 100 do | for i = 0, 100 do | ||
if | if inList then | ||
break | break | ||
end | |||
inList = true | local entry = '' | ||
if found[1] then | |||
entry = sreplace(restrictionsRow[2],'{i}',i) | |||
else | |||
entry = restrictionsRow[2] .. '/' .. i | |||
end | |||
if found[2] then | |||
for j = 0, 100 do | |||
if inList then | |||
break | |||
end | |||
entry = sreplace(entry,'{j}',j) | |||
if found[3] then | |||
for k = 0, 100 do | |||
if inList then | |||
break | |||
end | |||
entry = sreplace(entry,'{k}',k) | |||
if not dataRow[entry] or dataRow[entry] == '' then | |||
break | |||
elseif dataRow[entry] == restrictionsRow[3] then | |||
inList = true | |||
break | |||
end | |||
end | |||
else | |||
if not dataRow[entry] or dataRow[entry] == '' then | |||
break | |||
elseif dataRow[entry] == restrictionsRow[3] then | |||
inList = true | |||
break | |||
end | |||
end | |||
end | |||
else | |||
if not dataRow[entry] or dataRow[entry] == '' then | |||
break | |||
elseif dataRow[entry] == restrictionsRow[3] then | |||
inList = true | |||
break | |||
end | |||
end | end | ||
end | end | ||
| Line 43: | Line 107: | ||
elseif restrictionsRow[1] == 'Not In List' then | elseif restrictionsRow[1] == 'Not In List' then | ||
local inList = false | local inList = false | ||
local found = {} | |||
if sfind(restrictionsRow[2],'{i}',1,true) then | |||
found[1] = true | |||
end | |||
if sfind(restrictionsRow[2],'{j}',1,true) then | |||
found[2] = true | |||
end | |||
if sfind(restrictionsRow[2],'{k}',1,true) then | |||
found[3] = true | |||
end | |||
for i = 0, 100 do | for i = 0, 100 do | ||
if | if inList then | ||
break | break | ||
end | |||
inList = true | local entry = '' | ||
if found[1] then | |||
entry = sreplace(restrictionsRow[2],'{i}',i) | |||
else | |||
entry = restrictionsRow[2] .. '/' .. i | |||
end | |||
if found[2] then | |||
for j = 0, 100 do | |||
if inList then | |||
break | |||
end | |||
entry = sreplace(entry,'{j}',j) | |||
if found[3] then | |||
for k = 0, 100 do | |||
if inList then | |||
break | |||
end | |||
entry = sreplace(entry,'{k}',k) | |||
if not dataRow[entry] or dataRow[entry] == '' then | |||
break | |||
elseif dataRow[entry] == restrictionsRow[3] then | |||
inList = true | |||
break | |||
end | |||
end | |||
else | |||
if not dataRow[entry] or dataRow[entry] == '' then | |||
break | |||
elseif dataRow[entry] == restrictionsRow[3] then | |||
inList = true | |||
break | |||
end | |||
end | |||
end | |||
else | |||
if not dataRow[entry] or dataRow[entry] == '' then | |||
break | |||
elseif dataRow[entry] == restrictionsRow[3] then | |||
inList = true | |||
break | |||
end | |||
end | end | ||
end | end | ||
| Line 53: | Line 167: | ||
passesAllRestrictions = false | passesAllRestrictions = false | ||
end | end | ||
elseif restrictionsRow[1] == 'Greater Than' then | |||
local dataVal = tonumber(dataRow[restrictionsRow[2]]) | |||
local compareVal = tonumber(restrictionsRow[3]) | |||
if dataVal and compareVal then --both are numeric | |||
if dataVal <= compareVal then | |||
passesAllRestrictions = false | |||
end | |||
else | |||
passesAllRestrictions = false | |||
end | |||
elseif restrictionsRow[1] == 'Greater Or Equal' then | |||
local dataVal = tonumber(dataRow[restrictionsRow[2]]) | |||
local compareVal = tonumber(restrictionsRow[3]) | |||
if dataVal and compareVal then --both are numeric | |||
if dataVal < compareVal then | |||
passesAllRestrictions = false | |||
end | |||
else | |||
passesAllRestrictions = false | |||
end | |||
elseif restrictionsRow[1] == 'Less Than' then | |||
local dataVal = tonumber(dataRow[restrictionsRow[2]]) | |||
local compareVal = tonumber(restrictionsRow[3]) | |||
if dataVal and compareVal then --both are numeric | |||
if dataVal >= compareVal then | |||
passesAllRestrictions = false | |||
end | |||
else | |||
passesAllRestrictions = false | |||
end | |||
elseif restrictionsRow[1] == 'Less Or Equal' then | |||
local dataVal = tonumber(dataRow[restrictionsRow[2]]) | |||
local compareVal = tonumber(restrictionsRow[3]) | |||
if dataVal and compareVal then --both are numeric | |||
if dataVal > compareVal then | |||
passesAllRestrictions = false | |||
end | |||
else | |||
passesAllRestrictions = false | |||
end | |||
end | end | ||
end | end | ||
Latest revision as of 05:56, 12 September 2026
Documentation for this module may be created at Module:RestrictionChecker/doc
-- Helper Module for checking restrictions
local p = {}
local CommaSplitModule = require('Module:CommaSplit')
local StringReplaceModule = require('Module:StringReplace')
local sreplace = StringReplaceModule.replace
local slen = string.len
local sfind = string.find
local ssub = string.sub
---@param restrictionsTable is a table of restrictions
---@dataRow is the row from the data table to check the restrictions against.
---@return true if all restrictions pass
function p.AllPass(restrictionsTable, dataRow)
if not restrictionsTable or restrictionsTable == '' then
return true
end
local passesAllRestrictions = true
for _, restrictionsRowText in ipairs(restrictionsTable) do -- Consider each restrictionsTable row one by one:
local restrictionsRow = CommaSplitModule.CommaSplit(restrictionsRowText)
restrictionsRow[3] = mw.text.trim(restrictionsRow[3])
if restrictionsRow[1] == 'Match' then
if dataRow[restrictionsRow[2]] ~= restrictionsRow[3] then
passesAllRestrictions = false
end
elseif restrictionsRow[1] == 'Match Any' then
local foundMatch = false
for i = 3, 100 do
if dataRow[restrictionsRow[2]] == restrictionsRow[i] then
foundMatch = true
end
end
if not foundMatch then
passesAllRestrictions = false
end
elseif restrictionsRow[1] == 'Not Match' then
if dataRow[restrictionsRow[2]] == restrictionsRow[3] then
passesAllRestrictions = false
end
elseif restrictionsRow[1] == 'Contains' then
if not sfind(dataRow[restrictionsRow[2]], restrictionsRow[3], 1, true) then
passesAllRestrictions = false
end
elseif restrictionsRow[1] == 'In List' then
local inList = false
local found = {}
if sfind(restrictionsRow[2],'{i}',1,true) then
found[1] = true
end
if sfind(restrictionsRow[2],'{j}',1,true) then
found[2] = true
end
if sfind(restrictionsRow[2],'{k}',1,true) then
found[3] = true
end
for i = 0, 100 do
if inList then
break
end
local entry = ''
if found[1] then
entry = sreplace(restrictionsRow[2],'{i}',i)
else
entry = restrictionsRow[2] .. '/' .. i
end
if found[2] then
for j = 0, 100 do
if inList then
break
end
entry = sreplace(entry,'{j}',j)
if found[3] then
for k = 0, 100 do
if inList then
break
end
entry = sreplace(entry,'{k}',k)
if not dataRow[entry] or dataRow[entry] == '' then
break
elseif dataRow[entry] == restrictionsRow[3] then
inList = true
break
end
end
else
if not dataRow[entry] or dataRow[entry] == '' then
break
elseif dataRow[entry] == restrictionsRow[3] then
inList = true
break
end
end
end
else
if not dataRow[entry] or dataRow[entry] == '' then
break
elseif dataRow[entry] == restrictionsRow[3] then
inList = true
break
end
end
end
if not inList then
passesAllRestrictions = false
end
elseif restrictionsRow[1] == 'Not In List' then
local inList = false
local found = {}
if sfind(restrictionsRow[2],'{i}',1,true) then
found[1] = true
end
if sfind(restrictionsRow[2],'{j}',1,true) then
found[2] = true
end
if sfind(restrictionsRow[2],'{k}',1,true) then
found[3] = true
end
for i = 0, 100 do
if inList then
break
end
local entry = ''
if found[1] then
entry = sreplace(restrictionsRow[2],'{i}',i)
else
entry = restrictionsRow[2] .. '/' .. i
end
if found[2] then
for j = 0, 100 do
if inList then
break
end
entry = sreplace(entry,'{j}',j)
if found[3] then
for k = 0, 100 do
if inList then
break
end
entry = sreplace(entry,'{k}',k)
if not dataRow[entry] or dataRow[entry] == '' then
break
elseif dataRow[entry] == restrictionsRow[3] then
inList = true
break
end
end
else
if not dataRow[entry] or dataRow[entry] == '' then
break
elseif dataRow[entry] == restrictionsRow[3] then
inList = true
break
end
end
end
else
if not dataRow[entry] or dataRow[entry] == '' then
break
elseif dataRow[entry] == restrictionsRow[3] then
inList = true
break
end
end
end
if inList then
passesAllRestrictions = false
end
elseif restrictionsRow[1] == 'Greater Than' then
local dataVal = tonumber(dataRow[restrictionsRow[2]])
local compareVal = tonumber(restrictionsRow[3])
if dataVal and compareVal then --both are numeric
if dataVal <= compareVal then
passesAllRestrictions = false
end
else
passesAllRestrictions = false
end
elseif restrictionsRow[1] == 'Greater Or Equal' then
local dataVal = tonumber(dataRow[restrictionsRow[2]])
local compareVal = tonumber(restrictionsRow[3])
if dataVal and compareVal then --both are numeric
if dataVal < compareVal then
passesAllRestrictions = false
end
else
passesAllRestrictions = false
end
elseif restrictionsRow[1] == 'Less Than' then
local dataVal = tonumber(dataRow[restrictionsRow[2]])
local compareVal = tonumber(restrictionsRow[3])
if dataVal and compareVal then --both are numeric
if dataVal >= compareVal then
passesAllRestrictions = false
end
else
passesAllRestrictions = false
end
elseif restrictionsRow[1] == 'Less Or Equal' then
local dataVal = tonumber(dataRow[restrictionsRow[2]])
local compareVal = tonumber(restrictionsRow[3])
if dataVal and compareVal then --both are numeric
if dataVal > compareVal then
passesAllRestrictions = false
end
else
passesAllRestrictions = false
end
end
end
return passesAllRestrictions
end
return p


