Difference between revisions of "Module:Card table sets/sandbox"

From Yugipedia
Jump to: navigation, search
(Create sandbox version of Module:Card table sets)
 
(Revision 4239539)
Line 10: Line 10:
 
local UTIL = require( 'Module:Util' )
 
local UTIL = require( 'Module:Util' )
  
local InfoWrapper = require( 'Module:InfoWrapper' )
+
local Reporter = require( 'Module:Reporter' )
 
local StringBuffer = require( 'Module:StringBuffer' )
 
local StringBuffer = require( 'Module:StringBuffer' )
 +
local getReleaseDate = require( 'Module:GetReleaseDate' )
  
 
local LANGUAGE_ENGLISH = DATA.getLanguage( 'English' )
 
local LANGUAGE_ENGLISH = DATA.getLanguage( 'English' )
Line 18: Line 19:
 
local mwHtmlCreate = mw.html.create
 
local mwHtmlCreate = mw.html.create
  
local Log;
+
local reporter;
  
local function dumpLog()
+
local function formatCardNumber( cardNumber )
local formatError = function( err )
+
return cardNumber:match( '?' )
return tostring( mwHtmlCreate( 'li' )
+
and cardNumber
:tag( 'strong' )
+
or UTIL.link( cardNumber )
:wikitext( err )
 
:allDone()
 
)
 
end
 
 
 
local createErrorContainer = function()
 
return tostring( mwHtmlCreate( 'div' )
 
:addClass( 'cts__errors' )
 
:tag( 'ul' )
 
:node( Log:dumpErrors( formatError ) )
 
:allDone()
 
)
 
end
 
 
 
return StringBuffer()
 
:add( createErrorContainer() )
 
:add( Log:dumpCategories() )
 
:toString()
 
 
end
 
end
  
local function getSetReleaseDate( setName, regionFull ) -- TODO: move to a dedicated script.
+
local function validateRarities( rarities, lineno )
local prop = table.concat{ regionFull, ' release date' }
+
local validated = {}
 
 
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
 
local position = 0
Line 74: Line 39:
  
 
if rarity then
 
if rarity then
table.insert( mapped, UTIL.link( rarity.full ) )
+
table.insert( validated, rarity.full )
 
else
 
else
local message = ('No such rarity for `%s`, at non-empty input line number %d, at position %d.')
+
local message = ('No such rarity for `%s`, at non-empty input line %d, at non-empty position %d.')
 
:format( r, lineno, position )
 
:format( r, lineno, position )
  
Log:error( message )
+
reporter:addError( message )
 
end
 
end
 
end
 
end
 
end
 
end
  
return table.concat( mapped, '<br />' )
+
return validated
 +
end
 +
 
 +
local function printRarities( rarities )
 +
local linked = {}
 +
 
 +
for _, rarity in ipairs( rarities ) do
 +
table.insert( linked, UTIL.link( rarity ) )
 +
end
 +
 
 +
return table.concat( linked, '<br />' )
 +
end
 +
 
 +
local function setSMWProps( cardNumber, setName, rarities, regionFull )
 +
if not mw.smw then
 +
reporter:addError( 'SMW is not available!' )
 +
 
 +
return
 +
end
 +
 
 +
local setInfoProp = ('--- %s --- %s --- %s --- %s ---')
 +
:format(
 +
cardNumber,
 +
setName,
 +
table.concat( rarities, ',' ),
 +
regionFull
 +
)
 +
 
 +
local jsonRarities = {}
 +
 
 +
for _, rarity in ipairs( rarities ) do
 +
table.insert( jsonRarities, '"' .. rarity .. '"' )
 +
end
 +
 
 +
local setInfoJSONProp = ('{ "number": "%s", "name": "%s", "rarity": [%s], "region": "%s" }')
 +
:format(
 +
cardNumber,
 +
setName,
 +
table.concat( jsonRarities, ',' ),
 +
regionFull
 +
)
 +
 
 +
local setRes = mw.smw.set{
 +
['Set information'] = setInfoProp,
 +
['Set information (JSON)'] = setInfoJSONProp,
 +
}
 +
 
 +
if not setRes then
 +
reporter:addError( "Failed to set SMW properties for set information!" )
 +
end
 
end
 
end
  
Line 120: Line 134:
 
end
 
end
  
local function createDataRow( regionFull, languageFull, line, lineno )
+
local function createDataRow( region, languageFull, line, lineno )
 
local parts = mwText.split( line, '%s*;%s*' )
 
local parts = mwText.split( line, '%s*;%s*' )
  
local cardNumber = parts[ 1 ]
+
local cardNumber = UTIL.trim( parts[ 1 ] )
local setName = parts[ 2 ]
+
local setName = UTIL.trim( parts[ 2 ] )
local rarities = parts[ 3 ]
+
local rarities = UTIL.trim( parts[ 3 ] )
and mwText.split( parts[ 3 ], '%s*,%s*' )
+
and validateRarities(
 +
mwText.split( parts[ 3 ], '%s*,%s*' ),
 +
lineno
 +
)
 
or {}
 
or {}
 +
 +
if not setName then
 +
local message = ('No set name given at non-empty input line %d.')
 +
:format( lineno )
 +
 +
reporter:addWarning( message )
 +
end
  
 
local tr = mwHtmlCreate( 'tr' )
 
local tr = mwHtmlCreate( 'tr' )
:node( createCell( 'release', getSetReleaseDate( setName, regionFull ) ) )
+
:node( createCell( 'release', setName and getReleaseDate( setName, region ) ) )
:node( createCell( 'number', UTIL.link( cardNumber ) ) )
+
:node( createCell( 'number', cardNumber and formatCardNumber( cardNumber ) ) )
:node( createCell( 'set', UTIL.italicLink( setName ) ) )
+
:node( createCell( 'set', setName and UTIL.italicLink( setName ) ) )
  
 
if languageFull ~= LANGUAGE_ENGLISH.full then
 
if languageFull ~= LANGUAGE_ENGLISH.full then
Line 143: Line 167:
 
end
 
end
  
tr:node( createCell( 'rarity', mapRarities( rarities, lineno ) ) )
+
tr:node( createCell( 'rarity', printRarities( rarities ) ) )
 +
 
 +
setSMWProps( cardNumber or '', setName or '', rarities, region.full )
  
 
return tostring( tr )
 
return tostring( tr )
Line 150: Line 176:
  
 
local function main( regionInput, setsInput )
 
local function main( regionInput, setsInput )
Log = InfoWrapper( 'Card table sets' )
+
reporter = Reporter( 'Card table sets' )
  
local region = DATA.getRegion( regionInput )
+
local region = DATA.getRegion( regionInput ) -- TODO: handle incorrect regions (necessary?)
  
 
local language = DATA.getLanguage( regionInput )
 
local language = DATA.getLanguage( regionInput )
Line 162: Line 188:
 
:node( createHeaderRow( language.full ) )
 
:node( createHeaderRow( language.full ) )
  
local lineno = 0 -- Non-empty lines count.
+
if UTIL.trim( setsInput ) then
 +
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
lineno = lineno + 1
+
lineno = lineno + 1
  
setsTable:node( createDataRow( region.full, language.full, line, lineno ) )
+
setsTable:node( createDataRow( region, language.full, line, lineno ) )
 +
end
 
end
 
end
 +
else
 +
local message = 'No input given for the sets.'
 +
 +
local category = '((Card table sets)) transclusions with no input (((1)))'
 +
 +
reporter
 +
:addError( message )
 +
:addCategory( category )
 
end
 
end
  
 
return StringBuffer()
 
return StringBuffer()
:addLine( dumpLog() )
+
:add( reporter:dump() )
 
:add( tostring( setsTable ) )
 
:add( tostring( setsTable ) )
 
:toString()
 
:toString()
Line 182: Line 218:
 
local arguments = frame:getParent().args
 
local arguments = frame:getParent().args
  
return main( arguments.region, arguments[ 1 ] )
+
return main( arguments[ 'region' ], arguments[ 1 ] )
 
end
 
end
 
}, {
 
}, {

Revision as of 00:26, 10 January 2020

-- <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 Reporter = require( 'Module:Reporter' )
local StringBuffer = require( 'Module:StringBuffer' )
local getReleaseDate = require( 'Module:GetReleaseDate' )

local LANGUAGE_ENGLISH = DATA.getLanguage( 'English' )

local mwText = mw.text
local mwHtmlCreate = mw.html.create

local reporter;

local function formatCardNumber( cardNumber )
	return cardNumber:match( '?' )
		and cardNumber
		or UTIL.link( cardNumber )
end

local function validateRarities( rarities, lineno )
	local validated = {}

	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( validated, rarity.full )
			else
				local message = ('No such rarity for `%s`, at non-empty input line %d, at non-empty position %d.')
					:format( r, lineno, position )

				reporter:addError( message )
			end
		end
	end

	return validated
end

local function printRarities( rarities )
	local linked = {}

	for _, rarity in ipairs( rarities ) do
		table.insert( linked, UTIL.link( rarity ) )
	end

	return table.concat( linked, '<br />' )
end

local function setSMWProps( cardNumber, setName, rarities, regionFull )
	if not mw.smw then
		reporter:addError( 'SMW is not available!' )

		return
	end

	local setInfoProp = ('--- %s --- %s --- %s --- %s ---')
		:format(
			cardNumber,
			setName,
			table.concat( rarities, ',' ),
			regionFull
		)

	local jsonRarities = {}

	for _, rarity in ipairs( rarities ) do
		table.insert( jsonRarities, '"' .. rarity .. '"' )
	end

	local setInfoJSONProp = ('{ "number": "%s", "name": "%s", "rarity": [%s], "region": "%s" }')
		:format(
			cardNumber,
			setName,
			table.concat( jsonRarities, ',' ),
			regionFull
		)

	local setRes = mw.smw.set{
		['Set information'] = setInfoProp,
		['Set information (JSON)'] = setInfoJSONProp,
	}

	if not setRes then
		reporter:addError( "Failed to set SMW properties for set information!" )
	end
end

local function createHeader( id, text )
	return tostring( mwHtmlCreate( 'th' )
		:attr( 'scope', 'col' )
		: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' )
		:wikitext( text )
	)
end

local function createDataRow( region, languageFull, line, lineno )
	local parts = mwText.split( line, '%s*;%s*' )

	local cardNumber = UTIL.trim( parts[ 1 ] )
	local setName = UTIL.trim( parts[ 2 ] )
	local rarities = UTIL.trim( parts[ 3 ] )
		and validateRarities(
			mwText.split( parts[ 3 ], '%s*,%s*' ),
			lineno
		)
		or {}

	if not setName then
		local message = ('No set name given at non-empty input line %d.')
			:format( lineno )

		reporter:addWarning( message )
	end

	local tr = mwHtmlCreate( 'tr' )
		:node( createCell( 'release', setName and getReleaseDate( setName, region ) ) )
		:node( createCell( 'number', cardNumber and formatCardNumber( cardNumber ) ) )
		:node( createCell( 'set', setName and UTIL.italicLink( setName ) ) )

	if languageFull ~= LANGUAGE_ENGLISH.full then
		tr:node(
			createCell(
				'set-localized',
				UTIL.getName( setName, languageFull )
			)
		)
	end

	tr:node( createCell( 'rarity', printRarities( rarities ) ) )

	setSMWProps( cardNumber or '', setName or '', rarities, region.full )

	return tostring( tr )
end


local function main( regionInput, setsInput )
	reporter = Reporter( 'Card table sets' )

	local region = DATA.getRegion( regionInput ) -- TODO: handle incorrect regions (necessary?)

	local language = DATA.getLanguage( regionInput )

	local setsTable = mwHtmlCreate( 'table' )
		:addClass( 'wikitable' )
		:addClass( 'sortable' )
		:addClass( 'card-list' )
		:node( createHeaderRow( language.full ) )

	if UTIL.trim( setsInput ) then
		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, language.full, line, lineno ) )
			end
		end
	else
		local message = 'No input given for the sets.'

		local category = '((Card table sets)) transclusions with no input (((1)))'

		reporter
			:addError( message )
			:addCategory( category )
	end

	return StringBuffer()
		:add( reporter:dump() )
		: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>