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:
DefInfo = {}
+
---@diagnostic disable: lowercase-global
local wiki = {}
+
local p = {}
  
local function runTime()
+
frame = mw.getCurrentFrame()
  return string.format("%i", os.clock() * 1000)
+
util = require("Module:Test/lib/util")
end
+
search = require("Module:Test/lib/search")
 +
data = mw.loadData('Module:Test/data')
  
------------------------------------------------------------------
+
------------------
-- deal with differences between MediaWiki and dev environments --
+
-- virtual keys --
------------------------------------------------------------------
+
------------------
  
if mw then
+
local virtual_store = {}
 +
local virtual_keys = {
 +
  ["Pawn"] = {
  
  log = mw.log
+
    function (def)
  logObject = mw.logObject
+
      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 timeDataStart = runTime()
+
      local list = {}
 
+
      for _,biome in pairs(biomes) do
  Data  = mw.loadData('Module:Test/data')
+
        for animal,_ in pairs(biome.wildAnimals or {}) do
 +
          if def.defName == animal then
 +
            table.insert(list, biome.label)
 +
          end
 +
        end
 +
      end
  
  local timeDataEnd = runTime()
+
      if #list > 0 then
  log(string.format('@%ims, data loaded in %ims', timeDataEnd, timeDataEnd - timeDataStart))
+
        def._virtual_[virtField] = list
 +
      end
 +
    end,
  
  Util  = require("Module:Test/lib/util")
+
    function (def)
  Search = require("Module:Test/lib/search")
+
      virtField = "diet"
  VF    = require("Module:Test/data/virtual")
+
      diet = def.race.foodType
 +
      flags = {}
 +
      virtual_store.diet = {}
  
  log(string.format('@%ims, modules loaded', runTime()))
+
      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
  
else
+
      for flag,_ in pairs(flags) do
 +
        table.insert(virtual_store.diet, flag)
 +
      end
  
  logDevStore = {}
+
      if #virtual_store.diet > 0 then
 
+
        def._virtual_[virtField] = virtual_store.diet
  log = function(str)
+
      end
     table.insert(logDevStore, str)
+
     end,
  end
 
  
   logObject = function(obj, prefix)
+
   }
    if prefix then
+
}
      assert(type(prefix) == "string")
 
      table.insert(logDevStore, prefix .. " = " .. Inspect(obj))
 
    else
 
      table.insert(logDevStore, Inspect(obj))
 
    end
 
  end
 
 
 
  function pp(tbl, title) -- pretty print tables
 
    Util.hl(title)
 
    print(Inspect(tbl))
 
  end
 
 
 
  local timeDataStart = runTime()
 
 
 
  Data    = require "data/data"
 
 
 
  local timeDataEnd = runTime()
 
  log(string.format('@%ims, data loaded in %ims', timeDataEnd, timeDataEnd - timeDataStart))
 
 
 
  Util    = require "lib/util"
 
  Search  = require "lib/search"
 
  Inspect = require "lib/inspect"
 
  VF      = require "data/virtual"
 
 
 
  log(string.format('@%ims, modules loaded', runTime()))
 
 
 
end
 
  
 
-----------------------
 
-----------------------
Line 70: Line 71:
 
-----------------------
 
-----------------------
  
function DefInfo.vardefine(name, value, frame)
+
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)))
  assert(frame, "vardefine: 'frame' missing")
 
 
   frame:callParserFunction('#vardefine', name, value)
 
   frame:callParserFunction('#vardefine', name, value)
 
end
 
end
  
function DefInfo.expandDef(def, runMe)
+
local function mergeParents(baseDef, ignoreKeys)
  if not runMe then return nil end
 
  local vFuncs = VF
 
  for fName,func in pairs(vFuncs) do
 
    if func(def) then
 
      log(string.format('@%ims, expandDef: %s expanded with %s', runTime(), def.defName, fName))
 
    end
 
  end
 
end
 
 
 
function DefInfo.mergeParents(baseDef, ignoreKeys)
 
 
   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 = Data[parentID]
+
     def = data[parentID]
 
   end
 
   end
  
   ancestorIDs = Util.table.reverse(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)
+
     util.table.overwrite(mergedDef, data[parentID], ignoreKeys)
 
   end
 
   end
  
Line 110: Line 100:
 
end
 
end
  
function DefInfo.getDef(defID, expandVF)
+
local function getByDefName(defIDsuffix, defIDprefix)
  if expandVF ~= false then expandVF = true end
 
 
 
 
   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
  
   if not defID then return nil end
+
   mergedDef = mergeParents(baseDef, ignoreKeys)
  
   for _,def in pairs(Data) do
+
   if virtual_keys[mergedDef.category] then
    if def.defName == defID then
+
    mergedDef._virtual_ = {}
      baseDef = def
+
     for k,func in ipairs(virtual_keys[mergedDef.category]) do
      break
+
      func(mergedDef)
     elseif string.upper(def.label or '') == string.upper(defID) then
 
      baseDef = def
 
      break
 
 
     end
 
     end
 
   end
 
   end
  
   if not baseDef then return nil end
+
   return mergedDef
 +
end
  
   def = DefInfo.mergeParents(baseDef, ignoreKeys)
+
local function getByLabel(label)
 +
  local defName
 +
   local def
 +
 
 +
  if not label then return nil end
  
   DefInfo.expandDef(def, expandVF)
+
   for defID,def in pairs(data) do
 +
    if string.upper(def.label or "") == string.upper(label) then
 +
      defName = def.defName
 +
    end
 +
  end
  
   return def
+
   if defName then
 +
    return getByDefName(defName)
 +
  else
 +
    return nil
 +
  end
 
end
 
end
  
Line 153: Line 171:
 
end
 
end
  
local function definePrefixed(tbl, frame)
+
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('%s = %s', mt[k], tostring(v)))
+
       mw.log(string.format("%s = %s", mt[k], v))
       if mw then DefInfo.vardefine(mt[k], v, frame) end
+
       vardefine(mt[k], v)
     else
+
     else  
       definePrefixed(v, frame)
+
       definePrefixed(v)
 
     end
 
     end
 
   end
 
   end
Line 169: Line 187:
 
----------------------
 
----------------------
  
function wiki.count(frame)
+
function p.getDefName(frame)
   local query = wiki.query(frame)
+
   local defName
   if type(wiki.queried) == 'table' then -- WARNING: checks a variable that is set in wiki.query (ugly)
+
  local label = frame.args[1]
     return Util.table.count(wiki.queried)
+
 
 +
  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
end
 
  
function wiki.query(frame)
+
  if not defName then
 +
    mw.logObject(frame.args, "frame.args")
 +
    mw.log(string.format("getDefName: '%s' not found", label))
 +
  end
  
   local argLen = Util.table.count(frame.args, "number") -- #frame.args won't work as expected, check the doc
+
   return defName
 +
end
  
   if not frame.args['defName'] and not frame.args['label'] then
+
function p.describe(frame)
     logObject(frame.args, string.format('query @ %ims: missing an identifying argument (defName or label)\nframe.args', runTime()))
+
   local query = p.query(frame)
     return nil
+
  if type(query) == 'table' then
 +
     return #query
 +
  else
 +
     return type(query)
 
   end
 
   end
 +
end
  
   local def = DefInfo.getDef(frame.args['defName']) or DefInfo.getDef(frame.args['label'])
+
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 @ %ims: Def not found\nframe.args", runTime()))
+
     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, string.format("['%s:%s'] @ %ims", def._.DefCategory, def.defName, runTime()))
+
     mw.logObject(def)
 
     return nil
 
     return nil
 
   end
 
   end
  
   local processedDef = def
+
   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
       processedDef = Search.find({nil, frame.args["sibling"]} , processedDef)
+
       prune = search.conductor({nil, frame.args["sibling"]} , prune)
       if not processedDef then
+
       if not prune then
         logObject(frame.args, string.format("query @ %ims: bad argument 'sibling' ('%s' not found')\nframe.args", runTime(), frame.args["sibling"]))
+
         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
         processedDef = Search.meta.parent.table[arg]
+
         prune = prune.parent.table[arg]
         if not processedDef then
+
         if not prune then
           logObject(frame.args, string.format("query @ %ims: bad argument #%i ('%s' is not a sibling of '%s')", runTime(), i, arg, frame.args["sibling"]))
+
           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 i < argLen or i == argLen and not frame.args["sibling"] then
+
     if i == argLen and not frame.args["sibling"] then
       processedDef = Search.find(arg, processedDef)
+
       prune = search.conductor(arg, prune)
       if not processedDef then
+
       if not prune then
         logObject(frame.args, string.format("query @ %ims: bad argument #%i ('%s' not found)\nframe.args", runTime(), i, frame.args[i]))
+
         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(processedDef) ~= 'table' and i < argLen then
+
        prune = prune.value
          log(string.format("query @ %ims: warning Def ['%s'] argument #%i ('%s' returns a value, all extra arguments ignored)", runTime(), def['label'], i, frame.args[i]))
+
         if type(prune) ~= 'table' then
           return processedDef
+
           return prune
 
         end
 
         end
 
       end
 
       end
Line 231: Line 283:
 
   end -- for arguments
 
   end -- for arguments
  
   if type(processedDef) == "table" then
+
   if type(prune) == "table" then
    log(string.format("@%ims, query: table vardefined", runTime()))
+
     setPrefix(prune, frame.args[argLen])
     setPrefix(processedDef, frame.args[argLen])
+
     definePrefixed(prune)
     definePrefixed(processedDef, frame)
 
    wiki.queried = processedDef -- WARNING: sets a variable that is used in another function wiki.count (ugly)
 
 
     return nil
 
     return nil
 
   end
 
   end
  
  log(string.format("@%ims, query: %s printed", runTime(), type(processedDef)))
+
   return prune
   return processedDef
 
 
end
 
end
  
------------------------------------
 
-- simulate MediaWiki environment --
 
------------------------------------
 
  
if not mw then
+
local clock = string.format("os.clock(): %i ms", os.clock() * 1000)
  local simframe = { ["args"] = {} }
+
mw.log("--" .. string.rep("-", #clock) .. "--")
  simframe.args['label'] = 'ancient cryptosleep casket'
+
mw.log("- " .. clock .. " -")
--~  simframe.args[1] = 'verbs'
+
mw.log("--" .. string.rep("-", #clock) .. "--")
--~  simframe.args[2] = 'label'
+
 
  wiki.query(simframe)
+
----------------------------------------
end
+
-- simulate wiki log while developing --
 +
----------------------------------------
  
if not mw then
+
if ENV == "dev" then
   Util.hl("DefInfo log")
+
   util.hl("log")
   for _,v in ipairs(logDevStore) do
+
   for _,v in ipairs(log) do
 
     print(v)
 
     print(v)
 
   end
 
   end
 
end
 
end
  
------------
+
return p -- return module
-- return --
 
------------
 
 
 
if mw then
 
  return wiki
 
else
 
  return DefInfo
 
end
 

Please note that all contributions to RimWorld Wiki are considered to be released under the CC BY-SA 3.0 (see RimWorld Wiki:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!

Cancel Editing help (opens in new window)