Editing Module:Test
Jump to navigation
Jump to search
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
− | + | ---@diagnostic disable: lowercase-global | |
− | local | + | local p = {} |
− | + | frame = mw.getCurrentFrame() | |
− | + | util = require("Module:Test/lib/util") | |
− | + | search = require("Module:Test/lib/search") | |
+ | data = mw.loadData('Module:Test/data') | ||
− | + | ------------------ | |
− | -- | + | -- virtual keys -- |
− | + | ------------------ | |
− | + | local virtual_store = {} | |
+ | local virtual_keys = { | ||
+ | ["Pawn"] = { | ||
− | + | function (def) | |
− | + | virtField = "lives_in" | |
+ | biomes = {} | ||
+ | for k,v in pairs(data) do | ||
+ | prefix = string.match(k, '(.+):') | ||
+ | if prefix == "BiomeDef" then | ||
+ | table.insert(biomes, v) | ||
+ | end | ||
+ | end | ||
− | + | local list = {} | |
− | + | for _,biome in pairs(biomes) do | |
− | + | for animal,_ in pairs(biome.wildAnimals or {}) do | |
+ | if def.defName == animal then | ||
+ | table.insert(list, biome.label) | ||
+ | end | ||
+ | end | ||
+ | end | ||
− | + | if #list > 0 then | |
− | + | def._virtual_[virtField] = list | |
+ | end | ||
+ | end, | ||
− | + | function (def) | |
− | + | virtField = "diet" | |
− | + | diet = def.race.foodType | |
+ | flags = {} | ||
+ | virtual_store.diet = {} | ||
− | + | for _,foodType in ipairs(diet) do | |
+ | if type(util.diet.foodType[foodType]) == "boolean" then | ||
+ | flags[foodType] = true | ||
+ | else | ||
+ | for foodItem,_ in pairs(util.diet.foodType[foodType]) do | ||
+ | flags[foodItem] = true | ||
+ | end | ||
+ | end | ||
+ | end | ||
− | + | for flag,_ in pairs(flags) do | |
+ | table.insert(virtual_store.diet, flag) | ||
+ | end | ||
− | + | if #virtual_store.diet > 0 then | |
− | + | def._virtual_[virtField] = virtual_store.diet | |
− | + | end | |
− | + | end, | |
− | |||
− | + | } | |
− | + | } | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
----------------------- | ----------------------- | ||
Line 70: | Line 71: | ||
----------------------- | ----------------------- | ||
− | function | + | local function vardefine(name, value) |
assert(name, "vardefine: missing argument #1 (variable to definePrefix)") | assert(name, "vardefine: missing argument #1 (variable to definePrefix)") | ||
assert(type(name) == "string", string.format("vardefine: bad argument #1 (string expected, got %s)", type(name))) | assert(type(name) == "string", string.format("vardefine: bad argument #1 (string expected, got %s)", type(name))) | ||
assert(value, "vardefine: missing argument #2 (value to assign)") | assert(value, "vardefine: missing argument #2 (value to assign)") | ||
assert(type(value) == "string" or type(value) == "number" or type(value) =="boolean", string.format("vardefine: bad argument #2 (string, number or boolean expected, got %s)", type(value))) | assert(type(value) == "string" or type(value) == "number" or type(value) =="boolean", string.format("vardefine: bad argument #2 (string, number or boolean expected, got %s)", type(value))) | ||
− | |||
frame:callParserFunction('#vardefine', name, value) | frame:callParserFunction('#vardefine', name, value) | ||
end | end | ||
− | + | local function mergeParents(baseDef, ignoreKeys) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | function | ||
local ancestorIDs = {} | local ancestorIDs = {} | ||
local mergedDef = {} | local mergedDef = {} | ||
Line 97: | Line 87: | ||
local parentID = def._.DefCategory .. ":" .. def._.ParentName | local parentID = def._.DefCategory .. ":" .. def._.ParentName | ||
table.insert(ancestorIDs, parentID) | table.insert(ancestorIDs, parentID) | ||
− | def = | + | def = data[parentID] |
end | end | ||
− | ancestorIDs = | + | ancestorIDs = util.table.reverse(ancestorIDs) |
table.insert(ancestorIDs, baseDef._.DefCategory .. ":" .. baseDef.defName) | table.insert(ancestorIDs, baseDef._.DefCategory .. ":" .. baseDef.defName) | ||
for _,parentID in ipairs(ancestorIDs) do | for _,parentID in ipairs(ancestorIDs) do | ||
− | + | util.table.overwrite(mergedDef, data[parentID], ignoreKeys) | |
end | end | ||
Line 110: | Line 100: | ||
end | end | ||
− | function | + | local function getByDefName(defIDsuffix, defIDprefix) |
− | |||
− | |||
local ignoreKeys = {"Abstract", "Name", "ParentName"} | local ignoreKeys = {"Abstract", "Name", "ParentName"} | ||
local baseDef | local baseDef | ||
− | local def | + | local mergedDef |
+ | |||
+ | if defIDprefix then | ||
+ | local defID = defIDprefix .. ":" .. defIDsuffix | ||
+ | baseDef = data[defID] | ||
+ | assert(not baseDef, string.format("getByDefName: Def '%s' not found", defID)) | ||
+ | else | ||
+ | for defID,def in pairs(data) do | ||
+ | -- WARNING: this depends on there not being any preexisting colons in the relevant substrings | ||
+ | prefix = string.match(defID, '(.+):') | ||
+ | suffix = string.match(defID, ':(.+)') | ||
+ | if suffix == defIDsuffix then | ||
+ | assert(not baseDef, string.format("getByDefName: Def conflict (more than one '%s')", defIDsuffix)) | ||
+ | baseDef = def | ||
+ | end | ||
+ | end | ||
+ | if not baseDef then | ||
+ | -- mw.log(string.format("getByDefName: Def '%s' not found", defIDsuffix)) | ||
+ | return nil | ||
+ | end | ||
+ | end | ||
− | + | mergedDef = mergeParents(baseDef, ignoreKeys) | |
− | + | if virtual_keys[mergedDef.category] then | |
− | + | mergedDef._virtual_ = {} | |
− | + | for k,func in ipairs(virtual_keys[mergedDef.category]) do | |
− | + | func(mergedDef) | |
− | |||
− | |||
− | |||
end | end | ||
end | end | ||
− | + | return mergedDef | |
+ | end | ||
− | def | + | local function getByLabel(label) |
+ | local defName | ||
+ | local def | ||
+ | |||
+ | if not label then return nil end | ||
− | + | for defID,def in pairs(data) do | |
+ | if string.upper(def.label or "") == string.upper(label) then | ||
+ | defName = def.defName | ||
+ | end | ||
+ | end | ||
− | return | + | if defName then |
+ | return getByDefName(defName) | ||
+ | else | ||
+ | return nil | ||
+ | end | ||
end | end | ||
Line 153: | Line 171: | ||
end | end | ||
− | local function definePrefixed(tbl | + | local function definePrefixed(tbl) |
for k,v in pairs(tbl) do | for k,v in pairs(tbl) do | ||
if type(v) ~= 'table' then | if type(v) ~= 'table' then | ||
local mt = getmetatable(tbl) | local mt = getmetatable(tbl) | ||
− | log(string.format( | + | mw.log(string.format("%s = %s", mt[k], v)) |
− | + | vardefine(mt[k], v) | |
− | else | + | else |
− | definePrefixed(v | + | definePrefixed(v) |
end | end | ||
end | end | ||
Line 169: | Line 187: | ||
---------------------- | ---------------------- | ||
− | function | + | function p.getDefName(frame) |
− | local | + | local defName |
− | if | + | local label = frame.args[1] |
− | + | ||
+ | if not label then | ||
+ | mw.logObject(frame.args, "frame.args") | ||
+ | mw.log("getDefName: missing argument #1 (label)") | ||
+ | return nil | ||
+ | end | ||
+ | |||
+ | for defID,def in pairs(data) do | ||
+ | if string.upper(def.label or "") == string.upper(label) then | ||
+ | defName = def.defName | ||
+ | end | ||
end | end | ||
− | |||
− | + | if not defName then | |
+ | mw.logObject(frame.args, "frame.args") | ||
+ | mw.log(string.format("getDefName: '%s' not found", label)) | ||
+ | end | ||
− | + | return defName | |
+ | end | ||
− | + | function p.describe(frame) | |
− | + | local query = p.query(frame) | |
− | return | + | if type(query) == 'table' then |
+ | return #query | ||
+ | else | ||
+ | return type(query) | ||
end | end | ||
+ | end | ||
− | local def = | + | function p.query(frame) |
+ | local argLen = util.table.count(frame.args, "number") -- #frame.args won't work as expected, check the doc | ||
+ | local def = getByDefName(frame.args['defName']) or getByLabel(frame.args['label']) | ||
if not def then | if not def then | ||
− | logObject(frame.args, string.format("query | + | mw.logObject(frame.args, "frame.args") |
+ | mw.log(string.format("query: Def not found")) | ||
return nil | return nil | ||
end | end | ||
− | + | ||
if def and argLen == 0 then | if def and argLen == 0 then | ||
− | logObject(def | + | mw.logObject(def) |
return nil | return nil | ||
end | end | ||
− | local | + | local prune = def |
for i,arg in ipairs(frame.args) do -- arguments | for i,arg in ipairs(frame.args) do -- arguments | ||
Line 203: | Line 241: | ||
if i == argLen and frame.args["sibling"] then | if i == argLen and frame.args["sibling"] then | ||
− | + | prune = search.conductor({nil, frame.args["sibling"]} , prune) | |
− | if not | + | if not prune then |
− | logObject(frame.args, string.format("query | + | mw.logObject(frame.args, "frame.args") |
+ | mw.log(string.format("query: bad argument 'sibling' ('%s' not found in '%s')", frame.args["sibling"], frame.args[i-1])) | ||
return nil | return nil | ||
else | else | ||
− | + | prune = prune.parent.table[arg] | |
− | if not | + | if not prune then |
− | logObject(frame.args, string.format("query | + | mw.logObject(frame.args, "frame.args") |
+ | mw.log(string.format("query: bad argument #%i ('%s' is not a sibling of '%s')", i, arg, frame.args["sibling"])) | ||
return nil | return nil | ||
end | end | ||
Line 216: | Line 256: | ||
end | end | ||
− | if | + | if i == argLen and not frame.args["sibling"] then |
− | + | prune = search.conductor(arg, prune) | |
− | if not | + | if not prune then |
− | logObject(frame.args, string.format("query | + | mw.logObject(frame.args, "frame.args") |
+ | mw.log(string.format("query: bad argument #%i ('%s' not found in '%s')", i, frame.args[i], frame.args[i-1])) | ||
+ | return nil | ||
+ | else | ||
+ | prune = prune.value | ||
+ | end | ||
+ | end | ||
+ | |||
+ | if i < argLen then | ||
+ | prune = search.conductor(arg, prune) | ||
+ | if not prune then | ||
+ | mw.logObject(frame.args, "frame.args") | ||
+ | mw.log(string.format("query: bad argument #%i ('%s' not found in '%s')", i, frame.args[i], frame.args[i-1])) | ||
return nil | return nil | ||
else | else | ||
− | if type( | + | prune = prune.value |
− | + | if type(prune) ~= 'table' then | |
− | return | + | return prune |
end | end | ||
end | end | ||
Line 231: | Line 283: | ||
end -- for arguments | end -- for arguments | ||
− | if type( | + | if type(prune) == "table" then |
− | + | setPrefix(prune, frame.args[argLen]) | |
− | setPrefix( | + | definePrefixed(prune) |
− | definePrefixed( | ||
− | |||
return nil | return nil | ||
end | end | ||
− | + | return prune | |
− | return | ||
end | end | ||
− | |||
− | |||
− | |||
− | + | local clock = string.format("os.clock(): %i ms", os.clock() * 1000) | |
− | + | mw.log("--" .. string.rep("-", #clock) .. "--") | |
− | + | mw.log("- " .. clock .. " -") | |
− | -- | + | mw.log("--" .. string.rep("-", #clock) .. "--") |
− | -- | + | |
− | + | ---------------------------------------- | |
− | + | -- simulate wiki log while developing -- | |
+ | ---------------------------------------- | ||
− | if | + | if ENV == "dev" then |
− | + | util.hl("log") | |
− | for _,v in ipairs( | + | for _,v in ipairs(log) do |
print(v) | print(v) | ||
end | end | ||
end | end | ||
− | + | return p -- return module | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |