Jump to content
Toggle menu
  • 3.1K articles
  • 4.4K files
  • 18 users
  • 91.5K edits
Ashenzari's Archive
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Module:Spellbook: Difference between revisions

From Ashenzari's Archive
imported>Medar
Allow giving second argument for short_spell_list to only include spells from single school.
imported>Medar
New function to list spell sources for a school.
Line 6: Line 6:
   end
   end
   return false
   return false
end
local function table_keys_sorted(t)
  local keys = {}
  for k in pairs(t) do
    table.insert(keys, k)
  end
  table.sort(keys)
  return keys
end
end


Line 34: Line 43:
   end
   end
   local school = frame.args[2]
   local school = frame.args[2]
  if school == "" then school = nil end
   local spell_data = nil
   local spell_data = nil
   if school then
   if school ~= nil then
     spell_data = mw.loadData('Module:Table of spells')
     spell_data = mw.loadData('Module:Table of spells')
   end
   end
Line 47: Line 57:
   result = result .. table.concat(spell_list, ", ")
   result = result .. table.concat(spell_list, ", ")
   return result
   return result
end
function p.spell_sources(frame)
  local spell_data = mw.loadData('Module:Table of spells')
  local school = frame.args[1]
  local primary_books = frame.args[2]
  local done = {}
  local ret = ""
  if primary_books ~= nil and primary_books ~= "" then
    ret = ret .. ";Main Texts\n"
    for book in string.gmatch(primary_books, "%P+") do
      ret = ret .. frame:expandTemplate{title = "spellbook2", args = {book, school}} .. "\n"
      done[book] = true
    end
  end
  local found = {}
  for _,spell in pairs(spell_data) do
    if table_has_value(spell['schools'], school) then
      for _,book in pairs(spell['books']) do
        if not done[book] and not found[book] then
          found[book] = true
        end
      end
    end
  end
  if next(found) ~= nil then
    ret = ret .. ";Other Texts\n"
    -- TODO: ignore "the" while sorting
    for _,book in ipairs(table_keys_sorted(found)) do
      ret = ret .. frame:expandTemplate{title = "spellbook2", args = {book, school}} .. "\n"
    end
  end
  return ret:sub(1, -2)
end
end


return p
return p

Revision as of 10:13, 1 February 2016

local p = {}

local function table_has_value(t, v)

 if t ~= nil then
   for _,x in pairs(t) do if x == v then return true end end
 end
 return false

end

local function table_keys_sorted(t)

 local keys = {}
 for k in pairs(t) do
   table.insert(keys, k)
 end
 table.sort(keys)
 return keys

end

function p.spellbook_table(frame)

 local data = mw.loadData('Module:Table of spellbooks')
 local book = frame.args[1]
 if not book then
   return ""
 end
 local result = [==[{| cellpadding="5" border="1"

|- align="center" ! Tile || Spell || Type || Level ]==]

 for _,sp in ipairs(data[book]) do
   result = result .. "|-\n| " .. sp.image .. " || " ..
      sp.letter .. " - " .. sp.name .. " || " .. sp.schools .. 
      " || " .. sp.level .. "\n"
 end
 result = result .. "|}\n"
 return result

end

function p.short_spell_list(frame)

 local data = mw.loadData('Module:Table of spellbooks')
 local book = frame.args[1]
 if not book then
   return ""
 end
 local school = frame.args[2]
 if school == "" then school = nil end
 local spell_data = nil
 if school ~= nil then
   spell_data = mw.loadData('Module:Table of spells')
 end
 local result = "" .. book .. ": "
 local spell_list = {}
 for _,sp in ipairs(data[book]) do
   if school == nil or table_has_value(spell_data[sp.name]["schools"], school) then
     table.insert(spell_list, "".. sp.name .. "")
   end
 end
 result = result .. table.concat(spell_list, ", ")
 return result

end

function p.spell_sources(frame)

 local spell_data = mw.loadData('Module:Table of spells')
 local school = frame.args[1]
 local primary_books = frame.args[2]
 local done = {}
 local ret = ""
 if primary_books ~= nil and primary_books ~= "" then
   ret = ret .. ";Main Texts\n"
   for book in string.gmatch(primary_books, "%P+") do
     ret = ret .. frame:expandTemplate{title = "spellbook2", args = {book, school}} .. "\n"
     done[book] = true
   end
 end
 local found = {}
 for _,spell in pairs(spell_data) do
   if table_has_value(spell['schools'], school) then
     for _,book in pairs(spell['books']) do
       if not done[book] and not found[book] then
         found[book] = true
       end
     end
   end
 end
 if next(found) ~= nil then
   ret = ret .. ";Other Texts\n"
   -- TODO: ignore "the" while sorting
   for _,book in ipairs(table_keys_sorted(found)) do
     ret = ret .. frame:expandTemplate{title = "spellbook2", args = {book, school}} .. "\n"
   end
 end
 return ret:sub(1, -2)

end

return p