Difference between revisions of "Module:Card table sets"
(To implement {{Card table sets}} via Lua.) |
(Track incorrect rarity inputs.) |
||
Line 1: | Line 1: | ||
-- <pre> | -- <pre> | ||
--[=[Doc | --[=[Doc | ||
− | @module | + | @module Card table sets |
@description Handles sets. | @description Handles sets. | ||
@author [[User:Becasita]] | @author [[User:Becasita]] | ||
Line 10: | Line 10: | ||
local UTIL = require( 'Module:Util' ) | local UTIL = require( 'Module:Util' ) | ||
+ | local InfoWrapper = require( 'Module:InfoWrapper' ) | ||
local StringBuffer = require( 'Module:StringBuffer' ) | local StringBuffer = require( 'Module:StringBuffer' ) | ||
Line 16: | Line 17: | ||
local mwText = mw.text | local mwText = mw.text | ||
local mwHtmlCreate = mw.html.create | local mwHtmlCreate = mw.html.create | ||
+ | |||
+ | local Log; | ||
+ | |||
+ | local function dumpLog() | ||
+ | local formatError = function( err ) | ||
+ | return tostring( mwHtmlCreate( 'li' ) | ||
+ | :tag( 'strong' ) | ||
+ | :wikitext( err ) | ||
+ | :allDone() | ||
+ | ) | ||
+ | end | ||
+ | |||
+ | local createErrorContainer = function() | ||
+ | return tostring( mwHtmlCreate( 'div' ) | ||
+ | :addClass( 'card-table-sets__errors' ) | ||
+ | :tag( 'ul' ) | ||
+ | :node( Log:dumpErrors( formatError ) ) | ||
+ | :allDone() | ||
+ | ) | ||
+ | end | ||
+ | |||
+ | return StringBuffer() | ||
+ | :add( createErrorContainer() ) | ||
+ | :add( Log:dumpCategories() ) | ||
+ | :toString() | ||
+ | end | ||
local function getSetReleaseDate( setName, regionFull ) -- TODO: move to a dedicated script. | local function getSetReleaseDate( setName, regionFull ) -- TODO: move to a dedicated script. | ||
Line 35: | Line 62: | ||
end | end | ||
− | local function mapRarities( rarities ) | + | local function mapRarities( rarities, lineno ) |
local mapped = {} | local mapped = {} | ||
+ | |||
+ | local position = 0 | ||
for _, r in ipairs( rarities ) do | for _, r in ipairs( rarities ) do | ||
if UTIL.trim( r ) then | if UTIL.trim( r ) then | ||
+ | position = position + 1 | ||
+ | |||
local rarity = DATA.getRarity( r ) | local rarity = DATA.getRarity( r ) | ||
Line 45: | Line 76: | ||
table.insert( mapped, UTIL.link( rarity.full ) ) | table.insert( mapped, UTIL.link( rarity.full ) ) | ||
else | else | ||
− | - | + | local message = ('No such rarity for `%s`, at non-empty input line number %d, at position %d.') |
+ | :format( r, lineno, position ) | ||
+ | |||
+ | Log:error( message ) | ||
end | end | ||
end | end | ||
Line 92: | Line 126: | ||
end | end | ||
− | local function createDataRow( regionFull, languageFull, line ) | + | local function createDataRow( regionFull, languageFull, line, lineno ) |
local parts = mwText.split( line, '%s*;%s*' ) | local parts = mwText.split( line, '%s*;%s*' ) | ||
Line 102: | Line 136: | ||
local tr = mwHtmlCreate( 'tr' ) | local tr = mwHtmlCreate( 'tr' ) | ||
+ | :attr( 'id', 'card-table-sets__data-row--' .. lineno ) | ||
:node( createCell( 'release', getSetReleaseDate( setName, regionFull ) ) ) | :node( createCell( 'release', getSetReleaseDate( setName, regionFull ) ) ) | ||
:node( createCell( 'number', UTIL.link( cardNumber ) ) ) | :node( createCell( 'number', UTIL.link( cardNumber ) ) ) | ||
Line 115: | Line 150: | ||
end | end | ||
− | tr:node( createCell( 'rarity', mapRarities( rarities ) ) ) | + | tr:node( createCell( 'rarity', mapRarities( rarities, lineno ) ) ) |
return tostring( tr ) | return tostring( tr ) | ||
Line 122: | Line 157: | ||
local function main( regionInput, setsInput ) | local function main( regionInput, setsInput ) | ||
+ | Log = InfoWrapper( 'Card table sets' ) | ||
+ | |||
local region = DATA.getRegion( regionInput ) | local region = DATA.getRegion( regionInput ) | ||
Line 135: | Line 172: | ||
:done() | :done() | ||
:node( createHeaderRow( language.full ) ) | :node( createHeaderRow( language.full ) ) | ||
+ | |||
+ | local lineno = 0 -- Non-empty lines count. | ||
for line in mwText.gsplit( setsInput, '%s*\n%s*' ) do | for line in mwText.gsplit( setsInput, '%s*\n%s*' ) do | ||
if UTIL.trim( line ) then | if UTIL.trim( line ) then | ||
− | setsTable:node( createDataRow( region.full, language.full, line ) ) | + | lineno = lineno + 1 |
+ | |||
+ | setsTable:node( createDataRow( region.full, language.full, line, lineno ) ) | ||
end | end | ||
end | end | ||
− | return tostring( setsTable ) | + | return StringBuffer() |
+ | :addLine( dumpLog() ) | ||
+ | :add( tostring( setsTable ) ) | ||
+ | :toString() | ||
end | end | ||
Revision as of 23:01, 26 April 2019
-- <pre>
--[=[Doc
@module Card table sets
@description Handles sets.
@author [[User:Becasita]]
@contact [[User talk:Becasita]]
]=]
local DATA = require( 'Module:Data' )
local UTIL = require( 'Module:Util' )
local InfoWrapper = require( 'Module:InfoWrapper' )
local StringBuffer = require( 'Module:StringBuffer' )
local LANGUAGE_ENGLISH = DATA.getLanguage( 'English' )
local mwText = mw.text
local mwHtmlCreate = mw.html.create
local Log;
local function dumpLog()
local formatError = function( err )
return tostring( mwHtmlCreate( 'li' )
:tag( 'strong' )
:wikitext( err )
:allDone()
)
end
local createErrorContainer = function()
return tostring( mwHtmlCreate( 'div' )
:addClass( 'card-table-sets__errors' )
:tag( 'ul' )
:node( Log:dumpErrors( formatError ) )
:allDone()
)
end
return StringBuffer()
:add( createErrorContainer() )
:add( Log:dumpCategories() )
:toString()
end
local function getSetReleaseDate( setName, regionFull ) -- TODO: move to a dedicated script.
local prop = table.concat{ regionFull, ' release date' }
local askResult = mw.smw.ask{
table.concat{ '[[', setName, ']]' },
table.concat{ '?', prop, '#ISO' },
mainlabel = '-',
}
local dateInfo = askResult and askResult[ 1 ] or {}
-- TODO: remove when the sets store the Sneak Peek dates separately.
return type( dateInfo[ prop ] ) == type( {} )
and dateInfo[ prop ][ 1 ]
or dateInfo[ prop ]
or ''
end
local function mapRarities( rarities, lineno )
local mapped = {}
local position = 0
for _, r in ipairs( rarities ) do
if UTIL.trim( r ) then
position = position + 1
local rarity = DATA.getRarity( r )
if rarity then
table.insert( mapped, UTIL.link( rarity.full ) )
else
local message = ('No such rarity for `%s`, at non-empty input line number %d, at position %d.')
:format( r, lineno, position )
Log:error( message )
end
end
end
return table.concat( mapped, '<br />' )
end
local function createHeader( id, text )
return tostring( mwHtmlCreate( 'th' )
:attr{
scope = 'col',
id = table.concat{ 'card-table-sets__header--', id }
}
:addClass( 'card-table-sets__header' )
:wikitext( text )
)
end
local function createHeaderRow( languageFull )
local tr = mwHtmlCreate( 'tr' )
:node( createHeader( 'release', 'Release' ) )
:node( createHeader( 'number', 'Number' ) )
:node( createHeader( 'set', 'Set' ) )
if languageFull ~= LANGUAGE_ENGLISH.full then
tr:node(
createHeader(
'set-localized',
table.concat{ languageFull, ' name' }
)
)
end
tr:node( createHeader( 'rarity', 'Rarity' ) )
return tostring( tr )
end
local function createCell( id, text )
return tostring( mwHtmlCreate( 'td' )
:addClass( 'card-table-sets__data' )
:addClass( table.concat{ 'card-table-sets__data--', id } )
:wikitext( text )
)
end
local function createDataRow( regionFull, languageFull, line, lineno )
local parts = mwText.split( line, '%s*;%s*' )
local cardNumber = parts[ 1 ]
local setName = parts[ 2 ]
local rarities = parts[ 3 ]
and mwText.split( parts[ 3 ], '%s*,%s*' )
or {}
local tr = mwHtmlCreate( 'tr' )
:attr( 'id', 'card-table-sets__data-row--' .. lineno )
:node( createCell( 'release', getSetReleaseDate( setName, regionFull ) ) )
:node( createCell( 'number', UTIL.link( cardNumber ) ) )
:node( createCell( 'set', UTIL.italicLink( setName ) ) )
if languageFull ~= LANGUAGE_ENGLISH.full then
tr:node(
createCell(
'set-localized',
UTIL.getName( setName, languageFull )
)
)
end
tr:node( createCell( 'rarity', mapRarities( rarities, lineno ) ) )
return tostring( tr )
end
local function main( regionInput, setsInput )
Log = InfoWrapper( 'Card table sets' )
local region = DATA.getRegion( regionInput )
local language = DATA.getLanguage( regionInput )
local setsTable = mwHtmlCreate( 'table' )
:addClass( 'wikitable' )
:addClass( 'sortable' )
:addClass( 'card-list' )
:tag( 'caption' )
:addClass( 'mobile-show' )
:wikitext( region.full )
:done()
:node( createHeaderRow( language.full ) )
local lineno = 0 -- Non-empty lines count.
for line in mwText.gsplit( setsInput, '%s*\n%s*' ) do
if UTIL.trim( line ) then
lineno = lineno + 1
setsTable:node( createDataRow( region.full, language.full, line, lineno ) )
end
end
return StringBuffer()
:addLine( dumpLog() )
:add( tostring( setsTable ) )
:toString()
end
return setmetatable( {
main = function( frame )
local arguments = frame:getParent().args
return main( arguments.region, arguments[ 1 ] )
end
}, {
__call = function( t, ... )
return main( ... )
end,
} )
-- </pre>