Open main menu

Yugipedia β

Module:Card collection/modules/Set gallery/handlers

< Module:Card collection‎ | modules/Set gallery
-- <pre>
--[=[Doc
@module 
@description 
@author [[User:Becasita]]
@contact [[User talk:Becasita]]
TODO:
- Cleanup
- Refactor: split responsibilities more strictly;

- Printed-name if no localized name was found (will display after the English name).
]=]

local DATA = require( 'Module:Data' )
local UTIL = require( 'Module:Util' )

local StringBuffer = require( 'Module:StringBuffer' )
local getCardImageName = require( 'Module:Card image name' );

local LANGUAGE_ENGLISH = DATA.getLanguage( 'English' )
local RARITY_COMMON = DATA.getRarity( 'Common' )

local currentTitle = mw.title.getCurrentTitle()

local NS = currentTitle.nsText

-- For testing:
local PAGENAME = NS == 'Module'
	and 'Sneak Peek Participation Cards: Series 6 (TCG-EN-LE)'
	or currentTitle.text

local TAG_BR = '<br />'

local mwTextSplit = mw.text.split

local function validateRarity( self, rawRaritiy, location )
	if not UTIL.trim( rawRaritiy ) then
		return
	end

	local rarity = DATA.getRarity( rawRaritiy )

	if not rarity then
		local message = ( 'No such rarity for `%s` at %s!' )
			:format( rawRaritiy, location )

		local category = 'transclusions with invalid rarities'

		self.reporter
			:addError( message )
			:addCategory( category )

		return {
			err = true
		}
	end

	return rarity
end

local function getRegion()
	local index = PAGENAME:match( 'CG%-(%a+)%-?' )

	local region = DATA.getRegion( index ) -- TODO: handle erroneous region (nil)?

	return region
end

local function getEdition()
	local index = PAGENAME:match( 'CG%-%a+%-(%w+)' )

	local edition = DATA.getEdition( index ) -- TODO: handle erroneous edition (nil)?

	return edition
end

local function errorEntry( lineno, region )
	return ( 'Back-%s.png | File number %d\n' ):format(
		( {
			JP = 'JP',
			AE = 'AE',
			KR = 'KR',
		} )[ region.index ] or 'EN',
		lineno
	)
end

local function wrapLocalizedName( name, language )
	return name and tostring( mw.html.create( 'span' )
		:attr{ lang = language.index }
		:wikitext( name )
	)
end

local function fileToString( file )
	return file.file or StringBuffer()
		:add( getCardImageName( file.name or file.pagename ) )
		:add( file.abbr )
		:add( file.region.index )
		:add( file.rarity.abbr )
		:add( file.edition and file.edition.abbr )
		:add( UTIL.trim( file.alt ) )
		:flush( '-' )
		:add( file.extension )
		:flush( '.' )
		:toString()
end

local function captionToString( caption )
	local nameContent = UTIL.wrapInQuotes(
		UTIL.link(
			caption.pagename,
			caption.name
		),
		LANGUAGE_ENGLISH.index
	)

	local rarityContent = ( '(%s)' ):format(
		UTIL.link(
			caption.rarity.full,
			caption.rarity.abbr
		)
	)

	local printedNameContent = caption[ 'printed-name' ]
		and ( '(as %s)' ):format(
			wrapLocalizedName(
				UTIL.wrapInQuotes(
					caption[ 'printed-name' ],
					caption.language.index
				),
				caption.language
			)
		)

	local localizedNameContent = caption.localizedName
		and wrapLocalizedName(
			UTIL.wrapInQuotes(
				caption.localizedName,
				caption.language.index
			),
			caption.language
		)

	return StringBuffer()
		:add( caption.cardNumber and UTIL.link( caption.cardNumber ) )
		:add( rarityContent )
		:flush( ' ' )
		:add( nameContent )
		:flush( TAG_BR )
		:add( localizedNameContent )
		:flush( TAG_BR )
		:add( printedNameContent )
		:flush( ' ' )
		:add( caption.description )
		:flush( TAG_BR )
		:toString()
end

local function processNotes( self, notes )
	return tostring( mw.html.create( 'div' )
		:addClass( self.utils:makeCssClass( 'notes' ) )
		:wikitext( notes )
	)
end

local handlers = {}

function handlers:initData( globalData )
	globalData.rarity = validateRarity( self, globalData.rarity, 'parameter `rarity`' )

	globalData.region = getRegion()

	globalData.language = DATA.getLanguage( globalData.region.index )

	globalData.edition = getEdition()
end

function handlers:initStructure( globalData )
	return mw.html.create( 'gallery' )
		:attr{
			heights = '175px',
			position = 'center',
			captionalign ='center',
		}
		:newline()
end

function handlers:handleEntry( entry, globalData )
	local file = {
		region = globalData.region,
		edition = globalData.edition,
	}

	local caption = {
		language = globalData.language,
	}

	local valuesIndex = 1

	local cardNameInput

	-- Card number (and abbr):
	if entry.options.abbr or globalData.abbr then
		file.abbr = entry.options.abbr or globalData.abbr
	else
		local cardNumber = UTIL.trim( entry.values[ valuesIndex ] )

		if cardNumber then
			file.abbr = mwTextSplit( cardNumber, '%-' )[ 1 ]:gsub( '/', '' )

			caption.cardNumber = cardNumber
		else
			if not entry.options.file then
				local message = ( 'Missing card number at file number %d!' )
					:format( entry.lineno )

				local category = 'transclusions with missing card number'

				self.reporter
					:addError( message )
					:addCategory( category )

				return errorEntry( entry.lineno, globalData.region )
			end
		end

		valuesIndex = valuesIndex + 1
	end

	-- Card name (English and localized):
	do
		cardNameInput = UTIL.trim( entry.values[ valuesIndex ] )

		if cardNameInput then
			local cardNameNormalized = cardNameInput:gsub( '#', '' )

			local cardNameDisplay = entry.options[ 'force-SMW' ]
				and DATA.getName( cardNameNormalized, LANGUAGE_ENGLISH )

			local tokenCardNameToLink = cardNameInput:match( 'Token%s%(' ) and UTIL.removeDab( cardNameInput ) 

			local tokenCardDab = cardNameInput:match( 'Token%s%(' ) and UTIL.getDab( cardNameInput )

			local tokenCardDescription = tokenCardDab
				and UTIL.link( cardNameInput, ( '(%s)' ):format( tokenCardDab ) )
				or nil

			file.pagename = tokenCardNameToLink or cardNameNormalized

			file.name = cardNameDisplay

			file.alt = tokenCardDab

			caption.pagename = tokenCardNameToLink or cardNameInput

			caption.name = cardNameDisplay

			caption.description = tokenCardDescription

			if globalData.language.index ~= LANGUAGE_ENGLISH.index then
				caption.localizedName = DATA.getName(
					cardNameNormalized,
					globalData.language
				)
			end
		else
			local message = ( 'Missing card name at file number %d!' )
				:format( entry.lineno )

			local category = 'transclusions with missing card name'

			self.reporter
				:addError( message )
				:addCategory( category )

			return errorEntry( entry.lineno, globalData.region )
		end

		valuesIndex = valuesIndex + 1
	end

	-- Rarity:
	do
		local rarityInput = UTIL.trim( entry.values[ valuesIndex ] )

		local rarityValidated = validateRarity(
			self,
			rarityInput,
			( 'file number %d' ):format( entry.lineno )
		)

		if ( rarityValidated or globalData.rarity or {} ).err then
			return errorEntry( entry.lineno, globalData.region )
		end

		rarityValidated = rarityValidated or globalData.rarity or RARITY_COMMON

		file.rarity = rarityValidated

		caption.rarity = rarityValidated

		valuesIndex = valuesIndex + 1
	end

	-- Alt:
	do
		file.alt = UTIL.trim( entry.values[ valuesIndex ] )
			or globalData.alt
			or getCardImageName( file.alt )

		valuesIndex = valuesIndex + 1
	end

	-- File:
	do
		file.file = entry.options.file
	end

	-- Extension:
	do -- TODO: this and other options should be validated programmatically
		local extenisonInput = entry.options.extension

		local extensionValidated = UTIL.trim( extenisonInput )

		if extenisonInput and not extensionValidated then
			local message = ( 'Empty `extension` is not allowed at line %d!' )
				:format( entry.lineno )

			local category = 'transclusions with empty extension'

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

		file.extension = extensionValidated or 'png'
	end

	-- Printed name:
	do
		local printedNameInput = entry.options[ 'printed-name' ]

		local printedNameValidated = UTIL.trim( printedNameInput )

		if printedNameInput and not printedNameValidated then
			local message = ( 'Empty `printed-name` is not allowed at line %d.' )
				:format( entry.lineno )

			local category = 'transclusions with empty printed-name'

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

		caption[ 'printed-name' ] = printedNameValidated
	end

	-- Description:
	do
		caption.description = self.utils:handleInterpolation(
			entry.options.description,
			globalData[ '$description' ],
			globalData.description
		) or caption.description
	end

	return ( '%s | %s\n' ):format(
		fileToString( file ),
		captionToString( caption )
	)
end

function handlers:finalize( mainStructure, globalData )
	local toc = mw.html.create( 'div' ):addClass( 'set-gallery__toc' )

	return toc, processNotes( self, globalData.notes ), self.frame:preprocess( tostring( mainStructure ) )
end

return handlers
-- </pre>