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 = {}
+
---------------
local wiki = {}
+
-- load data --
 +
---------------
  
local function runTime()
+
local Biomes = mw.loadData('Module:Test/data/biomes')
  return string.format("%i", os.clock() * 1000)
+
--local Buildings = mw.loadData('Module:Test/data/buildings')
end
+
local Races = mw.loadData('Module:Test/data/races')
 
 
------------------------------------------------------------------
 
-- deal with differences between MediaWiki and dev environments --
 
------------------------------------------------------------------
 
 
 
if mw then
 
 
 
  log = mw.log
 
  logObject = mw.logObject
 
 
 
  local timeDataStart = runTime()
 
 
 
  Data  = mw.loadData('Module:Test/data')
 
 
 
  local timeDataEnd = runTime()
 
  log(string.format('@%ims, data loaded in %ims', timeDataEnd, timeDataEnd - timeDataStart))
 
 
 
  Util  = require("Module:Test/lib/util")
 
  Search = require("Module:Test/lib/search")
 
  VF    = require("Module:Test/data/virtual")
 
 
 
  log(string.format('@%ims, modules loaded', runTime()))
 
 
 
else
 
 
 
  logDevStore = {}
 
 
 
  log = function(str)
 
    table.insert(logDevStore, str)
 
  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 11:
 
-----------------------
 
-----------------------
  
function DefInfo.vardefine(name, value, frame)
+
local function find_key_in_table(key, table)
   assert(name, "vardefine: missing argument #1 (variable to definePrefix)")
+
   for k, v in pairs(table) do
  assert(type(name) == "string", string.format("vardefine: bad argument #1 (string expected, got %s)", type(name)))
+
    if k == key then return v
  assert(value, "vardefine: missing argument #2 (value to assign)")
+
    elseif type(v) == "table" then
  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)))
+
      local found = find_key_in_table(key, v)
  assert(frame, "vardefine: 'frame' missing")
+
      if found then return found end
  frame:callParserFunction('#vardefine', name, value)
 
end
 
 
 
function DefInfo.expandDef(def, runMe)
 
  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
 
   end
 
end
 
end
  
function DefInfo.mergeParents(baseDef, ignoreKeys)
 
  local ancestorIDs = {}
 
  local mergedDef = {}
 
  local def = baseDef
 
 
  while def._.ParentName do
 
    local parentID = def._.DefCategory .. ":" .. def._.ParentName
 
    table.insert(ancestorIDs, parentID)
 
    def = Data[parentID]
 
  end
 
 
  ancestorIDs = Util.table.reverse(ancestorIDs)
 
  table.insert(ancestorIDs, baseDef._.DefCategory .. ":" .. baseDef.defName)
 
  
  for _,parentID in ipairs(ancestorIDs) do
+
local function parent_defName(def, category)
    Util.table.overwrite(mergedDef, Data[parentID], ignoreKeys)
+
  local parent_name = category[def]["ParentName"]
 +
  if type(category[parent_name]) == "table" then
 +
    return parent_name
 
   end
 
   end
 
  return mergedDef
 
 
end
 
end
  
function DefInfo.getDef(defID, expandVF)
 
  if expandVF ~= false then expandVF = true end
 
  
  local ignoreKeys = {"Abstract", "Name", "ParentName"}
+
local function find_in_parents(tag, def, category)
  local baseDef
+
   if not category[def] then
  local def
+
     return def .. " not found in category"
 
 
   if not defID then return nil end
 
 
 
  for _,def in pairs(Data) do
 
    if def.defName == defID then
 
      baseDef = def
 
      break
 
     elseif string.upper(def.label or '') == string.upper(defID) then
 
      baseDef = def
 
      break
 
    end
 
 
   end
 
   end
  
   if not baseDef then return nil end
+
   local parent_def = parent_defName(def, category)
 
+
   if not parent_def then
  def = DefInfo.mergeParents(baseDef, ignoreKeys)
+
     return tag .." not found in parent defs"
 
 
  DefInfo.expandDef(def, expandVF)
 
 
 
   return def
 
end
 
 
 
local function setPrefix(tbl, parentKey)
 
  local mt = getmetatable(tbl) or {}
 
 
 
  for k,v in pairs(tbl) do
 
     local prefix = parentKey .. "_" .. k
 
    if type(v) == 'table' then
 
      setPrefix(v, prefix)
 
    else
 
      mt[k] = prefix
 
    end
 
 
   end
 
   end
  
   setmetatable(tbl, mt)
+
   local found = find_key_in_table(tag, category[parent_def])
end
+
   if found then return found
 
+
  else
local function definePrefixed(tbl, frame)
+
    found = find_in_parents(tag, parent_def, category)
   for k,v in pairs(tbl) do
+
    if found then
    if type(v) ~= 'table' then
+
       return found
      local mt = getmetatable(tbl)
 
      log(string.format('%s = %s', mt[k], tostring(v)))
 
      if mw then DefInfo.vardefine(mt[k], v, frame) end
 
    else
 
       definePrefixed(v, frame)
 
 
     end
 
     end
 
   end
 
   end
 
end
 
end
  
----------------------
 
-- public interface --
 
----------------------
 
  
function wiki.count(frame)
+
local function query(tag, def, category)
  local query = wiki.query(frame)
+
   if not category[def] then
   if type(wiki.queried) == 'table' then -- WARNING: checks a variable that is set in wiki.query (ugly)
+
     return def .. " not found in category"
     return Util.table.count(wiki.queried)
 
 
   end
 
   end
end
 
  
function wiki.query(frame)
+
  local found = find_key_in_table(tag, category[def])
 +
  if found then return found end
  
   local argLen = Util.table.count(frame.args, "number") -- #frame.args won't work as expected, check the doc
+
   found = find_in_parents(tag, def, category)
 +
  if found then return found end
  
   if not frame.args['defName'] and not frame.args['label'] then
+
   return tag .. " not found"
    logObject(frame.args, string.format('query @ %ims: missing an identifying argument (defName or label)\nframe.args', runTime()))
+
end
    return nil
 
  end
 
  
  local def = DefInfo.getDef(frame.args['defName']) or DefInfo.getDef(frame.args['label'])
+
--------------------------------
 +
-- publicly exposed functions --
 +
--------------------------------
  
  if not def then
+
local p = {}
    logObject(frame.args, string.format("query @ %ims: Def not found\nframe.args", runTime()))
 
    return nil
 
  end
 
  
   if def and argLen == 0 then
+
function p.query(frame)
    logObject(def, string.format("['%s:%s'] @ %ims", def._.DefCategory, def.defName, runTime()))
+
   local category = frame.args[1]
    return nil
+
  local def = frame.args[2]
   end
+
  local tag = frame.args[3]
 +
   local sublist_query = frame.args[4]
  
   local processedDef = def
+
   if category == "Races" then category = Races
 +
  elseif category == "Biomes" then category = Biomes
 +
  else return "undefined category" end
  
   for i,arg in ipairs(frame.args) do -- arguments
+
   local queried = query(tag, def, category)
    arg = tonumber(arg) or arg -- frame.args are always strings on MediaWiki so convert back the numbers
 
  
    if i == argLen and frame.args["sibling"] then
+
  if sublist_query == "count" then
      processedDef = Search.find({nil, frame.args["sibling"]} , processedDef)
+
    if type(queried) == "table" then
      if not processedDef then
+
       local count = 0;
        logObject(frame.args, string.format("query @ %ims: bad argument 'sibling' ('%s' not found')\nframe.args", runTime(), frame.args["sibling"]))
+
       for i, v in ipairs(queried) do
        return nil
+
         count = i
      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
 
       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
 +
      return count
 +
    else
 +
      return tag .. " is not a table (not countable)"
 
     end
 
     end
 
+
   elseif sublist_query then
  end -- for arguments
+
     return queried[tonumber(sublist_query)]
 
 
   if type(processedDef) == "table" then
 
     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
 
   end
  
  log(string.format("@%ims, query: %s printed", runTime(), type(processedDef)))
+
   return queried
   return processedDef
 
 
end
 
end
  
------------------------------------
+
-- os.clock() may be logging time that is not the time I want
-- simulate MediaWiki environment --
+
mw.log("Module:DefInfo:os.clock() " .. os.clock()*1000 .. " ms")
------------------------------------
 
  
if not mw then
+
return p
  local simframe = { ["args"] = {} }
 
  simframe.args['label'] = 'ancient cryptosleep casket'
 
--~  simframe.args[1] = 'verbs'
 
--~  simframe.args[2] = 'label'
 
  wiki.query(simframe)
 
end
 
 
 
if not mw then
 
  Util.hl("DefInfo log")
 
  for _,v in ipairs(logDevStore) do
 
    print(v)
 
  end
 
end
 
 
 
------------
 
-- 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)