Difference between revisions of "Module:Card gallery/File/CG"
< Module:Card gallery | File
m (Fix the rest of the "for"s...) |
m (Cleanup.) |
||
Line 4: | Line 4: | ||
-- @author [[User:Becasita]] | -- @author [[User:Becasita]] | ||
-- @contact [[User talk:Becasita]] | -- @contact [[User talk:Becasita]] | ||
+ | |||
+ | -- « | ||
+ | -- <card number>; <set>; <rarity>; <edition>; <alt> :: <release> // <option1>::<value1>; <optionN>::<valueN> | ||
+ | -- » | ||
---------------- | ---------------- | ||
Line 45: | Line 49: | ||
function File.new( std, rel, opt, data ) | function File.new( std, rel, opt, data ) | ||
-- @attr _standard -> Contains the trimmed input args for the standard input {enum-like}. | -- @attr _standard -> Contains the trimmed input args for the standard input {enum-like}. | ||
− | -- @attr | + | -- @attr _releases -> Contains the trimmed input args for the releases (OP|GC|CT|RP) {enum-like}. |
-- @attr _options -> Contains the trimmed input args for the options {map-like}. | -- @attr _options -> Contains the trimmed input args for the options {map-like}. | ||
File.counter = File.counter + 1; | File.counter = File.counter + 1; | ||
Line 57: | Line 61: | ||
}; | }; | ||
fileData._standard = std or {}; | fileData._standard = std or {}; | ||
− | fileData. | + | fileData._releases = rel or {}; |
fileData._options = opt or {}; | fileData._options = opt or {}; | ||
Line 71: | Line 75: | ||
-- Build file: | -- Build file: | ||
− | local file | + | local file = { |
getImgName(), self.setAbbr, self.rg | getImgName(), self.setAbbr, self.rg | ||
}; | }; | ||
− | if self.r | + | if self.r then table.insert( file, self.r ) end |
− | if self.ed | + | if self.ed then table.insert( file, self.ed ) end |
for _, rel in ipairs( self.rels ) do | for _, rel in ipairs( self.rels ) do | ||
table.insert( file, rel ); | table.insert( file, rel ); | ||
Line 175: | Line 179: | ||
end | end | ||
− | -- @name | + | -- @name initReleases |
-- @description Sets the «releases» and «rels» attributes. | -- @description Sets the «releases» and «rels» attributes. | ||
− | function File: | + | function File:initReleases() |
local releasesAsKeys = {}; -- Unsorted; each release is a key, to prevent duplicates. | local releasesAsKeys = {}; -- Unsorted; each release is a key, to prevent duplicates. | ||
− | for _, value in ipairs( self. | + | for _, value in ipairs( self._releases ) do |
local release = DATA.getRelease( value ); | local release = DATA.getRelease( value ); | ||
if release then | if release then | ||
Line 281: | Line 285: | ||
:initNumber() | :initNumber() | ||
:initSet() | :initSet() | ||
− | : | + | :initReleases() |
:initRarity() | :initRarity() | ||
:initEdition() | :initEdition() |
Revision as of 23:02, 14 June 2018
-- <pre>
-- @name Card gallery/File/CG
-- @description Card Gallery file class for card game entries.
-- @author [[User:Becasita]]
-- @contact [[User talk:Becasita]]
-- «
-- <card number>; <set>; <rarity>; <edition>; <alt> :: <release> // <option1>::<value1>; <optionN>::<valueN>
-- »
----------------
-- Load modules:
----------------
local DATA = require( 'Module:Data' );
local UTIL = require( 'Module:Util' );
local getName = require( 'Module:Name' ).main;
local getImgName = require( 'Module:Card image name' ).main;
--------------
-- File class:
--------------
-- @name File
-- @classAttr counter -> [static] Counts the number of File instances.
local File = {};
File.__index = File;
File.counter = 0;
-- @name new -> File constructor.
-- @attr DATA -> External data (the «_D» from other modules).
-- @attr flags -> Control flags:
-- -- exists => denotes if a file is to be printed.
-- -- noEdition => if it is a Japanese or Chinese print; thus, no edition (except DT ones).
-- -- isOP => if it is an Official Proxy.
-- @attr number -> The card number.
-- @attr rg -> The region index.
-- @attr set -> The set name inputted.
-- @attr setEn -> The English name for the set.
-- @attr setLn -> The localized name for the set.
-- @attr setAbbr -> The set abbreviation.
-- @attr rarity -> The rarity name.
-- @attr r -> The rarity abbreviation.
-- @attr edition -> The full edition.
-- @attr ed -> The edition abbreviation.
-- @attr releases -> The card releases.
-- @attr rels -> The card releases abbreviations (OP|GC|CT|RP).
-- @attr alt -> The alt value.
-- @attr extension -> The file extension.
-- @attr description -> A short file description.
function File.new( std, rel, opt, data )
-- @attr _standard -> Contains the trimmed input args for the standard input {enum-like}.
-- @attr _releases -> Contains the trimmed input args for the releases (OP|GC|CT|RP) {enum-like}.
-- @attr _options -> Contains the trimmed input args for the options {map-like}.
File.counter = File.counter + 1;
local fileData = {};
fileData.DATA = data;
fileData.errors = {};
fileData.flags = {
exists = true,
noEdition = false,
isOP = false
};
fileData._standard = std or {};
fileData._releases = rel or {};
fileData._options = opt or {};
return setmetatable( fileData, File ):init();
end
-- @name __tostring
-- @description [metamethod] Renders the File.
function File:__tostring()
if not self.flags.exists then
return '';
end
-- Build file:
local file = {
getImgName(), self.setAbbr, self.rg
};
if self.r then table.insert( file, self.r ) end
if self.ed then table.insert( file, self.ed ) end
for _, rel in ipairs( self.rels ) do
table.insert( file, rel );
end
if self.flags.isOP then table.insert( file, 'OP' ) end
if self.alt then table.insert( file, self.alt ) end
-- Build caption: (this might get better implementation in the future)
local caption = {};
local temp1st = {};
if self.number then table.insert( temp1st, UTIL.link( self.number ) ) end
if self.rarity then
table.insert(
temp1st,
('(%s)'):format( UTIL.link( self.rarity, self.r ) )
);
end
if UTIL.count( temp1st ) ~= 0 then
table.insert( caption, table.concat( temp1st, ' ' ) );
end
if self.edition then table.insert( caption, UTIL.link( self.edition ) ) end
for _, release in ipairs( self.releases ) do
table.insert( caption, UTIL.link( release ) );
end
if self.flags.isOP then table.insert( caption, UTIL.link( 'Official Proxy' ) ) end
table.insert(
caption,
UTIL.italics(
UTIL.link(
self.set,
self.setEn:match( '%(2011%)' ) and self.setEn -- or self.setEn:match( '%(series%)' )
)
)
);
if self.description then table.insert( caption, self.description ) end
-- Stringify:
local fileString = ('%s.%s'):format( table.concat( file, '-' ), self.extension );
local captionString = table.concat( caption, '<br />' );
-- Return concatenation:
return ('%s | %s'):format( fileString, captionString );
end
-- @name error
-- @description Generate consistent error messages.
function File:error( parameter )
self.flags.exists = false;
table.insert( self.errors, ('No %s given for file input number %d!'):format( parameter, File.counter ) );
return self;
end
-- @name initRegion
-- @description Sets the «rg» attribute.
function File:initRg()
self.rg = self.DATA.rg:upper();
self.flags.noEdition = self.rg == 'JP' or self.rg == 'JA' or self.rg == 'TC';
return self;
end
-- @name initNumber
-- @description Sets the «number» and «setAbbr» attributes.
function File:initNumber()
local cardNumber = self._standard[ 1 ];
if cardNumber == '' then
return self:error( 'set abbreviation' );
end
if cardNumber and cardNumber:match( '^%w-%-%w-$' ) then
-- Input like «TLM-EN012».
self.number = cardNumber:upper();
self.setAbbr = self.number:match( '^(%w-)%-%w-$' );
else
-- Input like «S1».
self.number = nil;
self.setAbbr = cardNumber:upper();
end
return self;
end
-- @name initSet
-- @description Sets the «set», «setEn» and «setLn» attributes.
function File:initSet()
local set = self._standard[ 2 ];
if set == '' then
return self:error( 'set name' );
end
self.set = set;
self.setEn = getName( set ) or set;
self.setLn = getName( set, self.DATA.language );
return self;
end
-- @name initReleases
-- @description Sets the «releases» and «rels» attributes.
function File:initReleases()
local releasesAsKeys = {}; -- Unsorted; each release is a key, to prevent duplicates.
for _, value in ipairs( self._releases ) do
local release = DATA.getRelease( value );
if release then
releasesAsKeys[ release ] = true;
else
table.insert(
self.errors,
('Invalid release value %s given for file input number %d!'):format( value, File.counter )
);
end
end
local releases = {};
for releaseAsKey in pairs( releasesAsKeys ) do
table.insert( releases, releaseAsKey );
end
table.sort( releases );
self.releases = {};
self.rels = {};
for _, release in ipairs( releases ) do
local rel = DATA.getRel( release ):upper();
self.flags.isOP = (
rel == 'OP'
or
table.insert( self.releases, release ) -- Insert the release name (this returns nil).
or
table.insert( self.rels, rel ) -- Insert the release abbreviation (this returns nil).
or
self.flags.isOP
);
end
return self;
end
-- @name initRarity
-- @description Sets the «rarity» and «r» attributes.
function File:initRarity()
local rarity = not self.flags.isOP and self._standard[ 3 ];
if not self.flags.isOP and rarity == '' then
return self:error( 'rarity' );
end
self.rarity = DATA.getRarity( rarity );
self.r = self.rarity and DATA.getR( self.rarity );
return self;
end
-- @name initEdtion
-- @description Sets the «edition» and «ed» attributes.
function File:initEdition()
local edition = self._standard[ self.flags.isOP and 3 or 4 ];
self.edition = DATA.getEdition( edition );
self.ed = self.edition and DATA.getEd( self.edition ):upper();
if not self.flags.noEdition and not self.edition then
return self:error( 'edition' );
end
return self;
end
-- @name initAlt
-- @description Set the «alt» attribute.
function File:initAlt()
local index = 5;
if self.flags.isOP then index = index - 1 end
if not self.ed then index = index - 1 end
self.alt = self._standard[ index ];
return self;
end
-- @name initOptions
-- @description Sets the file extension.
function File:initOptions()
-- Extension:
local extension = self._options[ 'extension' ];
self.extension = UTIL.isString( extension ) and extension:lower() or 'png';
-- Description:
self.description = self._options[ 'description' ];
return self;
end
-- @name init
-- @description Initializes the attributes of the File instance.
function File:init()
return self
:initRg()
:initNumber()
:initSet()
:initReleases()
:initRarity()
:initEdition()
:initAlt()
:initOptions()
;
end
----------
-- Return:
----------
return File;
-- </pre>