Difference between revisions of "Module:Spellbook"
m (Fix pattern match in spell_sources.) |
(Support new data format: https://github.com/plampila/crawl-wiki-modules) |
||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
| − | local | + | local book_data = mw.loadData('Module:Table of spellbooks') |
| − | + | local spell_data = mw.loadData('Module:Table of spells') | |
| − | |||
| − | |||
| − | |||
| − | |||
local function table_keys_sorted(t) | local function table_keys_sorted(t) | ||
| Line 15: | Line 11: | ||
table.sort(keys) | table.sort(keys) | ||
return keys | return keys | ||
| + | end | ||
| + | |||
| + | local function spell_school_link(school) | ||
| + | local skill = nil | ||
| + | if school == 'Poison' or school == 'Air' or school == 'Fire' or | ||
| + | school == 'Ice' or school == 'Earth' then | ||
| + | skill = school .. ' Magic' | ||
| + | elseif school:sub(-1) ~= 'y' and school:sub(-1) ~= 's' then | ||
| + | -- "Necromancy" isn't pluralised as a skill, | ||
| + | -- and "Hexes" and "Charms" are already | ||
| + | -- pluralized as a magic school. The others | ||
| + | -- are singular as a school, plural as a skill. | ||
| + | skill = school .. 's' | ||
| + | end | ||
| + | |||
| + | if skill ~= nil then | ||
| + | return '[[' .. skill .. '|' .. school .. ']]' | ||
| + | else | ||
| + | return '[[' .. school .. ']]' | ||
| + | end | ||
| + | end | ||
| + | |||
| + | local function format_schools(schools, no_link_for) | ||
| + | local ret = '' | ||
| + | for school in pairs(schools) do | ||
| + | if school == no_link_for then | ||
| + | ret = ret .. school .. '/' | ||
| + | else | ||
| + | ret = ret .. spell_school_link(school) .. '/' | ||
| + | end | ||
| + | end | ||
| + | return ret:sub(1, -2) | ||
end | end | ||
function p.spellbook_table(frame) | function p.spellbook_table(frame) | ||
| − | |||
local book = frame.args[1] | local book = frame.args[1] | ||
if not book then | if not book then | ||
| − | return | + | return '' |
end | end | ||
local result = [==[{| cellpadding="5" border="1" | local result = [==[{| cellpadding="5" border="1" | ||
| Line 27: | Line 54: | ||
! Tile || Spell || Type || Level | ! Tile || Spell || Type || Level | ||
]==] | ]==] | ||
| − | for | + | local letters = 'abcdefghijklmnopqrstuvwxyz' |
| − | result = result .. | + | for i,name in pairs(book_data[book].spells) do |
| − | + | result = result .. '|-\n| [[File:' .. name:lower() .. '.png]] || ' .. | |
| − | + | letters:sub(i, i) .. ' - [[' .. name .. ']] || ' .. | |
| + | format_schools(spell_data[name].schools) .. ' || ' .. | ||
| + | spell_data[name].level .. '\n' | ||
end | end | ||
| − | result = result .. | + | result = result .. '|}\n' |
return result | return result | ||
end | end | ||
function p.short_spell_list(frame) | function p.short_spell_list(frame) | ||
| − | |||
local book = frame.args[1] | local book = frame.args[1] | ||
if not book then | if not book then | ||
| − | return | + | return '' |
end | end | ||
local school = frame.args[2] | local school = frame.args[2] | ||
| − | if school == | + | if school == '' then school = nil end |
| − | |||
| − | |||
| − | |||
| − | |||
local result = "'''[[" .. book .. "]]''': " | local result = "'''[[" .. book .. "]]''': " | ||
local spell_list = {} | local spell_list = {} | ||
| − | for _, | + | for _,name in pairs(book_data[book].spells) do |
| − | if school == nil or | + | if school == nil or spell_data[name]['schools'][school] then |
| − | table.insert(spell_list, | + | table.insert(spell_list, '[['.. name .. ']]') |
end | end | ||
end | end | ||
| − | result = result .. table.concat(spell_list, | + | result = result .. table.concat(spell_list, ', ') |
return result | return result | ||
end | end | ||
function p.spell_sources(frame) | function p.spell_sources(frame) | ||
| − | |||
| − | |||
local school = frame.args[1] | local school = frame.args[1] | ||
local primary_books = frame.args[2] | local primary_books = frame.args[2] | ||
local done = {} | local done = {} | ||
| − | local ret = | + | local ret = '' |
| − | if primary_books ~= nil and primary_books ~= | + | if primary_books ~= nil and primary_books ~= '' then |
| − | ret = ret .. | + | ret = ret .. ';Main Texts\n' |
| − | for book in string.gmatch(primary_books, | + | for book in string.gmatch(primary_books, '[^,]+') do |
| − | ret = ret .. | + | ret = ret .. ':' .. frame:expandTemplate{title = 'spellbook2', args = {book, school}} .. '\n' |
done[book] = true | done[book] = true | ||
end | end | ||
| Line 77: | Line 99: | ||
local found = {} | local found = {} | ||
for _,spell in pairs(spell_data) do | for _,spell in pairs(spell_data) do | ||
| − | if | + | if spell['schools'][school] then |
| − | for | + | for book in pairs(spell['books']) do |
if not done[book] and not found[book] then | if not done[book] and not found[book] then | ||
found[book] = true | found[book] = true | ||
| Line 87: | Line 109: | ||
if next(found) ~= nil then | if next(found) ~= nil then | ||
| − | ret = ret .. | + | ret = ret .. ';Other Texts\n' |
-- TODO: ignore "the" while sorting | -- TODO: ignore "the" while sorting | ||
for _,book in ipairs(table_keys_sorted(found)) do | for _,book in ipairs(table_keys_sorted(found)) do | ||
| − | ret = ret .. | + | ret = ret .. ':' .. frame:expandTemplate{title = 'spellbook2', args = {book, school}} .. '\n' |
end | end | ||
end | end | ||
Revision as of 11:23, 3 November 2016
This module generates the spellbook tables in the pages of the category Category:Book, and the lists of spells in the Book page.
Required by: Template:Spellbook and Template:Spellbook2.
Requires: Module:Table of spellbooks and Module:Table of spells
local p = {}
local book_data = mw.loadData('Module:Table of spellbooks')
local spell_data = mw.loadData('Module:Table of spells')
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
local function spell_school_link(school)
local skill = nil
if school == 'Poison' or school == 'Air' or school == 'Fire' or
school == 'Ice' or school == 'Earth' then
skill = school .. ' Magic'
elseif school:sub(-1) ~= 'y' and school:sub(-1) ~= 's' then
-- "Necromancy" isn't pluralised as a skill,
-- and "Hexes" and "Charms" are already
-- pluralized as a magic school. The others
-- are singular as a school, plural as a skill.
skill = school .. 's'
end
if skill ~= nil then
return '[[' .. skill .. '|' .. school .. ']]'
else
return '[[' .. school .. ']]'
end
end
local function format_schools(schools, no_link_for)
local ret = ''
for school in pairs(schools) do
if school == no_link_for then
ret = ret .. school .. '/'
else
ret = ret .. spell_school_link(school) .. '/'
end
end
return ret:sub(1, -2)
end
function p.spellbook_table(frame)
local book = frame.args[1]
if not book then
return ''
end
local result = [==[{| cellpadding="5" border="1"
|- align="center"
! Tile || Spell || Type || Level
]==]
local letters = 'abcdefghijklmnopqrstuvwxyz'
for i,name in pairs(book_data[book].spells) do
result = result .. '|-\n| [[File:' .. name:lower() .. '.png]] || ' ..
letters:sub(i, i) .. ' - [[' .. name .. ']] || ' ..
format_schools(spell_data[name].schools) .. ' || ' ..
spell_data[name].level .. '\n'
end
result = result .. '|}\n'
return result
end
function p.short_spell_list(frame)
local book = frame.args[1]
if not book then
return ''
end
local school = frame.args[2]
if school == '' then school = nil end
local result = "'''[[" .. book .. "]]''': "
local spell_list = {}
for _,name in pairs(book_data[book].spells) do
if school == nil or spell_data[name]['schools'][school] then
table.insert(spell_list, '[['.. name .. ']]')
end
end
result = result .. table.concat(spell_list, ', ')
return result
end
function p.spell_sources(frame)
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, '[^,]+') 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 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