Home
Random
Recent changes
Special pages
Community portal
Preferences
About Stockhub
Disclaimers
Search
User menu
Talk
Contributions
Create account
Log in
Editing
Module:Sandbox/X201/Hello
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
require('strict') local p = {} local data = mw.loadData('Module:Video game reviews/data') local yesno = require('Module:Yesno') local getArgs local function getActiveSystems(args) local activeSystems = {} for k,v in pairs(args) do if data.systems[k] and yesno(v) then table.insert(activeSystems, k) end end table.sort(activeSystems, function(a, b) return data.systems[a].sortkey < data.systems[b].sortkey end) return activeSystems end local function getArgKeyTables(args) local reviewers, aggregators, awards = {}, {}, {} for k in pairs(args) do if string.match(k, '^rev%d+$') then table.insert(reviewers, k) elseif string.match(k, '^agg%d+$') then table.insert(aggregators, k) elseif string.match(k, '^award%d+$') then table.insert(awards, k) end end local function comparator(a, b) return tonumber(a:match('%d+')) < tonumber(b:match('%d+')) end table.sort(reviewers, comparator) table.sort(aggregators, comparator) table.sort(awards, comparator) return reviewers, aggregators, awards end local function getProvidedReviewersAndAggregators(args, usePlatforms) local providedReviewers, providedAggregators = {}, {} if usePlatforms then local seen = {} for k in pairs(args) do local splitPos = string.find(k, '_') if splitPos then local halfarg = string.sub(k, 1, splitPos - 1) if not seen[halfarg] then seen[halfarg] = true if data.reviewers[halfarg] then table.insert(providedReviewers, halfarg) elseif data.aggregators[halfarg] then table.insert(providedAggregators, halfarg) end end end end else for k in pairs(args) do if not string.find(k, '_') then if data.reviewers[k] then table.insert(providedReviewers, k) elseif data.aggregators[k] then table.insert(providedAggregators, k) end end end end table.sort(providedReviewers, function(a, b) return data.reviewers[a].sortkey < data.reviewers[b].sortkey end) table.sort(providedAggregators, function(a, b) return data.aggregators[a].sortkey < data.aggregators[b].sortkey end) return providedReviewers, providedAggregators end local function renderTitleRow(tbl, plain, title) local titleCell = tbl:tag('tr'):tag('th'):css('font-size', '120%') if plain then titleCell:tag('span') :css('padding-left', '5.7em') :wikitext(' ') end if title then titleCell :wikitext(title) else titleCell :addClass('Reception') :wikitext('Reception') end end local function renderMainHeading(builder, colspan, headingText, borderTop) builder:tag('tr'):tag('th') :attr('colspan', colspan) :css('background', '#d1dbdf') :css('font-size', '120%') :css('border-top', borderTop) :wikitext(headingText) end local function renderHeadingRowWithSystems(builder, mainHeading, activeSystems) renderMainHeading(builder, #activeSystems + 1, mainHeading) builder:tag('tr') :tag('th') :attr('rowspan', '2') :css('background', '#e8f4f8') :css('text-align', 'center') :css('vertical-align', 'middle') :wikitext('Publication') :done() :tag('th') :attr('colspan', #activeSystems) :css('background', '#e8f4f8') :css('vertical-align', 'middle') :wikitext('Score') builder = builder:tag('tr') for _,v in ipairs(activeSystems) do builder:tag('th'):wikitext(data.systems[v].name) end end local function renderHeadingRow(builder, mainHeading, nameHeading) renderMainHeading(builder, 2, mainHeading) builder :tag('tr') :tag('th') :css('background', '#e8f4f8') :css('text-align', 'center') :css('vertical-align', 'middle') :wikitext(nameHeading) :done() :tag('th') :css('background', '#e8f4f8') :css('vertical-align', 'middle') :wikitext('Score') end local function renderRatingsBySystem(builder, code, name, activeSystems, args, na) builder = builder:tag('tr') builder:tag('td') :css('vertical-align','middle') :wikitext(name) for _,v in ipairs(activeSystems) do local combinedCode = code .. '_' .. v local cell = builder:tag('td') if args[combinedCode] then cell :css('vertical-align', 'middle') :css('font-size', '110%') :wikitext(args[combinedCode]) elseif na then cell :css('color', 'lightgray') :css('vertical-align','middle') :css('text-align', 'center') :css('font-size', '110%') :addClass('table-na') :wikitext('N/A') end end end local function renderRating(builder, name, rating) builder:tag('tr') :tag('td') :css('text-align', 'center') :css('vertical-align', 'middle') :wikitext(name) :done() :tag('td') :css('text-align', 'center') :css('font-size', '110%') :wikitext(rating) end local function renderReviews(builder, providedReviewers, providedAggregators, activeSystems, customAggregatorKeys, customReviewerKeys, args) builder = builder:tag('table') :addClass('infobox wikitable') :attr('cellpadding', 0) :attr('cellspacing', 0) :css('width', '100%') :css('border-bottom', 'none') :css('margin', '0em') local hasReviewers = #providedReviewers ~= 0 or #customReviewerKeys ~= 0 local hasAggregators = #providedAggregators ~= 0 or #customAggregatorKeys ~= 0 builder:css('font-size', '100%') if #activeSystems ~= 0 then local na = yesno(args.na) local showplatforms = #activeSystems ~= 1 or yesno(args.showplatforms) if hasReviewers then if showplatforms then renderHeadingRowWithSystems(builder, 'Review scores', activeSystems) else renderHeadingRow(builder, 'Review scores', 'Publication') end for _,v in ipairs(providedReviewers) do renderRatingsBySystem(builder, v, data.reviewers[v].name, activeSystems, args, na) end for _,v in ipairs(customReviewerKeys) do renderRatingsBySystem(builder, v, args[v], activeSystems, args, na) end end if hasAggregators then if hasReviewers then renderMainHeading(builder, #activeSystems+1, 'Aggregate scores') elseif showplatforms then renderHeadingRowWithSystems(builder, 'Aggregate scores', activeSystems) else renderHeadingRow(builder, 'Aggregate scores', 'Aggregator') end for _,v in ipairs(providedAggregators) do renderRatingsBySystem(builder, v, data.aggregators[v].name, activeSystems, args, na) end for _,v in ipairs(customAggregatorKeys) do renderRatingsBySystem(builder, v, args[v], activeSystems, args, na) end end else builder:css('font-size', '100%') if hasAggregators then renderHeadingRow(builder, 'Aggregate scores', 'Aggregator') for _,v in ipairs(providedAggregators) do renderRating(builder, data.aggregators[v].name, args[v]) end for _,v in ipairs(customAggregatorKeys) do renderRating(builder, args[v], args[v .. 'Score']) end end if hasReviewers then renderHeadingRow(builder, 'Review scores', 'Publication') for _,v in ipairs(providedReviewers) do renderRating(builder, data.reviewers[v].name, args[v]) end for _,v in ipairs(customReviewerKeys) do renderRating(builder, args[v], args[v .. 'Score']) end end end end local function renderAwards(builder, args, awardKeys, borderTop) builder = builder:tag('table') :addClass('infobox wikitable') :css('width', '100%') :css('margin', '0em') :css('border-top', borderTop) :attr('cellpadding', 3) :attr('cellspacing', 0) renderMainHeading(builder, 2, 'Awards', borderTop) builder:tag('tr') :tag('th') :wikitext('Publication') :done() :tag('th') :wikitext('Award') for _,v in ipairs(awardKeys) do builder:tag('tr') :tag('td') :css('font-weight','bold') :css('background-color','#f2f2f2') :wikitext(args[v .. 'Pub']) :done() :tag('td') :css('background-color','#f2f2f2') :wikitext(args[v]) end end local function renderMainTable(providedReviewers, providedAggregators, awardKeys, activeSystems, customAggregatorKeys, customReviewerKeys, args) local tbl = mw.html.create('table') :attr('cellpadding', 0) :attr('cellspacing', 0) :addClass(args.state or 'collapsible') :css('background', 'transparent') :css('padding', '0em') :css('margin', '0em 1em 1em 1em') :css('text-align', 'center') :css('font-size', '80%') :css('float', args.align or 'right') :css('clear', args.align or 'right') if #activeSystems == 0 then -- Width: 20% Seems better since it scales with the article size. tbl :css('width', args.width or '23em') end if args.title and args.state ~= 'plain' and args.state ~= 'off' then tbl :addClass('collapsible') :addClass(args.state) end renderTitleRow(tbl, args.state == 'plain', args.title) if args.subtitle then tbl:tag('tr'):tag('th') :css('font-size', '120%') :wikitext(args.subtitle) end renderReviews(tbl:tag('tr'):tag('td'), providedReviewers, providedAggregators, activeSystems, customAggregatorKeys, customReviewerKeys, args) if #awardKeys ~= 0 then renderAwards(tbl:tag('tr'):tag('td'), args, awardKeys, (#customAggregatorKeys ~= 0 or #customReviewerKeys ~= 0 or #providedAggregators ~= 0 or #providedReviewers ~= 0) and 'none' or nil) end return tbl end function p._reviewbox(args) local activeSystems = getActiveSystems(args) local customReviewerKeys, customAggregatorKeys, awardKeys = getArgKeyTables(args) local providedReviewers, providedAggregators = getProvidedReviewersAndAggregators(args, #activeSystems ~= 0) if #customAggregatorKeys ~= 0 or #customReviewerKeys ~= 0 or #providedAggregators ~= 0 or #providedReviewers ~= 0 or #awardKeys ~= 0 then return renderMainTable(providedReviewers, providedAggregators, awardKeys, activeSystems, customAggregatorKeys, customReviewerKeys, args) elseif mw.title.getCurrentTitle().namespace == 0 then return '[[Category:Empty templates on articles]]' end end function p.reviewbox(frame) if not getArgs then getArgs = require('Module:Arguments').getArgs end return p._reviewbox(getArgs(frame, {wrappers = 'User:X201/sandbox/Lua', trim = false})) end function p._mulitcheck(args) local activeSystems = getActiveSystems(args) local showplatforms = #activeSystems ~= 1 or yesno(args.showplatforms) if showplatforms then return '[[:Category:True test]]' else return '[[:Category:false test]]' end end return p
Summary:
Please note that all contributions to Stockhub may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Stockhub:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Template used on this page:
Module:Sandbox/X201/Hello/doc
(
edit
)