![]() |
VOOZH | about |
Called by {{AchievementRow}} and {{Load achievements}}
localachievement_page='Achievement' localp={} localnamespace=mw.title.getCurrentTitle().nsText localpage_title=mw.title.getCurrentTitle().text localfull_title=mw.title.getCurrentTitle().fullText localhtml localframe localfunctionsanitize(str) -- remove anything between < and > (simple way to remove span tag) -- return lower case alpha numeric characters and spaces returnmw.text.trim(str:gsub('<.->',''):gsub('[^%w%s%?]*',''):lower()) end localfunctiontrim(str) localtrimmed=(strandmw.text.trim(str)~=""andmw.text.trim(str)) returntrimmed end -- Adds one row of achievement data to html object localfunctionprintLine(line,is_input) localtr=html:tag('tr'):attr('id',line.title):cssText('text-align:left') locallink=nil ifnotis_inputthen link=achievement_page..'#'..line.title end localachievementIcon=require('Module:SpriteFile').sprite({name='AchievementSprite',sanitize(line.title),size=94,align='middle',scale=0.5,link=link}) localnewAchievementIcon=require('Module:SpriteFile').sprite({name='NewAchievementSprite',sanitize(line.title),height=48,width=84,align='middle',link=link}) tr:tag('td'):wikitext(achievementIcon):cssText('text-align:center') tr:tag('td'):wikitext(newAchievementIcon):cssText('text-align:center') localtitle_extra='' ifline.upcoming_verthen title_extra=title_extra..frame:expandTemplate{title='Upcoming',args={ver=line.upcoming_ver}} end ifline.until_verthen title_extra=title_extra..frame:expandTemplate{title='Until',args={ver=line.until_ver}} end tr:tag('td'):wikitext('[['..(linkorfull_title)..'|'..line.title..']]',title_extra) tr:tag('td'):wikitext(line.game_description) tr:tag('td'):wikitext(line.wiki_description) tr:tag('td'):wikitext(line.gamerscore) tr:tag('td'):wikitext(line.trophy_type) ifis_inputthen-- These are only displayed on the input page, not on individual content pages tr:tag('td'):wikitext(line.reward) end end -- Puts one line of data into Bucket for later querying localfunctionstoreLine(line) -- Put data into Bucket -- The only top level params that are needed is stuff that would be used as selectors -- everything else is put into a json blob for flexibility ifnot(namespace==''ornamespace=='Minecraft_Wiki')then return-- only store data if we are in main or Minecraft_Wiki namespaces end localsanitized_title=sanitize(line.title) -- mw.text.unstrip gets rid of parser artifacts that are put there when a <ref> tag is used. line.wiki_description=mw.text.unstrip(line.wiki_description) line.game_description=mw.text.unstrip(line.game_description) bucket('achievement').put({ title=sanitized_title, json=mw.text.jsonEncode(line)-- serializes all data into a json blob }) end -- Public function - Called by {{AchievementRow}} functionp.inputLine(_frame) frame=_frame-- store frame for later use by expandTemplate localargs=frame:getParent().args -- Normalize inputs and set defaults localline={ title=args['title'],-- name upcoming_ver=args['upcoming'],-- version where achievement will be introduced until_ver=args['until'],-- version where achievement will be removed game_description=trim(args[1])or"—", wiki_description=trim(args[2])or"—", gamerscore=trim(args[3])or'—', trophy_type=trim(args[4])or'—', reward=trim(args[5])or'—', } html=mw.html.create() printLine(line,true) storeLine(line) returnhtml end localfunctionprintHeader(short_header) -- Can't use table tag because it will close itself, but we need to close it with footer html=mw.html.create():wikitext('<div style="overflow: auto;"><table class="wikitable collapsible sortable" style="text-align:center">') localth=html:tag('tr'):tag('th'):addClass('unsortable'):attr('colspan',8) localtr=html:tag('tr') tr:tag('th'):wikitext('Icon'):attr('colspan',2):addClass('unsortable') tr:tag('th'):wikitext('Achievement'):attr('rowspan',2):addClass('sortable') tr:tag('th'):wikitext('In-game description'):attr('rowspan',2):addClass('unsortable') tr:tag('th'):wikitext('Actual requirements (if different)'):attr('rowspan',2):addClass('unsortable') tr:tag('th'):wikitext('Gamerscore earned'):attr('rowspan',2):addClass('sortable') tr:tag('th'):wikitext('Trophy type (<span class="explain" title="PlayStation">PS</span>)'):attr('rowspan',2):addClass('sortable') ifnotshort_headerthen tr:tag('th'):wikitext('Rewards'):attr('rowspan',2) end html:tag('th'):wikitext('PS4'):addClass('unsortable') html:tag('th'):wikitext('Other'):addClass('unsortable') returnhtml end localfunctionprintFooter() return'</table></div>' end -- Public function - called by {{AchievementTable}} functionp.table(frame) localargs=frame:getParent().args ifargs[1]=='foot'then returnprintFooter() else returnprintHeader(false) end end -- Public function - called by {{Load achievements}} functionp.load(frame_) frame=frame_-- store frame for later use by expandTemplate localargs=frame:getParent().args achievement_page=args.pageorachievement_page printHeader(true) localconditions={} fornameinstring.gmatch(args[1],"[^;]+")do conditions[#conditions+1]={'title',sanitize(name)} end localquery=bucket('achievement') .select('title','json') .where('page_name',achievement_page) .where(bucket.Or(unpack(conditions))) .run() ifquerythen fori,vinipairs(query)do localline=mw.text.jsonDecode(v['json']or'{}') printLine(line,false) end end if#conditions~=#querythen html:wikitext('[[Category:Missing achievement]]') end html:wikitext(printFooter()) returnhtml end returnp