Mô đun:Album ratings
Giao diện
-- This module implements [[Template:Music ratings]].local mTableTools = require('Module:TableTools')local yesno = require('Module:Yesno')local p = {}local function makeCell(html, s) html :tag('td') :css('text-align', 'center') :css('vertical-align', 'middle') :wikitext(s)endlocal function makeRow(review, score) local row = mw.html.create('tr') makeCell(row, review) makeCell(row, score) return rowendlocal function makeHeaderRow(header, background, scope) local row = mw.html.create('tr') row :tag('th') :attr('scope', scope ~= false and 'col' or nil) :attr('colspan', 2) :css('text-align', 'center') :css('background', background ~= false and '#d1dbdf' or nil) :css('font-size', '100%') :wikitext(header) return rowendlocal function makeRatingHeaderRow() local row = mw.html.create('tr') row :tag('th') :attr('scope', 'col') :wikitext('Nguồn') :done() :tag('th') :attr('scope', 'col') :wikitext('Đánh giá') return rowendlocal function getScore(scoreArgs, length) for i = 1, length do local arg = scoreArgs[i] if arg then return arg end end return nilendlocal function hasDuplicateScores(scoreArgs, length) local count = 0 for i = 1, length do local arg = scoreArgs[i] if arg then count = count + 1 end end return count > 1endlocal function ucfirst(s) local first = s:sub(1, 1) local others = s:sub(2, -1) return first:upper() .. othersendlocal function getArgPermutations(args, prefix, num, suffix) local prefixUpper = ucfirst(prefix) local suffixUpper = ucfirst(suffix) return { args[prefix .. num .. suffix], args[prefixUpper .. num .. suffix], args[prefix .. num .. suffixUpper], args[prefixUpper .. num .. suffixUpper], }, 4 -- The 4 is the length of the array; this is needed as the args may be nilendlocal function makeWikilink(page, display) if not page and not display then error('no arguments provided to makeWikilink', 2) elseif display and not page then return display elseif page and not display or page == display then return string.format('[[%s]]', page) else return string.format('[[%s|%s]]', page, display) endendlocal function findSortText(wikitext) -- Simplified wikitext parser that returns a value that can be used for -- sorting. wikitext = mw.text.killMarkers(wikitext) -- Replace piped links with their display values wikitext = wikitext:gsub('%[%[[^%]]*|([^%]]-)%]%]', '%1') -- Replace non-piped links with their display values wikitext = wikitext:gsub('%[%[([^%]]-)%]%]', '%1') -- Strip punctuation wikitext = wikitext:gsub('%p', '') -- Trim whitespace wikitext = wikitext:gsub('^%s*', ''):gsub('%s*$', '') return wikitextendfunction p._main(args) local root = mw.html.create() local tableRoot = root:tag('table') -- Table base tableRoot :addClass('wikitable') :addClass( (args.align == 'left') and 'floatleft' or 'floatright' ) :css('float', (args.align == 'left') and 'left' or 'right') :css('clear', (args.align == 'left') and 'left' or 'right') :css('width', args.width or '24.2em') :css('font-size', '88%') :css('text-align', 'center') :css('margin', (args.align == 'left') and '0.5em 1em 0.5em 0' or '0.5em 0 0.5em 1em') :css('padding', 0) :css('border-spacing', 0) :tag('tr') :tag('th') :attr('scope', 'col') :attr('colspan', 2) :css('font-size', '115%') :wikitext(args.title or 'Đánh giá chuyên môn') -- Subtitle if args.subtitle then tableRoot:node(makeHeaderRow(args.subtitle, false, false)) end -- Aggregate rows local aggregateNums = mTableTools.affixNums(args, 'aggregate') if args.MC or args.ADM or #aggregateNums > 0 then tableRoot:node(makeHeaderRow('Điểm trung bình', true, true)) tableRoot:node(makeRatingHeaderRow()) -- Assemble all of the Điểm trung bình local aggregates = {} if args.MC then table.insert(aggregates, { name = '[[Metacritic]]', sort = 'Metacritic', score = args.MC, }) end if args.ADM then table.insert(aggregates, { name = '[[AnyDecentMusic?]]', sort = 'AnyDecentMusic?', score = args.ADM, }) end for i, num in ipairs(aggregateNums) do local name = args['aggregate' .. num] local sort = findSortText(name) local score = args['aggregate' .. num .. 'score'] table.insert(aggregates, { name = name, sort = sort, score = score, }) end -- Sort the aggregates table.sort(aggregates, function (t1, t2) return t1.sort < t2.sort end) -- Add the aggregates to the HTML for i, t in ipairs(aggregates) do tableRoot:node(makeRow(t.name, t.score)) end end -- Review rows local reviewNums = mTableTools.affixNums(args, 'rev') local duplicateScores = false tableRoot:node(makeHeaderRow('Nguồn đánh giá', true, true)) tableRoot:node(makeRatingHeaderRow()) for i, num in ipairs(reviewNums) do local scoreArgs, nScoreArgs = getArgPermutations(args, 'rev', num, 'score') tableRoot:node(makeRow( args['rev' .. num], getScore(scoreArgs, nScoreArgs) )) if not duplicateScores and hasDuplicateScores(scoreArgs, nScoreArgs) then duplicateScores = true end end -- Tracking category if mw.title.getCurrentTitle().namespace == 0 and yesno(args.noprose) then root:wikitext('[[Category:Articles with music ratings that need to be turned into prose]]') end if duplicateScores then root:wikitext('[[Category:Pages using album ratings with duplicate score parameters]]') end return tostring(root)endfunction p.main(frame) local args = require('Module:Arguments').getArgs(frame, { wrappers = 'Template:Music ratings' }) return p._main(args)endreturn p