Latest revision |
Your text |
Line 12: |
Line 12: |
| local DATA = require( 'Module:Data' ) | | local DATA = require( 'Module:Data' ) |
| local UTIL = require( 'Module:Util' ) | | local UTIL = require( 'Module:Util' ) |
| + | |
| + | local LANGUAGE_ENGLISH = DATA.getLanguage( 'English' ) |
| | | |
| local mwTitle = mw.title | | local mwTitle = mw.title |
− |
| |
− | -- Object containing data on this release of the set
| |
− | -- (Object is called `releaseData` rather than `setData`, which is ambiguous in programming terms.)
| |
− | --
| |
− | -- @param pagename string The name of the current page (the list/gallery)
| |
− | -- @param set string The page name of the set
| |
− | -- @param name string The English name of the set
| |
− | -- @param localName string The name of the set in this particular print and language
| |
− | -- @param language table The language of this particular print e.g. "English", "Korean", etc.
| |
− | -- (See [[Module:Data/static/language/data]] for the table structure)
| |
− | -- @param region table The distribution region of this print e.g. "European English", "Korean", etc.
| |
− | -- (See [[Module:Data/static/region/data]] for the table structure)
| |
− | -- @param medium table The medium (OCG, TCG, etc.)
| |
− | -- (See [[Module:Data/static/medium/data]] for the table structure)
| |
− | -- @param edition table The edition of this particular print
| |
− | -- (See [[Module:Data/static/edition/data]] for the table structure)
| |
− | -- @param releaseDate string The date this print was released
| |
− | local releaseData = {
| |
− | pagename = nil,
| |
− | set = nil,
| |
− | name = nil,
| |
− | localName = nil,
| |
− | language = {},
| |
− | region = {},
| |
− | medium = {},
| |
− | edition = nil,
| |
− | releaseDate = nil,
| |
− | isParentSet = nil,
| |
− | }
| |
| | | |
| local function getRegion( pagename ) | | local function getRegion( pagename ) |
− | -- Get content after the first hyphen after the last `(` in the page name
| + | local index = pagename:match( 'CG%-(%a+)%-?' ) |
− | -- up until the next `-` or `)`
| |
− | -- More specifically match
| |
− | -- `(`
| |
− | -- Any amount of non-`(` non-`-`
| |
− | -- `-`
| |
− | -- Any amount of non-`(` non-`-` (Capture the text in this group)
| |
− | -- An optional `-`
| |
− | -- An optional amout of non-`(` non-`-`
| |
− | -- A `)`
| |
− | -- the end of the string
| |
− | local index = pagename:match( '%([^%(-]*-([^%(-]*)-?[^%(-]*%)$' ) | |
| | | |
| local region = DATA.getRegion( index ) -- TODO: handle erroneous region (nil)? | | local region = DATA.getRegion( index ) -- TODO: handle erroneous region (nil)? |
Line 64: |
Line 26: |
| | | |
| local function getEdition( pagename ) | | local function getEdition( pagename ) |
− | -- Get content after the second hyphen after the last `(` in the page name.
| + | local index = pagename:match( 'CG%-%a+%-(%w+)' ) |
− | local index = pagename:match( '%([^%(-]*-[^%(-]*-([^%(]*)%)$' ) | |
| | | |
| local edition = DATA.getEdition( index ) -- TODO: handle erroneous edition (nil)? | | local edition = DATA.getEdition( index ) -- TODO: handle erroneous edition (nil)? |
Line 80: |
Line 41: |
| end | | end |
| | | |
| + | local function makeHeader( setPagename, region, edition ) |
| + | local language = DATA.getLanguage( region.index ) |
| | | |
− | local function makeHeader( setPagename, region, edition ) | + | local medium = DATA.getMedium( region.index ) |
| + | |
| + | local englishName = DATA.getName( |
| + | setPagename, |
| + | LANGUAGE_ENGLISH |
| + | ) |
| + | |
| + | local localizedName = DATA.getName( |
| + | setPagename, |
| + | language |
| + | ) |
| | | |
| local header = mw.html.create( 'div' ):addClass( 'page-header' ) | | local header = mw.html.create( 'div' ):addClass( 'page-header' ) |
Line 88: |
Line 61: |
| header:tag( 'div' ) | | header:tag( 'div' ) |
| :addClass( 'page-header__link' ) | | :addClass( 'page-header__link' ) |
− | :wikitext( UTIL.link( releaseData.set, releaseData.name ) ) | + | :wikitext( UTIL.link( setPagename, englishName ) ) |
| | | |
| -- Localized set name: | | -- Localized set name: |
− | if releaseData.language.index ~= 'en' and releaseData.localName then | + | if language.index ~= LANGUAGE_ENGLISH.index and localizedName then |
| header:tag( 'div' ) | | header:tag( 'div' ) |
| :addClass( 'page-header__localized' ) | | :addClass( 'page-header__localized' ) |
− | :attr( 'lang', releaseData.language.index ) | + | :attr( 'lang', language.index ) |
− | :wikitext( releaseData.localName ) | + | :wikitext( localizedName ) |
| end | | end |
| | | |
Line 101: |
Line 74: |
| header:tag( 'div' ) | | header:tag( 'div' ) |
| :addClass( 'page-header__caption' ) | | :addClass( 'page-header__caption' ) |
− | :wikitext( releaseData.region.full ) | + | :wikitext( region.full ) |
− | :wikitext( releaseData.edition and ( ' - %s' ):format( releaseData.edition.full ) ) | + | :wikitext( edition and ( ' - %s' ):format( edition.full ) ) |
− | | |
− | -- If there is a release date, show it in the header
| |
− | if ( releaseData.releaseDate ) then
| |
− | header:tag( 'div' ):wikitext( '(Release date: ' .. releaseData.releaseDate .. ')' )
| |
− | end
| |
| | | |
| return tostring( header ) | | return tostring( header ) |
| end | | end |
| | | |
− | local function makeCategories( ns ) | + | local function makeCategories( ns, region, edition ) |
− | local categories = { | + | return table.concat{ |
− | ( '[[Category:%s %s]]' ):format( releaseData.region.full, ns ) | + | ( '[[Category:%s %s]]' ):format( region.full, ns ), |
− | }
| + | edition and ( '[[Category:%s %s]]' ):format( edition.full, ns ), |
− |
| |
− | if ( releaseData.edition ) then
| |
− | table.insert( categories, ( '[[Category:%s %s]]' ):format( releaseData.edition.full, ns ) )
| |
− | end
| |
− | | |
− | if ( ns == 'Set Card Lists' and releaseData.isParentSet ) then
| |
− | table.insert( categories, '[[Category:Set Card Lists for parent sets]]' )
| |
− | end
| |
− | | |
− | -- Set lists with no release dates
| |
− | -- Excludes lists for parent sets, whose children each have individual release dates
| |
− | if ( ns == 'Set Card Lists' and not releaseData.releaseDate and not releaseData.isParentSet ) then
| |
− | table.insert( categories, '[[Category:Set Card Lists with no release date]]' )
| |
− | end
| |
− | | |
− | return table.concat(categories)
| |
− | end
| |
− | | |
− | local function setSmwData( ns, setPagename, region, edition )
| |
− | mw.smw.set({
| |
− | ['Set page'] = releaseData.set,
| |
− | ['Local name'] = releaseData.localName,
| |
− | ['Release'] = releaseData.medium and releaseData.medium.full,
| |
− | ['Language'] = releaseData.language.full,
| |
− | ['Locality'] = releaseData.region and releaseData.region.full,
| |
− | ['Edition'] = releaseData.edition and releaseData.edition.full,
| |
− | ['Release date'] = releaseData.releaseDate
| |
− | })
| |
− | end
| |
− | | |
− | -- Fetch data from the set page
| |
− | -- @return table name, localName, releaseDate
| |
− | local function querySetData()
| |
− | local results = mw.smw.ask{
| |
− | '[[' .. releaseData.set .. ']]',
| |
− | '?English name = name' ,
| |
− | '?' .. releaseData.language.full .. ' name = localName',
| |
− | '?' .. releaseData.region.full .. ' release date = releaseDate',
| |
− | -- Bit sloppy, but we need to fallback to this if "Worldwide English release date" is empty
| |
− | '?English release date = englishReleaseDate',
| |
− | '?-Parent set = isParentSet',
| |
− | mainlabel = '-'
| |
| } | | } |
− |
| |
− | -- Reurn the first result, if there is one
| |
− | return results and results[ 1 ]
| |
− | end
| |
− |
| |
− | -- Set data for the `releaseData` table based on the page name and parameters
| |
− | local function setReleaseData( ns, currentPageName, args )
| |
− | -- Set the set page equal to the supplied set
| |
− | -- or defaul to to the one that can be inferred from the page name
| |
− | releaseData.set = args.set or getSetPagename( currentPageName )
| |
− |
| |
− | -- Set the region equal to the supplied region
| |
− | -- or default to the one that can be inferred from the page name
| |
− | releaseData.region = args.region
| |
− | and DATA.getRegion( args.region )
| |
− | or getRegion( currentPageName )
| |
− |
| |
− | -- Set the language, based on the region
| |
− | releaseData.language = DATA.getLanguage( releaseData.region.index )
| |
− |
| |
− | -- Set the medium based on the region
| |
− | releaseData.medium = DATA.getMedium( releaseData.region.index )
| |
− |
| |
− | -- Set the edition based on the page name
| |
− | releaseData.edition = getEdition( currentPageName )
| |
− |
| |
− | -- Query the set page to find more information
| |
− | local queriedData = querySetData()
| |
− |
| |
− | -- Exit early if no results were found
| |
− | if ( not queriedData ) then
| |
− | -- todo: Tracking category
| |
− | return
| |
− | end
| |
− |
| |
− | -- Update the `releaseData` object based on the results of the query
| |
− | -- except where overwritten by the `args`.
| |
− | releaseData.name = queriedData.name
| |
− | releaseData.localName = args.name or queriedData.localName
| |
− | releaseData.isParentSet = queriedData.isParentSet and true or false
| |
− |
| |
− | -- For now, only do the release date for list pages
| |
− | -- Don't add it to parent set lists e.g. the overall "Shonen Jump promotional cards" list
| |
− | -- which have multiple releases, each with their own set list.
| |
− | if ( ns == 'Set Card Lists' and not queriedData.isParentSet ) then
| |
− | releaseData.releaseDate = args.releaseDate or queriedData.releaseDate
| |
− |
| |
− | -- If 'Worldwide English' and the `releaseDate` is empty, check the `englishReleaseDate`
| |
− | if ( not releaseData.releaseDate and releaseData.region.full == 'Worldwide English' ) then
| |
− | releaseData.releaseDate = queriedData.englishReleaseDate
| |
− | end
| |
− | end
| |
| end | | end |
| | | |
| function main( args ) | | function main( args ) |
− | -- Get the name of the current page (distinct from the name of the set page)
| |
| local currentTitle = args.pagename | | local currentTitle = args.pagename |
| and mwTitle.new( args.pagename ) | | and mwTitle.new( args.pagename ) |
Line 221: |
Line 94: |
| local ns = currentTitle.subjectNsText | | local ns = currentTitle.subjectNsText |
| | | |
− | -- Skip everything if this is in the main namespace
| |
| if not UTIL.trim( ns ) then | | if not UTIL.trim( ns ) then |
| return | | return |
| end | | end |
| | | |
− | -- Update the `releaseData` object based on information from the page name | + | local pagename = currentTitle.text |
− | -- and the supplied arguments. | + | |
− | setReleaseData( ns, currentTitle.text, args ) | + | local region = args.region and DATA.getRegion( args.region ) or getRegion( pagename ) |
| + | |
| + | local edition = getEdition( pagename ) |
| | | |
− | -- Get the header wikitext
| + | local setPagename = args.set or getSetPagename( pagename ) |
− | local header = makeHeader() | |
| | | |
− | -- Get the categories wikitext
| + | local header = makeHeader( setPagename, region, edition ) |
− | local categories = makeCategories( ns ) | |
| | | |
− | -- Set SMW properties | + | local categories = makeCategories( ns, region, edition ) |
− | setSmwData()
| |
| | | |
− | -- Return the wikitext to render
| |
| return table.concat{ | | return table.concat{ |
| '__NOTOC__', | | '__NOTOC__', |