Editing Module:DefInfo

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:
 +
---------------
 +
-- load data --
 +
---------------
  
 +
local Biomes = mw.loadData('Module:Test/data/biomes')
 +
--local Buildings = mw.loadData('Module:Test/data/buildings')
 +
local Races = mw.loadData('Module:Test/data/races')
 +
 +
-----------------------
 +
-- private functions --
 +
-----------------------
 +
 +
local function find_key_in_table(key, table)
 +
  for k, v in pairs(table) do
 +
    if k == key then return v
 +
    elseif type(v) == "table" then
 +
      local found = find_key_in_table(key, v)
 +
      if found then return found end
 +
    end
 +
  end
 +
end
 +
 +
 +
local function parent_defName(def, category)
 +
  local parent_name = category[def]["ParentName"]
 +
  if type(category[parent_name]) == "table" then
 +
    return parent_name
 +
  end
 +
end
 +
 +
 +
local function find_in_parents(tag, def, category)
 +
  if not category[def] then
 +
    return def .. " not found in category"
 +
  end
 +
 +
  local parent_def = parent_defName(def, category)
 +
  if not parent_def then
 +
    return tag .." not found in parent defs"
 +
  end
 +
 +
  local found = find_key_in_table(tag, category[parent_def])
 +
  if found then return found
 +
  else
 +
    found = find_in_parents(tag, parent_def, category)
 +
    if found then
 +
      return found
 +
    end
 +
  end
 +
end
 +
 +
 +
local function query(tag, def, category)
 +
  if not category[def] then
 +
    return def .. " not found in category"
 +
  end
 +
 +
  local found = find_key_in_table(tag, category[def])
 +
  if found then return found end
 +
 +
  found = find_in_parents(tag, def, category)
 +
  if found then return found end
 +
 +
  return tag .. " not found"
 +
end
 +
 +
--------------------------------
 +
-- publicly exposed functions --
 +
--------------------------------
 +
 +
local p = {}
 +
 +
function p.query(frame)
 +
  local category = frame.args[1]
 +
  local def = frame.args[2]
 +
  local tag = frame.args[3]
 +
  local sublist_query = frame.args[4]
 +
 +
  if category == "Races" then category = Races
 +
  elseif category == "Biomes" then category = Biomes
 +
  else return "undefined category" end
 +
 +
  local queried = query(tag, def, category)
 +
 +
  if sublist_query == "count" then
 +
    if type(queried) == "table" then
 +
      return table.maxn(queried)
 +
    else
 +
      return tag .. " is not a table (not countable)"
 +
    end
 +
  elseif sublist_query then
 +
    return queried[tonumber(sublist_query)]
 +
  end
 +
 +
  return queried
 +
end
 +
 +
-- os.clock() may be logging time that is not the time I want
 +
mw.log("Module:DefInfo:os.clock() " .. os.clock()*1000 .. " ms")
 +
 +
return p

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)

Template used on this page: