Module:Card gallery/File

From Yugipedia
Jump to: navigation, search
Module documentation[create]
-- <pre>
-- @name Card gallery/File
-- @description Card Gallery file factory. Decides which type of file to create.
-- @author [[User:Becasita]]
-- @contact [[User talk:Becasita]]

-- TODO: this could use some general cleanup, but low priority.

-------------------
-- Export variable:
------------------
local File = {};

----------------
-- Load modules:
----------------
local UTIL = require( 'Module:Util' );

---------------------
-- Utility functions:
---------------------
-- mw functions:
local  split = mw.text.split;
local gsplit = mw.text.gsplit;

--------------------
-- Module functions:
--------------------
-- @name buildStandard
-- @description Builds a "standard" object from the "standard" part of the input entry.
local function buildStandard( arg )
	local standard = {};

	if not UTIL.trim( arg ) then
		return standard;
	end

	for value in gsplit( arg, '%s*;%s*' ) do
		if value then
			table.insert( standard, UTIL.trim( value ) or '' );
		end
	end

	return standard;
end

-- @name buildReleases
-- @description Builds a "releases" object from the "releases" part of the input entry.
local function buildReleases( arg )
	local releases = {};

	if not UTIL.trim( arg ) then
		return releases;
	end

	for value in gsplit( arg, '%s*,%s*' ) do
		if value then
			table.insert( releases, UTIL.trim( value ) or '' );
		end
	end

	return releases;
end

-- @name buildOptions
-- @description Builds an "options" object from the "options" part of the input entry.
local function buildOptions( arg )
	local options = {};

	if not UTIL.trim( arg ) then
		return options;
	end

	for option in gsplit( arg, '%s*;%s*' ) do
		local opt = UTIL.trim( option );
		if opt then
			local optTemp = split( opt, '%s*::%s*' );
			local optName  = UTIL.trim( optTemp[ 1 ] );
			local optValue = UTIL.trim( optTemp[ 2 ] );
			if optName and optValue then
				options[ optName ] = optValue;
			end
		end
	end

	return options;
end

-- @name splitEntry
-- @description Splits an input entry into the standard values, the releases and the options.
local function splitEntry( entry )
	if not UTIL.trim( entry ) then
		return {}, {}, {};
	end

	local temp1   = split( entry, '//' );
	local tempOpt = table.concat( temp1, '//', 2 );
	local temp2   = split( temp1[ 1 ], '%s*::%s*' );
	local tempRel = temp2[ 2 ];
	local tempStd = temp2[ 1 ];

	local standard = buildStandard( tempStd );
	local releases = buildReleases( tempRel );
	local options  = buildOptions( tempOpt );

	return standard, releases, options;
end

-- @name factory
-- @description Decides which kind of file to instantiate.
function File.factory( cardGallery, entry )
	local galleryType = cardGallery:getType();
	local standard, releases, options = splitEntry( entry );

	local countStd = UTIL.count( standard );
	local countRel = UTIL.count( releases );
	local countOpt = UTIL.count( options );

	local Module = '';

	if countStd == 0 and countRel == 0 and countOpt == 0 then
		-- Not enough info to even try to build. TODO: barricade to delete this.
		return nil;
	elseif galleryType == 'Anime' then
		Module = 'Anime'; 
	elseif galleryType == 'Manga' then
		Module = 'Manga'; 
	elseif galleryType == 'Video games' then
		Module = 'VG';
	elseif galleryType == 'Other' then
		Module = 'Other';
	else
		-- No galleryType; defaults to the card game entries:
		if countStd < 2 and countRel > 0 then
			Module = 'NoNumberNoSet'; --Mirror Force and OEPD from the arc-v (assumes there's no edition, even for DT ones (they don't exist)).
		else
			Module = 'CG';
		end
	end

	return require( 'Module:Card gallery/File/' .. Module ).new( cardGallery, standard, releases, options );
end

----------
-- Return:
----------
return File;
-- </pre>