MagicArena Wiki
Advertisement

Documentation for this module may be created at Module:Cards/doc

--<nowiki>
local cardService = require("Module:CardService")
local utils = require("Module:TemplateUtils")

local p = {}

local tinsert, sub, gsub = table.insert, string.sub, string.gsub

local cardRowTemplate= [[|-valign="top"
|%s
|%s
|%s
]]

local anyCardRowTemplate= [[|-valign="top"
|%s
|%s
]]

local cardPageRowTemplate = [[|-
!%s
| %s
]]

local rulingTemplate = [[|-
|%s
|%s
]]

local cardPageTemplate = [=[{| class="article-table mdw-cardinfo-table"
%s
|}
<br/>
[[File:%s.png|265px|link=]]]=]

local numCardsPerPage = 100

local setNames = {}
setNames["KLD"]="Kaladesh"
setNames["AER"]="Aether Revolt"
setNames["W17"]="Welcome Deck 2017"
setNames["AKH"]="Amonkhet"
setNames["HOU"]="Hour of Devastation"
setNames["XLN"]="Ixalan"
setNames["RIX"]="Rivals of Ixalan"
setNames["DOM"]="Dominaria"
setNames["M19"]="Core Set 2019"
setNames["G18"]="Gift Pack"
setNames["ANA"]="Arena Only"
setNames["GRN"]="Guilds of Ravnica"
setNames["RNA"]="Ravnica Allegiance"
setNames["WAR"]="War of the Spark"
setNames["M20"]="Core Set 2020"

local function SetLinkName(setCode)
    if setCode == "HOU" then
        return "Hour of Devastation (set)"
    end
    return setNames[setCode]
end

local function SetLink(setCode)
    if setCode == "HOU" then
        return "[[Hour of Devastation (set)|Hour of Devastation]]"
    end
    return "[[" .. setNames[setCode] .. "]]"
end


local function ConcatTables(target,source)
    if not source then return end
    for _,v in pairs(source) do
        tinsert(target,v)
    end
end

local function PT(card)
    if ((card.Power == nil) or (card.Toughness == nil)) then
        if card.Loyalty ~= nil then
            return "("..card.Loyalty..")"
        else
            return ""
        end
    else
        return "("..card.Power.."/"..card.Toughness..")"
    end
end

local function DescriptionBox(card)
    return "[["..card.Name.."]] "..(card.Manacost or "").." ("..(card.cmc or 0)..")<br/>"..
    card.Type.." "..PT(card).."<br/>"..
    (card.Text or "")
end

local function ExpansionSymbol(card)
    return "{{"..card.SetCode..card.Rarity:sub(1,1).."}}"
end

local function GetRulings(card, isOtherCard)
    if card.Rulings == nil then return "" end
    local rulings = isOtherCard and mw.loadData("Module:Data/OtherRulings") or mw.loadData("Module:Data/Rulings")
    local rules = rulings[card.CardNumber]
    if rules == nil then return "" end
    local s = [=[{{clear}}
{| class="article-table mdw-cardrulings-table"
|+ Card rulings ([[Card rulings|?]])
]=]
    for _, rule in pairs(rules) do
        s = s .. string.format(rulingTemplate, rule.Date, utils.ExpandSymbols(rule.Text))
    end
    s = s .. "|}"
    return s
end

local function GenerateCardRow(card)
    return string.format(cardRowTemplate,
        "[[File:"..card.Name..".png|95px|link="..card.Name.."]]",
        DescriptionBox(card),
        ExpansionSymbol(card))
end

local function GenerateAnyCardRow(card)
    return string.format(anyCardRowTemplate,
        "[[File:"..card.Name..".png|95px|link="..card.Name.."]]",
        DescriptionBox(card))
end


local function GetReprintsTable(card)
    local row = "{{ReprintRow|%s|%s|%s|<br />%s}}\n"
    local s = "\n\n----\n{|class=\"mdw-reprint-table\"\n|+ '''Other Sets'''\n"
    for _, set in pairs(card.Sets) do
        local setTemplate = "{{" .. set.Set .. sub(set.Rarity,1,1) .. "}}"
        local imageName = card.Name .. " " .. set.Set .. " " .. set.CardNumber
        local setlink = SetLinkName(set.Set)
        local setname = setNames[set.Set]
        local flavor = set.Flavor or ""
        local text = setTemplate ..  " " .. set.Rarity .. "<br />" .. flavor
        s = s .. string.format(row, imageName, setlink, setname, text)
    end
    return s .. "|}"
end

local function GetReprints(card)
    local reprints = ""
    if card.Sets then
        reprints = "{{Clear}}\n"
        if card.Rarity == "Basic Land" then
            reprints = reprints .. "{{LandReprint}}"
        else
            reprints = reprints .. GetReprintsTable(card)
        end
    end
    return reprints
end

local function BanText(banned)
    -- table.concat didn't work here, don't know why, so manualy concat
    local bantext = ""
    for _, bannedFormat in pairs(banned) do
        bantext = bantext .. bannedFormat .. '; '
    end
    return sub(bantext, 1, -3) .. "{{MoreBannedDetails}}"
end

local function GenerateCardInfo(card)
    local contents = {}
    tinsert(contents,{"Name",card.Name})

    if card.Manacost then tinsert(contents, {"Mana Cost", card.Manacost}) end
    tinsert(contents, {"Converted Mana Cost", card.cmc or 0})
    if card.Type then tinsert(contents, {"Types", card.Type}) end
    if card.Text then tinsert(contents, {"Text", card.Text}) end
    if card.Flavor then tinsert(contents, {"Flavor", gsub(card.Flavor, "</?>", "''")}) end
    if card.Loyalty then tinsert(contents, {"Loyalty", card.Loyalty}) end
    if card.Power then tinsert(contents, {"P/T", PT(card)}) end
    tinsert(contents, {"Expansion", ExpansionSymbol(card) .. " " .. SetLink(card.SetCode)})
    tinsert(contents, {"Rarity", card.Rarity})
    if card.Banned then tinsert(contents, {"Banned In", BanText(card.Banned)}) end

    local info = ""
    for i = 1, #contents do
         info = info .. string.format(cardPageRowTemplate, contents[i][1], contents[i][2])
    end
    return info

end

local function GenerateCardPage(card)
    local cardInfo = GenerateCardInfo(card)
    local reprints = GetReprints(card)
    return string.format(cardPageTemplate,
        cardInfo,
        card.Name) .. GetRulings(card) .. reprints .. p.GetCardCategories(card)
end

local function GenerateOtherCardPage(card)
    local cardInfo = GenerateCardInfo(card)
    return string.format(cardPageTemplate,
        cardInfo,
        card.Name) ..  GetRulings(card, true) .. p.GetCardCategories(card)
end

local function GetCardsTable(cards)
    local output = {""}
    local numresults = 0
    for card in cards do
        tinsert(output, GenerateCardRow(card))
        numresults = numresults + 1
    end
    output[1] = [=[! colspan="3" align="right"|]=] .. numresults .. " result" .. (numresults ~= 1 and "s\n" or "\n")
    return table.concat(output)
end

function p.GetCardsTable(frame)
    local criteria = utils.RecreateTable(frame:getParent().args)
    local result = GetCardsTable(cardService.GetByCriteria(criteria))
    return frame:preprocess(result)
end

function p.GetOtherCardsTable(frame)
    local criteria = utils.RecreateTable(frame:getParent().args)
    local result = GetCardsTable(cardService.GetOtherByCriteria(criteria))
    return frame:preprocess(result)
end

function p.TestGetCardsTable(criteria)
    return GetCardsTable(criteria)
end

local function cardResultPageNavigation(startCard,endCard,numresults,page,linkBase)
    return [[! colspan="3" align="right"|Showing results ]]..startCard.." to "..endCard.." out of "..numresults.." "..((page == 1 ) and "" or([=[[[]=]..linkBase.. page - 1 ..[=[|Previous page]]]=])).." "..((startCard+numCardsPerPage>numresults) and "" or ([=[[[]=]..linkBase.. page + 1 ..[=[|Next page]]]=])).."\n"
end

local function GetPagedCardsTable(criteria, title)
    local titleparts = mw.text.split(title, '/', true)
    local page
    if (#titleparts == 0) or (tonumber(titleparts[#titleparts]) == nil) then
        page = 1
    else
        page = tonumber(titleparts[#titleparts])
        table.remove(titleparts, #titleparts)
    end
    local linkBase = table.concat(titleparts, '/') .. '/'

    local s = ""
    local numresults = 0
    local validCards = {}

    for card in cardService.GetByCriteria(criteria) do
        tinsert(validCards, card)
        numresults = numresults + 1
    end

    local startCard = (page - 1) * numCardsPerPage + 1
    local endCard = math.min((page - 1) * numCardsPerPage + numCardsPerPage, numresults)

    for i = startCard, endCard do
        s = s .. GenerateCardRow(validCards[i])
    end

    s = cardResultPageNavigation(startCard, endCard, numresults, page, linkBase) ..
        s .. "\n|-\n" ..
        cardResultPageNavigation(startCard,endCard,numresults,page,linkBase)
    return s
end

function p.TestGetPagedCardsTable(criteria, title)
    return GetPagedCardsTable(criteria, title)
end

function p.GetPagedCardsTable(frame)
    local criteria = utils.RecreateTable(frame.args)
    local title = frame:getParent():getTitle()
    local s = GetPagedCardsTable(criteria, title)
    return frame:preprocess(s)
end

function p.GetAnyCardRow(frame)
    local name = frame.args[1]
    local card = cardService.GetByNameIgnoreCase(name)
    return frame:preprocess(GenerateAnyCardRow(card))
end

local function GetOtherCard(name)
    local s
    local card = cardService.GetOtherByName(name)
    if card then
        s = "{{CardUnavailable}}\n{{clear}}\n" .. GenerateOtherCardPage(card)
        if card.CardNumber and (string.find(card.CardNumber, "a")) then
            local card2 = cardService.GetOtherByNumber(gsub(card.CardNumber, "a", "b"))
            s = s .. "\n{{clear}}\n<big><big><big>" .. card2.Name .. "</big></big></big>\n" .. GenerateOtherCardPage(card2)
        end
    else
        s = "There was an error generating this page. We're aware of it and will fix it soon.{{PagesWithScriptErrors}}"
    end
    return s
end

local function GetCard(card)
    local s = GenerateCardPage(card)
    if card.CardNumber and (string.find(card.CardNumber, "a")) then
        local card2 = cardService.GetByNumber(gsub(card.CardNumber, "a", "b"))
        s = s .. "\n{{clear}}\n<big><big><big>" .. card2.Name .. "</big></big></big>\n" .. GenerateCardPage(card2)
    end
    return s
end

local function GetCardPage(name)
    local card = cardService.GetByName(name)
    return card and GetCard(card) or GetOtherCard(name)
end

function p.GetCardPage(frame)
    local name = gsub( mw.uri.decode(frame:preprocess("{{PAGENAMEE}}")), "_", " ")
    return frame:preprocess(GetCardPage(name))
end

function p.GetCardCategories(card)
    local categories = {}
    tinsert(categories,"Cards")
    for _,setcode in pairs(card.Allsets) do
        tinsert(categories,setNames[setcode])
    end
    ConcatTables(categories,card.Colors)
    tinsert(categories,card.Rarity)
    ConcatTables(categories,card.SuperTypes)
    ConcatTables(categories,card.Types)
    ConcatTables(categories,card.SubTypes)
    if card.Watermark then tinsert(categories,card.Watermark) end
    if card.Sets then tinsert(categories,"Reprint") end
    if card.Banned then tinsert(categories,"Banned Card") end

    local s = ""
    for _,v in pairs(categories) do
         s = s .. "[[Category:"..v.."]]"
    end

    return s
end

return p
--</nowiki>
Advertisement