BryghtShadow (talk | contribs) mNo edit summary |
BryghtShadow (talk | contribs) (using mw.html) |
||
Line 4: | Line 4: | ||
local render_unit_icon = require('Module:Render/Unit')._icon |
local render_unit_icon = require('Module:Render/Unit')._icon |
||
local model = require('Module:Data').model |
local model = require('Module:Data').model |
||
+ | |||
+ | local function makeInfobox(args) |
||
+ | local root = mw.html.create('div') |
||
+ | root:addClass('infobox') |
||
+ | root:addClass(args.class) |
||
+ | root:css{ |
||
+ | ['float'] = 'right', |
||
+ | ['margin-left'] = '15px', |
||
+ | ['width'] = '300px', |
||
+ | ['border'] = '1px solid #aaa', |
||
+ | ['background'] = '#eee', |
||
+ | ['font-size'] = '12px', |
||
⚫ | |||
+ | local heading = root:tag('div') |
||
+ | heading:addClass('heading') |
||
+ | heading:css{ |
||
+ | ['background'] = 'goldenrod', |
||
+ | ['font-weight'] = 700, |
||
+ | ['font-size'] = '140%', |
||
+ | ['line-height'] = '1.25em', |
||
+ | ['display'] = 'flex', |
||
+ | ['flex-direction'] = 'row', |
||
+ | ['justify-items'] = 'flex-start', |
||
+ | ['text-align'] = 'center', |
||
+ | ['min-height'] = '64px', |
||
⚫ | |||
+ | local icon = heading:tag('div') |
||
+ | icon:addClass('infobox-icon') |
||
+ | icon:css{ |
||
+ | ['flex'] = '0 0 64px', |
||
+ | ['padding'] = '0.25rem', |
||
⚫ | |||
+ | icon:node(args.icon) |
||
+ | local name = heading:tag('div') |
||
+ | name:addClass('name') |
||
+ | name:css{ |
||
+ | ['flex'] = '1 1 100%', |
||
+ | ['display'] = 'flex', |
||
+ | ['text-align'] = 'center', |
||
+ | ['align-items'] = 'center', |
||
+ | ['justify-content'] = 'center', |
||
+ | ['margin'] = '0', |
||
+ | ['padding'] = '0.25rem', |
||
⚫ | |||
+ | name:wikitext(args.name) |
||
+ | local wrapper = root:tag('div') |
||
+ | wrapper:addClass('wrapper') |
||
+ | wrapper:css{ |
||
+ | ['flex'] = '1 1 100%', |
||
+ | ['overflow']='hidden', |
||
⚫ | |||
+ | local dl = wrapper:tag('dl') |
||
+ | dl:css{ |
||
+ | ['display'] = 'grid', |
||
+ | ['grid-template-columns'] = '100px 1fr', |
||
⚫ | |||
+ | |||
+ | local function printRow(t, label, content) |
||
+ | if content == nil then return end |
||
⚫ | |||
+ | dt:css{ |
||
+ | ['grid-column-start'] = 1, |
||
+ | ['padding'] = '2px 8px 2px 3px', |
||
+ | ['text-align'] = 'right', |
||
+ | ['border-right'] = '2px solid #aaa', |
||
+ | ['margin'] = '0 -2px 0 0', |
||
+ | } |
||
+ | dt:wikitext(label) |
||
+ | local dd = t:tag('dd') |
||
+ | dd:css{ |
||
+ | ['grid-column-start'] = 2, |
||
+ | ['margin'] = 0, |
||
+ | ['padding'] = '2px 7px', |
||
+ | ['border-left'] = '2px solid #aaa', |
||
+ | } |
||
+ | dd:wikitext(content) |
||
⚫ | |||
⚫ | |||
+ | for i, label in ipairs(args.labels) do |
||
+ | printRow(dl, label, args.rows[label]) |
||
⚫ | |||
+ | |||
+ | return tostring(root) |
||
⚫ | |||
local p = {} |
local p = {} |
||
Line 43: | Line 127: | ||
local data = rows[1] |
local data = rows[1] |
||
local getLoc = function(param) return model.getLoc(data._pageName, param) end |
local getLoc = function(param) return model.getLoc(data._pageName, param) end |
||
+ | local name = getLoc('name') |
||
⚫ | |||
− | local |
+ | local icon = mw.html.create('div') |
+ | icon:addClass('item-icon') |
||
+ | local img = icon:tag('div') |
||
+ | img:addClass('img x-'..data.rare..' y-4') |
||
+ | img:css{ |
||
+ | ['width'] = '57px', |
||
+ | ['height'] = '57px', |
||
+ | ['padding'] = '3.5px', |
||
+ | } |
||
+ | img:wikitext('[[File:Game,ConceptCardIcon,',data.icon,'.png|57px]]') |
||
⚫ | |||
⚫ | |||
⚫ | |||
+ | local releaseDates |
||
+ | for _, region in ipairs{'jp', 'gl'} do |
||
+ | local date = extra[region..'Date'] |
||
⚫ | |||
+ | releaseDates = releaseDates or mw.html.create('ul') |
||
+ | releaseDates:tag('li'):wikitext(region:upper(), ': ', date) |
||
⚫ | |||
⚫ | |||
+ | |||
local cats = { |
local cats = { |
||
'Memento' |
'Memento' |
||
} |
} |
||
+ | local root = mw.html.create() |
||
-- Info Box |
-- Info Box |
||
+ | local infobox = makeInfobox{ |
||
− | table.insert(sb, '{| class="wikitable unit ibox" style="float:right; margin-left: 15px;margin-bottom:0; width: 482px"\n| style="padding:0;width:128px;white-space: nowrap" | ') |
||
− | + | name = name, |
|
+ | icon = icon, |
||
− | table.insert(sb, render_memento_icon({iname, data=data, size='large', name='none', link='none'})) |
||
+ | labels = { |
||
− | table.insert(sb, '\n! colspan="2" style="padding:12px;font-size:140%;" | ') |
||
+ | 'Type', |
||
− | table.insert(sb, name) |
||
+ | 'Rank', |
||
− | table.insert(sb, '<span style="font-size:65%"><br/>\n') |
||
+ | 'Max level', |
||
− | table.insert(sb, data.rare + 1) |
||
+ | 'Enhancer cost', |
||
− | table.insert(sb, '★ Memento<br/>\n') |
||
+ | 'Enhancer EXP', |
||
− | table.insert(sb, '[http://www.alchemistcodedb.com/card/' .. string.lower(string.gsub(iname, '_', '-')) .. ' See on Alchemist Code Database]\n') |
||
+ | 'Enhancer trust', |
||
⚫ | |||
⚫ | |||
− | table.insert(sb, '|-\n!colspan="2"|Type\n|') |
||
+ | 'Gives unit', |
||
− | local typeMap = { |
||
− | + | 'Source', |
|
− | + | 'Release dates', |
|
− | + | 'Global only', |
|
+ | 'External links', |
||
+ | }, |
||
+ | rows = { |
||
⚫ | |||
+ | ['Rank'] = (data.rare + 1)..'★', |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
+ | ['Vision Clear Reward'] = getVCR(data), |
||
⚫ | |||
+ | ['Source'] = extra.source or 'Unreleased', |
||
+ | ['Release dates'] = releaseDates and tostring(releaseDates) or nil, |
||
+ | ['Global only'] = extra.glOnly and 'Yes' or nil, |
||
+ | ['External links'] = '[http://www.alchemistcodedb.com/card/'..iname:gsub('_','-'):lower()..' AlchemistCodeDB]', |
||
} |
} |
||
+ | } |
||
⚫ | |||
+ | root:node(infobox) |
||
− | table.insert(sb, '\n') |
||
⚫ | |||
cats[#cats+1] = typeMap[data.type] .. ' memento' |
cats[#cats+1] = typeMap[data.type] .. ' memento' |
||
⚫ | |||
− | table.insert(sb, '|-\n!colspan="2"|Max Level\n|') |
||
⚫ | |||
⚫ | |||
− | table.insert(sb, '\n') |
||
⚫ | |||
− | table.insert(sb, '|-\n!colspan="2"|Enhancer Cost (Zeni)\n|') |
||
− | table.insert(sb, data.en_cost) |
||
− | table.insert(sb, '\n') |
||
⚫ | |||
− | table.insert(sb, '|-\n!colspan="2"|Enhancer EXP\n|') |
||
− | table.insert(sb, data.en_exp) |
||
− | table.insert(sb, '\n') |
||
− | if data.en_trust then |
||
− | table.insert(sb, '|-\n!colspan="2"|Enhancer Trust\n|') |
||
⚫ | |||
− | table.insert(sb, '\n') |
||
end |
end |
||
⚫ | |||
⚫ | |||
⚫ | |||
− | table.insert(sb, '|-\n!colspan="2"|Vision Clear Reward\n|') |
||
− | table.insert(sb, vcr) |
||
− | table.insert(sb, '\n') |
||
⚫ | |||
⚫ | |||
− | -- Unit reward |
||
⚫ | |||
− | if unit_reward then |
||
− | table.insert(sb, '|-\n!colspan="2"|Gives Unit\n|') |
||
− | table.insert(sb, unit_reward) |
||
− | table.insert(sb, '\n') |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
− | |||
− | table.insert(sb, '|-\n!colspan="2"|Source\n|') |
||
⚫ | |||
− | if mementoExtra[iname] and mementoExtra[iname]['source'] then |
||
− | table.insert(sb, mementoExtra[iname]['source']) |
||
− | else |
||
− | table.insert(sb, 'Unreleased') |
||
⚫ | |||
⚫ | |||
− | table.insert(sb, '\n') |
||
− | |||
− | if mementoExtra[iname] then |
||
− | if mementoExtra[iname]['glDate'] then |
||
− | table.insert(sb, '|-\n!colspan="2"|Release Date\n| '..mementoExtra[iname]['glDate'].."\n") |
||
⚫ | |||
− | if mementoExtra[iname]['jpDate'] then |
||
− | table.insert(sb, '|-\n!colspan="2"|JP Release Date\n| '..mementoExtra[iname]['jpDate'].."\n") |
||
− | end |
||
− | if mementoExtra[iname]['glOnly'] then |
||
− | table.insert(sb, '|-\n!colspan="2"|Global Only\n| Yes\n') |
||
− | end |
||
− | end |
||
⚫ | |||
-- Body |
-- Body |
||
-- Card Image + Flavor |
-- Card Image + Flavor |
||
+ | root:tag('div'):addClass('responsive-img') |
||
− | table.insert(sb, '|}\n<div class="responsive-img" style="margin:auto;width:fit-content">[[File:Game,ConceptCard,') |
||
+ | :css{ |
||
− | table.insert(sb, data.icon) |
||
+ | ['margin'] = 'auto', |
||
− | table.insert(sb, '.png]]<div style="max-width:1024px;padding:8px;">') |
||
+ | ['width'] = 'fit-content', |
||
⚫ | |||
+ | } |
||
− | table.insert(sb, '</div></div>') |
||
+ | :wikitext('[[File:Game,ConceptCard,', data.icon, '.png]]') |
||
⚫ | |||
+ | :tag('div'):addClass('flavor') |
||
+ | :css{ |
||
+ | ['max-width'] = '1024px', |
||
+ | ['padding'] = '8px', |
||
+ | } |
||
⚫ | |||
+ | -- TODO: Stats + Effects |
||
+ | |||
-- Category |
-- Category |
||
for i, cat in ipairs(cats) do |
for i, cat in ipairs(cats) do |
||
− | + | root:wikitext('[[Category:', cat, ']]') |
|
end |
end |
||
-- TODO Implement http://cdn.alchemistcodedb.com/assets/big-card-frames-b34ac394d6035fb657d491b956e2c4764836b51b9361fccc4b31e722a27df510.png |
-- TODO Implement http://cdn.alchemistcodedb.com/assets/big-card-frames-b34ac394d6035fb657d491b956e2c4764836b51b9361fccc4b31e722a27df510.png |
||
− | return |
+ | return tostring(root) |
end |
end |
||
Line 189: | Line 261: | ||
if content == nil then return end |
if content == nil then return end |
||
t:tag('dt') |
t:tag('dt') |
||
− | -- : |
+ | -- :css{['grid-column-start']='1',['border-right']='2px solid #999',['margin']='0 -2px 0 0',['padding']='2px 8px 2px 3px',['text-align']='right'} |
:wikitext(label) |
:wikitext(label) |
||
t:tag('dd') |
t:tag('dd') |
||
− | -- : |
+ | -- :css{['grid-column-start']='2',['border-left']='2px solid #999',['margin']='0',['padding']='2px 7px',['text-align']='left'} |
:wikitext(content) |
:wikitext(content) |
||
end |
end |
Revision as of 03:57, 14 February 2020
Documentation for this module may be created at Module:Page/Memento/doc
local render_item_icon = require('Module:Render/Item')._icon
local render_gear_icon = require('Module:Render/Gear')._icon
local render_memento_icon = require('Module:Render/Memento')._icon
local render_unit_icon = require('Module:Render/Unit')._icon
local model = require('Module:Data').model
local function makeInfobox(args)
local root = mw.html.create('div')
root:addClass('infobox')
root:addClass(args.class)
root:css{
['float'] = 'right',
['margin-left'] = '15px',
['width'] = '300px',
['border'] = '1px solid #aaa',
['background'] = '#eee',
['font-size'] = '12px',
}
local heading = root:tag('div')
heading:addClass('heading')
heading:css{
['background'] = 'goldenrod',
['font-weight'] = 700,
['font-size'] = '140%',
['line-height'] = '1.25em',
['display'] = 'flex',
['flex-direction'] = 'row',
['justify-items'] = 'flex-start',
['text-align'] = 'center',
['min-height'] = '64px',
}
local icon = heading:tag('div')
icon:addClass('infobox-icon')
icon:css{
['flex'] = '0 0 64px',
['padding'] = '0.25rem',
}
icon:node(args.icon)
local name = heading:tag('div')
name:addClass('name')
name:css{
['flex'] = '1 1 100%',
['display'] = 'flex',
['text-align'] = 'center',
['align-items'] = 'center',
['justify-content'] = 'center',
['margin'] = '0',
['padding'] = '0.25rem',
}
name:wikitext(args.name)
local wrapper = root:tag('div')
wrapper:addClass('wrapper')
wrapper:css{
['flex'] = '1 1 100%',
['overflow']='hidden',
}
local dl = wrapper:tag('dl')
dl:css{
['display'] = 'grid',
['grid-template-columns'] = '100px 1fr',
}
local function printRow(t, label, content)
if content == nil then return end
local dt = t:tag('dt')
dt:css{
['grid-column-start'] = 1,
['padding'] = '2px 8px 2px 3px',
['text-align'] = 'right',
['border-right'] = '2px solid #aaa',
['margin'] = '0 -2px 0 0',
}
dt:wikitext(label)
local dd = t:tag('dd')
dd:css{
['grid-column-start'] = 2,
['margin'] = 0,
['padding'] = '2px 7px',
['border-left'] = '2px solid #aaa',
}
dd:wikitext(content)
end
for i, label in ipairs(args.labels) do
printRow(dl, label, args.rows[label])
end
return tostring(root)
end
local p = {}
local typeMap = {
['1'] = 'Equipment',
['2'] = 'Enhance EXP',
['3'] = 'Enhance Trust',
}
local maxLevels = {1, 25, 30, 35, 40}
local function getVCR(data)
local t = {}
local f = function(s, render_icon)
local counts = data['trust_'..s..'_counts']
for i, v in ipairs(data['trust_'..s..'_names']) do
-- table.insert(sb2, i)
-- table.insert(sb2, (counts[i] > 1) and counts[i] or nil)
table.insert(t, render_icon({v, name = 'none', count = counts[i] > 1 and counts[i] or nil}))
end
end
f('item', render_item_icon)
f('artifact', render_gear_icon)
return #t > 0 and table.concat(t) or nil
end
local function getUnitReward(data)
local iname = data.first_get_unit or ''
if iname == '' then return nil end
return render_unit_icon{iname, size='small'}
end
local renderPage = function(iname)
local rows = model.query('ConceptCard','_pageName,server,rare,icon,en_cost,en_exp,en_trust,first_get_unit,trust_item_names,trust_item_counts,trust_artifact_names,trust_artifact_counts,type',{where='iname="'..iname..'"'})
if #rows == 0 then
return '`'..iname..'` not found in ConceptCard table.'
end
local data = rows[1]
local getLoc = function(param) return model.getLoc(data._pageName, param) end
local name = getLoc('name')
local icon = mw.html.create('div')
icon:addClass('item-icon')
local img = icon:tag('div')
img:addClass('img x-'..data.rare..' y-4')
img:css{
['width'] = '57px',
['height'] = '57px',
['padding'] = '3.5px',
}
img:wikitext('[[File:Game,ConceptCardIcon,',data.icon,'.png|57px]]')
local maxLevels = {1, 25, 30, 35, 40}
-- Memento extra data
local extra = mw.loadData("Module:Data/Extra/Memento")[iname] or {}
local releaseDates
for _, region in ipairs{'jp', 'gl'} do
local date = extra[region..'Date']
if date then
releaseDates = releaseDates or mw.html.create('ul')
releaseDates:tag('li'):wikitext(region:upper(), ': ', date)
end
end
local cats = {
'Memento'
}
local root = mw.html.create()
-- Info Box
local infobox = makeInfobox{
name = name,
icon = icon,
labels = {
'Type',
'Rank',
'Max level',
'Enhancer cost',
'Enhancer EXP',
'Enhancer trust',
'Vision Clear Reward',
'Gives unit',
'Source',
'Release dates',
'Global only',
'External links',
},
rows = {
['Type'] = typeMap[data.type],
['Rank'] = (data.rare + 1)..'★',
['Max level'] = maxLevels[data.rare + 1],
['Enhancer cost'] = data.en_cost, -- zeni required to upgrade a memento with this memento
['Enhancer EXP'] = data.en_exp, -- EXP given by this memento
['Enhancer trust'] = data.en_trust,
['Vision Clear Reward'] = getVCR(data),
['Gives unit'] = getUnitReward(data),
['Source'] = extra.source or 'Unreleased',
['Release dates'] = releaseDates and tostring(releaseDates) or nil,
['Global only'] = extra.glOnly and 'Yes' or nil,
['External links'] = '[http://www.alchemistcodedb.com/card/'..iname:gsub('_','-'):lower()..' AlchemistCodeDB]',
}
}
root:node(infobox)
if data.type and typeMap[data.type] then
cats[#cats+1] = typeMap[data.type] .. ' memento'
end
-- Body
-- Card Image + Flavor
root:tag('div'):addClass('responsive-img')
:css{
['margin'] = 'auto',
['width'] = 'fit-content',
}
:wikitext('[[File:Game,ConceptCard,', data.icon, '.png]]')
:tag('div'):addClass('flavor')
:css{
['max-width'] = '1024px',
['padding'] = '8px',
}
:wikitext(getLoc('flavor'))
-- TODO: Stats + Effects
-- Category
for i, cat in ipairs(cats) do
root:wikitext('[[Category:', cat, ']]')
end
-- TODO Implement http://cdn.alchemistcodedb.com/assets/big-card-frames-b34ac394d6035fb657d491b956e2c4764836b51b9361fccc4b31e722a27df510.png
return tostring(root)
end
local function renderPage2(iname)
local rows = model.query('ConceptCard','_pageName,server,iname,rare,icon,en_cost,en_exp,en_trust,first_get_unit,trust_item_names,trust_item_counts,trust_artifact_names,trust_artifact_counts,type',{where='iname="'..iname..'"'})
if #rows == 0 then
return '`'..iname..'` not found in ConceptCard table.'
end
local data = rows[1]
local getLoc = function(param) return model.getLoc(data._pageName, param) end
local function releaseDates(data)
local jp = data.jpDate or ''
local gl = data.glDate or ''
if jp == '' and gl == '' then return end
local root = mw.html.create('ul')
if jp ~= '' then root:tag('li'):wikitext('JP: ' .. jp) end
if gl ~= '' then root:tag('li'):wikitext('GL: ' .. gl) end
return tostring(root)
end
local cats = {'Memento'}
local name = getLoc('name')
local icon = 'Game,ConceptCardIcon,'..data.icon..'.png'
local typeName = typeMap[data.type]
cats[#cats+1] = typeName .. ' mementos'
local rank = data.rare + 1
local maxLevel = maxLevels[rank]
local enhancer_cost = data.en_cost
local enhancer_exp = data.en_exp
local enhancer_trust = data.en_trust
local vcr = getVCR(data)
local unit_reward = getUnitReward(data)
local extra = mw.loadData("Module:Data/Extra/Memento")[iname] or {}
local source = extra.source or 'Unreleased'
local glDate = extra.glDate
local jpDate = extra.jpDate
local glOnly = extra.glOnly
local artwork = '[[File:Game,ConceptCard,'..data.icon..'.png]]'
local flavor = getLoc('flavor')
-- Render
local function printRow(t, label, content)
if content == nil then return end
t:tag('dt')
-- :css{['grid-column-start']='1',['border-right']='2px solid #999',['margin']='0 -2px 0 0',['padding']='2px 8px 2px 3px',['text-align']='right'}
:wikitext(label)
t:tag('dd')
-- :css{['grid-column-start']='2',['border-left']='2px solid #999',['margin']='0',['padding']='2px 7px',['text-align']='left'}
:wikitext(content)
end
local root = mw.html.create()
local infobox = root:tag('div'):addClass('infobox memento')
infobox:tag('div'):addClass('icon infobox-icon'):wikitext('[[File:'..icon..'|64px]]')
infobox:tag('div'):addClass('name'):wikitext(name)
local wrapper = infobox:tag('div'):addClass('wrapper')
local dl = wrapper:tag('dl')
printRow(dl, 'Type', typeName)
printRow(dl, 'Rank', rank .. '★')
printRow(dl, 'Max Level', maxLevel)
printRow(dl, 'Enhancer cost', enhancer_cost)
printRow(dl, 'Enhancer EXP', enhancer_exp)
printRow(dl, 'Enhancer trust', enhancer_trust)
printRow(dl, 'VCR', vcr)
printRow(dl, 'Gives Unit', unit_reward)
printRow(dl, 'Source', source)
printRow(dl, 'Release date', releaseDates(extra))
printRow(dl, 'Global only', glOnly and 'Yes' or nil)
printRow(dl, 'External links', '[http://www.alchemistcodedb.com/card/'..iname:gsub('_','-'):lower()..' AlchemistCodeDB]')
root
:tag('div')
:addClass('responsive-img')
:wikitext(artwork)
:tag('div')
:addClass('flavor')
:wikitext(flavor)
for i, cat in ipairs(cats) do
root:wikitext('[[Category:'..cat..']]')
end
return tostring(root)
end
local renderFuncs = {}
renderFuncs.Icon = render_memento_icon
local renderTransclude = function(iname, args)
local type = mw.text.trim(args[1])
args[1] = iname
return (renderFuncs[type] or renderFuncs.Name)(args)
end
function p._main(iname, args)
if not args or args.isPage then
return renderPage(iname)
else
return renderTransclude(iname, args)
end
end
p.renderPage = renderPage
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {parentFirst = true})
return renderPage(args[1])
end
function p.test(frame)
local args = require('Module:Arguments').getArgs(frame, {parentFirst = true})
return renderPage2(args[1])
end
return p