Module:Fileinfo
Jump to navigation
Jump to search
Documentation for this module may be created at Module:Fileinfo/doc
local getArgument = require('Module:Arguments').getArgument local p = {} function capitalFirst(str) -- Allows capitalization of the first letter of each word in a string; adapted from (https://stackoverflow.com/questions/20284515/capitalize-first-letter-of-every-word-in-lua) return (str:gsub("(%l)(%w*)", function(a,b) return string.upper(a)..b end)) end function trim(s) -- Allows removing of whitespace from inputs; adapted from (https://www.lua.org/manual/2.4/node32.html) local l = 1 while string.sub(s,l,l) == ' ' do l = l+1 end local r = string.len(s) while string.sub(s,r,r) == ' ' do r = r-1 end return string.sub(s,l,r) end function p.Main(frame) local args = frame.args local summary = args['summary'] local filetype = trim(args['type']:lower()) local source = args['source'] local media = trim(args['media']:lower()) local mediatype = trim(args['mediatype']:lower()) if mediatype == 'tv' or mediatype == 'ova' or mediatype == 'trpg' then mediatype = mediatype:upper() elseif mediatype ~= '' then mediatype = mediatype else mediatype = 'game' end local license = trim(args['licensing']:lower()) local subject = args['subject'] local trademark = args['trademark'] local platform = args['version'] local artists = args['artists'] local extrasource = args['reused'] local suppressCat = args['suppresscat'] local suppressCatType = args['suppresscattype'] local suppressPlat = args['suppressplat'] local suppressPlatType = args['suppressplattype'] local filecat = { ['artwork'] = { displaytext = "[[:Category:Artwork|Artwork]] [[Category:Artwork]]", cattext = " Artwork" }, ['illustration'] = { displaytext = "[[:Category:Illustrations|Illustration]] [[Category:Illustrations]]", cattext = " Illustrations" }, ['render'] = { displaytext = '[[:Category:Renders|Render]] [[Category:Renders]]', cattext = ' Renders' }, ['logo'] = { displaytext = '[[:Category:Logos|Logo]] [[Category:Logos]]', cattext = " Logos" }, ['cover'] = { displaytext = '[[:Category:Covers|Cover]] [[Category:Covers]]', cattext = ' Covers' }, ['map'] = { displaytext = "[[:Category:Maps|Map]] [[Category:Maps]]", cattext = ' Maps' }, ['model'] = { displaytext = "[[:Category:Models|Model]] [[Category:Models]]", cattext = " Models" }, ['graphic'] = { displaytext = "[[:Category:Graphics|Graphic]] [[Category:Graphics]]", cattext = " Graphics" }, ['sprite'] = { displaytext = "[[:Category:Sprites|Sprite]] [[Category:Sprites]]", cattext = " Sprites" }, ['screenshot'] = { displaytext = "[[:Category:Screenshots|Screenshot]] [[Category:Screenshots]]", cattext = " Screenshots" }, ['card'] = { displaytext = '[[:Category:Cards|Card]] [[Category:Cards]]', cattext = " Cards" }, ['icon'] = { displaytext = '[[:Category:Icons|Icon]] [[Category:Icons]]', cattext = " Icons" }, ['crop'] = { displaytext = '[[:Category:Cropped Images|Cropped Image]] [[Category:Cropped Images]]', cattext = " Cropped Images" }, ['photo'] = { displaytext = "[[:Category:Photos|Photo]] [[Category:Photos]]", cattext = " Photos" }, ['merchandise'] = { displaytext = "[[:Category:Merchandise Images|Merchandise]] [[Category:Merchandise Images]]", cattext = " Merchandise Images" }, ['audio'] = { displaytext = "[[:Category:Audio|Audio]] [[Category:Audio]]", cattext = " Audio" }, ['video'] = { displaytext = "[[:Category:Videos|Video]] [[Category:Videos]]", cattext = " Videos" }, ['wiki'] = { displaytext = "[[:Category:Wiki Images|Wiki Image]] [[Category:Wiki Images]]", cattext = " Wiki Images" }, ['flag'] = { displaytext = "[[:Category:Flags|Flag]] [[Category:Flags]]", cattext = " Flags" }, ['advertisement'] = { displaytext = "[[:Category:Advertisements|Advertisement]] [[Category:Advertisements]]", cattext = " Advertisements" }, ['other'] = { displaytext = "[[:Category:Other Images|Other Image]] [[Category:Other Images]]", cattext = " Other Images" } } if summary ~= '' then summary = "\n!Summary \n|" .. summary .. "\n|-" else summary = '' end if filetype ~= '' then filetype = "\n!Type \n|" .. filecat[filetype].displaytext .. "\n|-" else filetype = "\n!Type \n|''This file is missing a type. Please assign the correct type to the file.'' [[Category:Files missing type]]\n|-" typemissing = true end if source ~= '' then source = "\n!Source \n|" .. source .. "\n|-" else source = "\n!Source \n|''This file does not have a source. Please add the source, contact the original uploader, or upload a new version of the file.'' [[Category:Unsourced Files]]" .. "\n|-" end local licenselist = { ['copyright'] = "Copyright", ['public domain'] = "Public Domain", ['gfdl'] = "GFDL", ['cc by-sa'] = "CC BY-SA", ['cc by-nc-sa'] = "CC BY-NC-SA" } if license == '' then license = "\n!Licensing\n|''This file is missing a license tag. Please assign the correct license tag to the file.'' [[Category:Files missing license tag]]" .. "\n|-" else license = "\n!Licensing\n|\n" .. frame:expandTemplate { title = licenselist[license] } .. "\n|-" end if subject ~= '' then subject = "\n!Subject\n|" .. subject .. "\n|-" else subject = '' end if trademark ~= '' then trademark = "\n!Trademark\n|" .. trademark .. "\n|-" else trademark = '' end if artists ~= '' and artists:lower() ~= 'unknown' and string.find(artists, ':') ~= 7 then local Init = 0 local staffBreak = true local artLinks = '' while staffBreak == true do stringEnd = string.find(artists, ',', Init) if stringEnd ~= nil then artSubst = trim(string.sub(artists, Init, stringEnd - 1)) if mw.title.makeTitle(0, artSubst).redirectTarget ~= false then pagetitle = tostring(mw.title.makeTitle(0, artSubst).redirectTarget) artNew = "[[" .. pagetitle .. "]][[Category:Works by " .. pagetitle .. "]], " artLinks = artLinks .. artNew elseif mw.title.makeTitle(0, artSubst).exists == true then artNew = "[[" .. artSubst .. "]][[Category:Works by " .. artSubst .. "]], " artLinks = artLinks .. artNew else artLinks = "''This file has incorrectly attributed an artist. Please add the proper attribution or correct spelling errors.''[[Category:Files with errors in artist name]]<br>" .. artLinks staffBreak = false end Init = stringEnd + 1 else artSubst = trim(string.sub(artists, Init,-1)) if mw.title.makeTitle(0, artSubst).redirectTarget ~= false then pagetitle = tostring(mw.title.makeTitle(0, artSubst).redirectTarget) artNew = "[[" .. pagetitle .. "]][[Category:Works by " .. pagetitle .. "]]" artLinks = artLinks .. artNew elseif mw.title.makeTitle(0, artSubst).exists == true then artNew = "[[" .. artSubst .. "]][[Category:Works by " .. artSubst .. "]]" artLinks = artLinks .. artNew else artLinks = "''This file has incorrectly attributed an artist. Please add the proper attribution or correct spelling errors.''[[Category:Files with errors in artist name]]<br>" .. artLinks end staffBreak = false end end artOutput = "\n!Artists\n|" .. artLinks .. "\n|-" else if args['type']:lower() == 'artwork' or args['type']:lower() == 'illustration' then if artists:lower() == 'unknown' then artOutput = "\n!Artists\n|" .. "''The author of this artwork is unknown.''[[Category:Artwork with unknown authorship]]" .. "\n|-" elseif string.find(artists, ':', 0) == 7 then artOutput = "\n!Artists\n|" .. string.sub(artists, 9) .. "\n|-" else artOutput = "\n!Artists\n|" .. "''This file requires artist attribution. Please add the proper attribution.''[[Category:Files without artist attribution]]" .. "\n|-" end else artOutput = '' end end --This: The current addition to artLinks for this loop. artNew --artLinks: The second column of fileinfo; includes links and categories. artLinks --artOutput: The final output sent to the return output line. Includes the new line and header cell and encapsulates artLinks. artOutput if media ~= '' then --A list of codes that produce a conflict in their output (the same text as another) and what to append to the title to fix the error local conflictResolver = { ['mt'] = { series = " (Series)", ova = " (OVA)" }, ['mtt'] = { game = " (Telenet)", }, ['mt1'] = { game = '' }, ['dds1'] = { novel = " (Novel)" }, ['smt'] = { series = " (Series)" }, ['smt1'] = { game = " (Game)" }, ['smtn'] = { game = '', anthology = ' (Anthology)' }, ['smtsj'] = { game = '', anthology = ' (Anthology)' }, ['smtif'] = { game = '', manga = '', novel = ' (Novel)' }, ['smt3'] = { game = '', drama = '', manga = ' (Manga)' }, ['smttr'] = { game = '', manga = '', ova = ' (OVA)' }, ['lb'] = { series = ' (Series)' }, ['desum'] = { series = ' (Series)', game = '', tv = ' (TV Series)' }, ['mjt'] = { series = ' (Series)' }, ['r'] = { game = '', manga = ' (Manga)' }, ['p'] = { game = ' (PSP)', series = ' (Series)' }, ['mip'] = { game = '', manga = ' (Manga)' }, ['p3'] = { game = '', manga = ' (Manga)', anthology = ' (Anthology)' }, ['p4'] = { game = '', manga = ' (Manga)' }, ['p5'] = { game = '', manga = ' (Manga)' }, ['p4a'] = { game = '', tv = '', manga = ' (Manga)' }, ['p4au'] = { game = '', manga = ' (Manga)' }, ['pdn'] = { novel = '', manga = ' (Manga)' }, ['dc'] = { series = ' (Series)', manga = ' (Manga)', anthology = ' (Anthology)' }, ['dcld'] = { game = '', tv = ' (TV Series)', manga = ' (Manga)' }, ['desu'] = { series = ' (Series)' }, ['desu1'] = { game = '', drama = '', manga = ' (Manga)' }, ['desu2a'] = { tv = '', manga = ' (Manga)' } } --MEDIA GOES HERE BUT FOR NOW WE BALL local getLink = require('Module:Data/Media/' .. capitalFirst(mediatype)) if mw.title.makeTitle('Module', 'Data/Media/' .. capitalFirst(mediatype) .. '/raw').exists == true then getLinkRaw = require('Module:Data/Media/' .. capitalFirst(mediatype) .. '/raw') end local link = getLink.media[media] if getLinkRaw and getLinkRaw.media[media] and media == 'sh' or media == 'dsrk' then link = "\n!Origin\n|[[" .. getLink.media[media] .. "|''" .. getLinkRaw.media[media] .. "'' (Series)]]" .. "\n|-" elseif getLinkRaw and getLinkRaw.media[media] then link = "\n!Origin\n|''[[" .. getLink.media[media] .. "|" .. getLinkRaw.media[media] .. "]]''" .. "\n|-" else if link:sub(-1) == ')' and mediatype == 'series' and media ~= 'mtf' then link = "\n!Origin\n|[[" .. getLink.media[media] .. "|''" .. string.sub(link,1,string.find(link, '%(') - 2) .. "'' (Series)]]\n|-" elseif link:sub(-1) == ')' then link = "\n!Origin\n|[[" .. getLink.media[media] .. "|''" .. string.sub(link,1,string.find(link, '%(') - 2) .. "'' " .. string.sub(link,string.find(link, '%('),string.find(link, '%)')) .. "]]\n|-" else link = "\n!Origin\n|''[[" .. link .. "]]''\n|-" end end local categorytype = '' if conflictResolver[media] and conflictResolver[media].mediatype ~= nil then if typemissing == true then category = '[[Category:' .. getLink.media[media] .. conflictResolver[media].mediatype .. " Files]]" else category = '[[Category:' .. getLink.media[media] .. conflictResolver[media].mediatype .. " Files]]" categorytype = "[[Category:" .. getLink.media[media] .. conflictResolver[media].mediatype .. filecat[trim(args['type']:lower())].cattext .. "]]" end else if typemissing == true then if media == 'sh' or media == 'dsrk' then category = '[[Category:' .. getLinkRaw.media[media] .. " (Series) Files]]" elseif mediatype == 'crossover' then category = '[[Category:' .. getLinkRaw.media[media] .. " Files]]" else category = '[[Category:' .. getLink.media[media] .. " Files]]" end else if media == 'sh' or media == 'dsrk' then category = '[[Category:' .. getLinkRaw.media[media] .. " (Series) Files]]" categorytype = "[[Category:" .. getLinkRaw.media[media] .. " (Series)" .. filecat[trim(args['type']:lower())].cattext .. "]]" elseif mediatype == 'crossover' then category = '[[Category:' .. getLinkRaw.media[media] .. " Files]]" categorytype = "[[Category:" .. getLinkRaw.media[media] .. filecat[trim(args['type']:lower())].cattext .. "]]" else category = '[[Category:' .. getLink.media[media] .. " Files]]" categorytype = "[[Category:" .. getLink.media[media] .. filecat[trim(args['type']:lower())].cattext .. "]]" end end end local getPlat = require('Module:Data/Media/Platform') local platcattype = '' if platform ~= '' then if typemissing == true then plat = '' platcat = '' else plat = "\n!Version\n|" .. getPlat.media[platform:lower()] .. "\n|-" platcat = '[[Category:' .. getLink.media[media] .. ' ' .. getPlat.media[platform:lower()] .. " Files]]" platcattype = "[[Category:" .. getLink.media[media] .. ' ' .. getPlat.media[platform:lower()] .. ' ' .. filecat[trim(args['type']:lower())].cattext .. "]]" end else plat = '' platcat = '' end local parentCatIndex = { ['smt3nm'] = '[[Category:Shin Megami Tensei III: Nocturne Files]] [[Category:Shin Megami Tensei III: Nocturne ' .. filecat[trim(args['type']:lower())].cattext .. ']]', ['smt3ce'] = '[[Category:Shin Megami Tensei III: Nocturne Files]] [[Category:Shin Megami Tensei III: Nocturne ' .. filecat[trim(args['type']:lower())].cattext .. ']]', ['smt3hd'] = '[[Category:Shin Megami Tensei III: Nocturne Files]] [[Category:Shin Megami Tensei III: Nocturne ' .. filecat[trim(args['type']:lower())].cattext .. ']]', ['rds'] = '[[Category:Last Bible Files]] [[Category:Last Bible ' .. filecat[trim(args['type']:lower())].cattext .. ']]', ['rp'] = '[[Category:Megami Ibunroku Persona Files]] [[Category:Megami Ibunroku Persona ' .. filecat[trim(args['type']:lower())].cattext .. ']]', ['p1'] = '[[Category:Megami Ibunroku Persona Files]] [[Category:Megami Ibunroku Persona ' .. filecat[trim(args['type']:lower())].cattext .. ']]', ['dcb'] = '[[Category:Devil Children Black Book and Red Book Files]] [[Category:Devil Children Black Book and Red Book ' .. filecat[trim(args['type']:lower())].cattext .. ']]', ['dcr'] = '[[Category:Devil Children Black Book and Red Book Files]] [[Category:Devil Children Black Book and Red Book ' .. filecat[trim(args['type']:lower())].cattext .. ']]', ['dcl'] = '[[Category:Devil Children Light Book and Dark Book Files]] [[Category:Devil Children Light Book and Dark Book ' .. filecat[trim(args['type']:lower())].cattext .. ']]', ['dcd'] = '[[Category:Devil Children Light Book and Dark Book Files]] [[Category:Devil Children Light Book and Dark Book ' .. filecat[trim(args['type']:lower())].cattext .. ']]', ['dkld'] = '[[Category:Devil Children Light Book and Dark Book Files]] [[Category:Devil Children Light Book and Dark Book ' .. filecat[trim(args['type']:lower())].cattext .. ']]', ['dcf'] = '[[Category:Devil Children Fire Book and Ice Book Files]] [[Category:Devil Children Fire Book and Ice Book ' .. filecat[trim(args['type']:lower())].cattext .. ']]', ['dci'] = '[[Category:Devil Children Fire Book and Ice Book Files]] [[Category:Devil Children Fire Book and Ice Book ' .. filecat[trim(args['type']:lower())].cattext .. ']]', } if parentCatIndex[media] and mediatype == 'game' and trim(args['type']:lower()) ~= 'wiki' then parentCat = parentCatIndex[media] else parentCat = '' end function extrLink() local extlink = getLink.media[media] if getLinkRaw and getLinkRaw.media[media] and media == 'sh' or media == 'dsrk' then extrlink = "[[" .. getLink.media[media] .. "|''" .. getLinkRaw.media[media] .. "'' (Series)]], " elseif getLinkRaw and getLinkRaw.media[media] then extrlink = "''[[" .. getLink.media[media] .. "|" .. getLinkRaw.media[media] .. "]]'', " else if extlink:sub(-1) == ')' and media == 'mtt' then extrlink = "[[" .. getLink.media[media] .. "|''" .. string.sub(extlink,1,string.find(extlink, '%(') - 2) .. "'' (Telenet)]], " elseif extlink:sub(-1) == ')' and media == 'dcm' then extrlink = "[[" .. getLink.media[media] .. "|''" .. string.sub(extlink,1,string.find(extlink, '%(') - 2) .. "'' (Mobile)]], " elseif mediatype == 'series' then extrlink = "[[" .. getLink.media[media] .. "|''" .. string.sub(extlink,1,string.find(extlink, '%(') - 2) .. "'' (Series)]], " elseif extlink:sub(-1) == ')' then extrlink = "[[" .. getLink.media[media] .. "|" .. string.sub(extlink,1,string.find(extlink, '%(') - 2) .. "]]'', " else extrlink = "''[[" .. extlink .. "]]'', " end end return extrlink end function extrLinkEnd() local extlink = getLink.media[media] if getLinkRaw and getLinkRaw.media[media] and media == 'sh' or media == 'dsrk' then extrlink = "[[" .. getLink.media[media] .. "|''" .. getLinkRaw.media[media] .. "'' (Series)]]" elseif getLinkRaw and getLinkRaw.media[media] then extrlink = "''[[" .. getLink.media[media] .. "|" .. getLinkRaw.media[media] .. "]]''" else if extlink:sub(-1) == ')' and media == 'mtt' then extrlink = "[[" .. getLink.media[media] .. "|''" .. string.sub(extlink,1,string.find(extlink, '%(') - 2) .. "'' (Telenet)]]" elseif extlink:sub(-1) == ')' and media == 'dcm' then extrlink = "[[" .. getLink.media[media] .. "|''" .. string.sub(extlink,1,string.find(extlink, '%(') - 2) .. "'' (Mobile)]]" elseif mediatype == 'series' then extrlink = "[[" .. getLink.media[media] .. "|''" .. string.sub(extlink,1,string.find(extlink, '%(') - 2) .. "'' (Series)]]" elseif extlink:sub(-1) == ')' then extrlink = "[[" .. getLink.media[media] .. "|" .. string.sub(extlink,1,string.find(extlink, '%(') - 2) .. "]]''" else extrlink = "''[[" .. extlink .. "]]''" end end return extrlink end if extrasource ~= '' then local extracats = '' local extrabreak = true local Init = 0 local stringEnd = '' local extLink2 = '' while extrabreak == true do stringEnd = string.find(extrasource, ',', Init) if stringEnd ~= nil then media = trim(string.sub(extrasource, Init, stringEnd - 1)):lower() if media ~= '' then if conflictResolver[media] and conflictResolver[media].mediatype ~= nil then if typemissing == true then newcats = '[[Category:Reused ' .. getLink.media[media] .. conflictResolver[media].mediatype .. " Files]]" extlinkpass = extrLink() else newcats = '[[Category:Reused ' .. getLink.media[media] .. conflictResolver[media].mediatype .. " Files]]" extlinkpass = extrLink() end elseif typemissing == true then if media == 'sh' or media == 'dsrk' then newcats = '[[Category:' .. getLinkRaw.media[media] .. " (Series) Files]]" extlinkpass = extrLink() else newcats = '[[Category:Reused ' .. getLink.media[media] .. " Files]]" extlinkpass = extrLink() end else if media == 'sh' or media == 'dsrk' then newcats = '[[Category:' .. getLinkRaw.media[media] .. " (Series) Files]] [[Category:" .. getLinkRaw.media[media] .. " (Series)" .. filecat[trim(args['type']:lower())].cattext .. "]]" extlinkpass = extrLink() else newcats = "[[Category:Reused " .. getLink.media[media] .. " Files]]" extlinkpass = extrLink() end end else newcats = '' extrabreak = false end Init = stringEnd + 1 else -- if stringEnd isn't nil, so the break version of above media = trim(string.sub(extrasource, Init,-1)):lower() if media ~= '' then if conflictResolver[media] and conflictResolver[media].mediatype ~= nil then if typemissing == true then newcats = '[[Category:Reused ' .. getLink.media[media] .. conflictResolver[media].mediatype .. " Files]]" extlinkpass = extrLinkEnd() extrabreak = false else newcats = '[[Category:Reused ' .. getLink.media[media] .. conflictResolver[media].mediatype .. " Files]]" extlinkpass = extrLinkEnd() extrabreak = false end elseif typemissing == true then if media == 'sh' or media == 'dsrk' then newcats = '[[Category:' .. getLinkRaw.media[media] .. " (Series) Files]]" extlinkpass = extrLinkEnd() extrabreak = false else newcats = '[[Category:Reused ' .. getLink.media[media] .. " Files]]" extlinkpass = extrLinkEnd() extrabreak = false end else if media == 'sh' or media == 'dsrk' then newcats = '[[Category:' .. getLinkRaw.media[media] .. " (Series) Files]] [[Category:" .. getLinkRaw.media[media] .. " (Series)" .. filecat[trim(args['type']:lower())].cattext .. "]]" extlinkpass = extrLinkEnd() extrabreak = false else newcats = '[[Category:Reused ' .. getLink.media[media] .. " Files]]" extlinkpass = extrLinkEnd() extrabreak = false end end else newcats = '' extrabreak = false end end if newcats ~= '' then extracats = extracats .. newcats extLink2 = extLink2 .. extlinkpass elseif extracats == '' then extracats = newcats extLink2 = extlinkpass end end -- While extrabreak is true extrasource = extracats extraLinksOutput = "\n!Reused\n|" .. extLink2 .. "\n|-" else -- If extrasource is blank extrasource = '' extraLinksOutput = '' end -- If extrasource isn't blank end statement if suppressCat ~= '' then category = '' end if suppressCatType ~= '' then categorytype = '' end if suppressPlat ~= '' then platcat = '' end if suppressPlatType ~= '' then platcattype = '' end local output = '{| class="wikitable"' .. summary .. filetype .. source .. artOutput .. link .. plat .. extraLinksOutput .. subject .. trademark .. license .. "\n|}" .. parentCat .. category .. categorytype .. platcat .. platcattype .. extrasource return output else local output = '{| class="wikitable"' .. summary .. filetype .. source .. artOutput .. subject .. trademark .. license .. "\n|}" return output end end return p