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 = {}
+
ENV = "wiki" -- "dev" or "wiki"
local wiki = {}
+
INFO = true
  
local function runTime()
+
---------------
  return string.format("%i", os.clock() * 1000)
+
-- load data --
end
+
---------------
  
------------------------------------------------------------------
+
data = {}
-- deal with differences between MediaWiki and dev environments --
 
------------------------------------------------------------------
 
  
if mw then
+
if ENV == "dev" then
 +
  data["Biomes"] = loadfile("./data/BiomeDefs.lua")()
 +
  data["Races"] = loadfile("./data/ThingDefs_Races.lua")()
 +
elseif ENV == "wiki" then
 +
  data["Biomes"] = mw.loadData('Module:Test/data/biomes')
 +
  data["Races"] = mw.loadData('Module:Test/data/races')
 +
end
  
  log = mw.log
+
------------------
  logObject = mw.logObject
+
-- virtual keys --
 +
------------------
  
  local timeDataStart = runTime()
+
-- this could be implemented with metatable events
 
+
-- they get added in get(id_pair)
  Data  = mw.loadData('Module:Test/data')
 
  
   local timeDataEnd = runTime()
+
local virtual_keys = {
  log(string.format('@%ims, data loaded in %ims', timeDataEnd, timeDataEnd - timeDataStart))
+
   ["Races"] = {
 +
    ["lives_in"] = function (race, biomes)
 +
      local list = {}
 +
      for biome_key, biome in pairs(biomes) do
 +
        for _,animal in ipairs(biome.wildAnimals) do
 +
          if race.defName == animal then
 +
            table.insert(list, biome_key)
 +
          end
 +
        end
 +
      end
 +
      return list
 +
    end
 +
  }
 +
}
  
  Util  = require("Module:Test/lib/util")
+
--------------------
  Search = require("Module:Test/lib/search")
+
-- load libraries --
  VF    = require("Module:Test/data/virtual")
+
--------------------
  
  log(string.format('@%ims, modules loaded', runTime()))
+
mw = mw or {}
 +
log_entries = {}
  
else
+
if ENV == "dev" then
 +
  inspect = require './lib/inspect'
 +
  util = require("./lib/util")
 +
  search = require("./lib/search")
  
   logDevStore = {}
+
   function pinspect(tbl, title)
 +
    if INFO then
 +
      util.hl(title)
 +
      print(inspect(tbl))
 +
    end
 +
  end
  
   log = function(str)
+
   mw.logObject = function(arg)
     table.insert(logDevStore, str)
+
     table.insert(log_entries, inspect(arg))
 
   end
 
   end
  
   logObject = function(obj, prefix)
+
   mw.dumpObject = function(arg)
     if prefix then
+
     return inspect(arg)
      assert(type(prefix) == "string")
 
      table.insert(logDevStore, prefix .. " = " .. Inspect(obj))
 
    else
 
      table.insert(logDevStore, Inspect(obj))
 
    end
 
 
   end
 
   end
  
   function pp(tbl, title) -- pretty print tables
+
   log = function(arg)
     Util.hl(title)
+
     table.insert(log_entries, arg)
    print(Inspect(tbl))
 
 
   end
 
   end
 +
end
  
   local timeDataStart = runTime()
+
if ENV == "wiki" then
 
+
   INFO = false
   Data    = require "data/data"
+
  log = mw.log
 
+
   util = require("Module:Test/lib/util")
   local timeDataEnd = runTime()
+
   search = require("Module:Test/lib/search")
   log(string.format('@%ims, data loaded in %ims', timeDataEnd, timeDataEnd - timeDataStart))
+
   function pinspect() end
 +
end
  
  Util    = require "lib/util"
+
-------------
  Search  = require "lib/search"
+
-- private --
  Inspect = require "lib/inspect"
+
-------------
  VF      = require "data/virtual"
 
  
   log(string.format('@%ims, modules loaded', runTime()))
+
local function vardefine(name, value)
 +
  local f_name = "vardefine"
 +
   assert(var_name, string.format("bad argument #1 to '%s' (argument missing, name of variable to define)", f_name))
 +
  assert(var_name == "string", string.format("bad argument #1 to '%s' (string expected, got %s)", f_name, type(var_name)))
 +
  assert(var_value, string.format("bad argument #2 to '%s' (argument missing, value to assign to variable)", f_name))
 +
  assert(var_value == "string" or var_value == "number", string.format("bad argument #2 to '%s' (string or number expected, got %s)", f_name, type(var_value)))
  
 +
  frame:callParserFunction('#vardefine', var_name, var_value)
 
end
 
end
  
-----------------------
 
-- private functions --
 
-----------------------
 
  
function DefInfo.vardefine(name, value, frame)
+
local function search_parent_def_table(key, def_table)
  assert(name, "vardefine: missing argument #1 (variable to definePrefix)")
+
   local ParentName = getParentName(def_table)
   assert(type(name) == "string", string.format("vardefine: bad argument #1 (string expected, got %s)", type(name)))
+
   if not ParentName then return nil end
   assert(value, "vardefine: missing argument #2 (value to assign)")
+
   local parentdef_table = search_table_recursive(ParentName, data)
   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)))
+
   if not parentdef_table then return nil end
   assert(frame, "vardefine: 'frame' missing")
 
  frame:callParserFunction('#vardefine', name, value)
 
end
 
  
function DefInfo.expandDef(def, runMe)
+
  local found = search_table_recursive(key, parentdef_table)
   if not runMe then return nil end
+
   if found then return found
   local vFuncs = VF
+
   else
  for fName,func in pairs(vFuncs) do
+
    found = search_parent_def_table(key, parentdef_table)
     if func(def) then
+
     if found then return found end
      log(string.format('@%ims, expandDef: %s expanded with %s', runTime(), def.defName, fName))
 
    end
 
 
   end
 
   end
 
end
 
end
  
function DefInfo.mergeParents(baseDef, ignoreKeys)
 
  local ancestorIDs = {}
 
  local mergedDef = {}
 
  local def = baseDef
 
  
  while def._.ParentName do
+
local function merge_def(base_def_table, def_category, ignore_keys)
    local parentID = def._.DefCategory .. ":" .. def._.ParentName
 
    table.insert(ancestorIDs, parentID)
 
    def = Data[parentID]
 
  end
 
  
   ancestorIDs = Util.table.reverse(ancestorIDs)
+
   local ancestors = {}
   table.insert(ancestorIDs, baseDef._.DefCategory .. ":" .. baseDef.defName)
+
   local parent_name = base_def_table["ParentName"]
 +
  local parent_table = data[def_category][parent_name]
  
   for _,parentID in ipairs(ancestorIDs) do
+
   while parent_name do
     Util.table.overwrite(mergedDef, Data[parentID], ignoreKeys)
+
     table.insert(ancestors, parent_name)
 +
    parent_name = parent_table["ParentName"]
 +
    parent_table = data[def_category][parent_name]
 
   end
 
   end
  
   return mergedDef
+
   local inheritance_chain = util.shallowcopy(util.reverse_numeric_table(ancestors))
end
+
   table.insert(inheritance_chain, base_def_table.defName)
 
 
function DefInfo.getDef(defID, expandVF)
 
   if expandVF ~= false then expandVF = true end
 
 
 
  local ignoreKeys = {"Abstract", "Name", "ParentName"}
 
  local baseDef
 
  local def
 
 
 
  if not defID then return nil end
 
  
   for _,def in pairs(Data) do
+
  local merged = {}
     if def.defName == defID then
+
   for i,v in ipairs(inheritance_chain) do
      baseDef = def
+
     util.overwrite_first_table_with_second(merged, data[def_category][inheritance_chain[i]], ignore_keys)
      break
 
    elseif string.upper(def.label or '') == string.upper(defID) then
 
      baseDef = def
 
      break
 
    end
 
 
   end
 
   end
  
   if not baseDef then return nil end
+
   return merged
 
 
  def = DefInfo.mergeParents(baseDef, ignoreKeys)
 
 
 
  DefInfo.expandDef(def, expandVF)
 
 
 
  return def
 
 
end
 
end
  
local function setPrefix(tbl, parentKey)
 
  local mt = getmetatable(tbl) or {}
 
  
  for k,v in pairs(tbl) do
+
local function get(id_pair)
    local prefix = parentKey .. "_" .. k
+
  local res = search.conductor(id_pair, data)
    if type(v) == 'table' then
+
  mw.logObject(res)
      setPrefix(v, prefix)
+
  if not res then
     else
+
    log("Def not found")
      mt[k] = prefix
+
     return nil
    end
 
 
   end
 
   end
  
   setmetatable(tbl, mt)
+
   local base_def_table = res.parent.table
end
+
  local def = merge_def(base_def_table, res.ancestors[2], {"ParentName", "Abstract"})
  
local function definePrefixed(tbl, frame)
+
  -- add virtual keys
   for k,v in pairs(tbl) do
+
   if virtual_keys[res.ancestors[2]] then
    if type(v) ~= 'table' then
+
    def._virtual = {}
      local mt = getmetatable(tbl)
+
    for k,func in pairs(virtual_keys[res.ancestors[2]]) do
      log(string.format('%s = %s', mt[k], tostring(v)))
+
       def._virtual[k] = func(def, data.Biomes)
       if mw then DefInfo.vardefine(mt[k], v, frame) end
 
    else
 
      definePrefixed(v, frame)
 
 
     end
 
     end
 
   end
 
   end
end
 
  
----------------------
+
   return def
-- public interface --
 
----------------------
 
 
 
function wiki.count(frame)
 
   local query = wiki.query(frame)
 
  if type(wiki.queried) == 'table' then -- WARNING: checks a variable that is set in wiki.query (ugly)
 
    return Util.table.count(wiki.queried)
 
  end
 
 
end
 
end
  
function wiki.query(frame)
+
------------
 +
-- public --
 +
------------
  
  local argLen = Util.table.count(frame.args, "number") -- #frame.args won't work as expected, check the doc
+
local p = {}
  
   if not frame.args['defName'] and not frame.args['label'] then
+
function p.query(frame)
     logObject(frame.args, string.format('query @ %ims: missing an identifying argument (defName or label)\nframe.args', runTime()))
+
   if not frame.args[1] then
 +
     log("missing argument #1 (needed to identify a Def, defName or label can be used)")
 
     return nil
 
     return nil
 
   end
 
   end
  
   local def = DefInfo.getDef(frame.args['defName']) or DefInfo.getDef(frame.args['label'])
+
   local def = get({"defName", frame.args[1]}) or get({"label", frame.args[1]})
 +
  local pruned = def
  
   if not def then
+
   for i,arg in ipairs(frame.args) do
    logObject(frame.args, string.format("query @ %ims: Def not found\nframe.args", runTime()))
+
    if i > 1 then
    return nil
+
      pruned = search.conductor(arg, pruned)
 +
      if not pruned then
 +
        log(string.format("bad argument #%i ('%s' not found in '%s')", i, frame.args[i], frame.args[i-1]))
 +
        return nil
 +
      else
 +
        pruned = pruned.value
 +
      end
 +
    end
 
   end
 
   end
  
   if def and argLen == 0 then
+
   if type(pruned) == "table" then mw.logObject(pruned) end
    logObject(def, string.format("['%s:%s'] @ %ims", def._.DefCategory, def.defName, runTime()))
+
  return pruned
    return nil
+
end
  end
 
  
   local processedDef = def
+
function p.logObject(frame)
 +
   mw.logObject(get(frame))
 +
end
  
  for i,arg in ipairs(frame.args) do -- arguments
+
function p.dumpObject(frame)
    arg = tonumber(arg) or arg -- frame.args are always strings on MediaWiki so convert back the numbers
+
  return mw.dumpObject(get(frame))
 +
end
  
    if i == argLen and frame.args["sibling"] then
+
-------------------------------------------------------------------
      processedDef = Search.find({nil, frame.args["sibling"]} , processedDef)
+
-- simulate MediaWiki/Scribunto module invocation using 'frame' --
      if not processedDef then
+
-------------------------------------------------------------------
        logObject(frame.args, string.format("query @ %ims: bad argument 'sibling' ('%s' not found')\nframe.args", runTime(), frame.args["sibling"]))
 
        return nil
 
      else
 
        processedDef = Search.meta.parent.table[arg]
 
        if not processedDef then
 
          logObject(frame.args, string.format("query @ %ims: bad argument #%i ('%s' is not a sibling of '%s')", runTime(), i, arg, frame.args["sibling"]))
 
          return nil
 
        end
 
      end
 
    end
 
  
    if i < argLen or i == argLen and not frame.args["sibling"] then
+
local simframe = { ["args"] = {} }
      processedDef = Search.find(arg, processedDef)
 
      if not processedDef then
 
        logObject(frame.args, string.format("query @ %ims: bad argument #%i ('%s' not found)\nframe.args", runTime(), i, frame.args[i]))
 
        return nil
 
      else
 
        if type(processedDef) ~= 'table' and i < argLen then
 
          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]))
 
          return processedDef
 
        end
 
      end
 
    end
 
  
  end -- for arguments
+
simframe.args[1] = "Fox_Fennec"
 +
simframe.args[2] = "description"
 +
--~ simframe.args[3] = "12"
  
  if type(processedDef) == "table" then
+
frame = frame or simframe
    log(string.format("@%ims, query: table vardefined", runTime()))
 
    setPrefix(processedDef, frame.args[argLen])
 
    definePrefixed(processedDef, frame)
 
    wiki.queried = processedDef -- WARNING: sets a variable that is used in another function wiki.count (ugly)
 
    return nil
 
  end
 
  
  log(string.format("@%ims, query: %s printed", runTime(), type(processedDef)))
+
-- frame.args are always strings on MediaWiki so convert them back to numbers
  return processedDef
+
for k,arg in pairs(frame.args) do
 +
  frame.args[k] = tonumber(arg) or arg
 
end
 
end
  
------------------------------------
+
----------------------------------------
-- simulate MediaWiki environment --
+
-- simulate wiki log while developing --
------------------------------------
+
----------------------------------------
  
if not mw then
+
local clock = string.format("os.clock(): %i ms", os.clock() * 1000)
  local simframe = { ["args"] = {} }
+
log("--" .. string.rep("-", #clock) .. "--")
  simframe.args['label'] = 'ancient cryptosleep casket'
+
log("- " .. clock .. " -")
--~  simframe.args[1] = 'verbs'
+
log("--" .. string.rep("-", #clock) .. "--")
--~  simframe.args[2] = 'label'
 
  wiki.query(simframe)
 
end
 
  
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_entries) do
 
     print(v)
 
     print(v)
 
   end
 
   end
 +
 
end
 
end
  
------------
+
return p
-- 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)