Модуль:Video game reviews

Документация

Реализация {{оценки игры}} на Lua.

Строковые значения используемых полей, заголовков и прочего поставляются из Модуль:Video game reviews/data.

Статические методы

Вызываемые из других модулей через require():

  • strict - модуль вызывает ошибку при чтении любых нулевых глобальных переменных или записи в глобальные переменные за исключением arg. Детально смотри mw:Extension:Scribunto/Lua_reference_manual#strict
  • Module:Video game reviews/data - данные поставляемые для модуля Video game reviews. Документация по использованию.
  • Module:Yesno - модуль предоставляет единый интерфейс для обработки булевых или булевоподобных входных данных детально смотри Модуль:Yesno
require('strict')local p = {}local data = require('Module:Video game reviews/data')local yesno = require('Module:Yesno')local getArgslocal function getActiveSystems(args)local activeSystems = {}for k,v in pairs(args) doif data.systems[k] and yesno(v) thentable.insert(activeSystems, k)endendtable.sort(activeSystems, function(a, b)return data.systems[a].sortkey < data.systems[b].sortkeyend)return activeSystemsendlocal function getArgKeyTables(args)local reviewers, reviewersRu, aggregators, awards = {}, {}, {}, {}local hasObsolete = falsefor k in pairs(args) doif string.match(k, '^revRu%d+$') thentable.insert(reviewersRu, k)elseif string.match(k, '^rev%d+$') thentable.insert(reviewers, k)elseif string.match(k, '^agg%d+$') thentable.insert(aggregators, k)elseif string.match(k, '^award%d+$') thentable.insert(awards, k)elseif data.obsolete[k] thenhasObsolete = trueendendlocal function comparator(a, b)return tonumber(a:match('%d+')) < tonumber(b:match('%d+'))endtable.sort(reviewers, comparator)table.sort(reviewersRu, comparator)table.sort(aggregators, comparator)table.sort(awards, comparator)return reviewers, reviewersRu, aggregators, awards, hasObsoleteendlocal function getProvidedReviewersAndAggregators(args, usePlatforms)local providedReviewers, providedReviewersRu, providedAggregators = {}, {}, {}if usePlatforms thenlocal seen = {}for k in pairs(args) dolocal splitPos = string.find(k, '_')if splitPos thenlocal halfarg = string.sub(k, 1, splitPos - 1)if not seen[halfarg] thenseen[halfarg] = trueif data.reviewers[halfarg] thentable.insert(providedReviewers, halfarg)elseif data.reviewersRu[halfarg] thentable.insert(providedReviewersRu, halfarg)elseif data.aggregators[halfarg] thentable.insert(providedAggregators, halfarg)endendendendelsefor k in pairs(args) doif not string.find(k, '_') thenif data.reviewers[k] thentable.insert(providedReviewers, k)elseif data.reviewersRu[k] thentable.insert(providedReviewersRu, k)elseif data.aggregators[k] thentable.insert(providedAggregators, k)endendendendtable.sort(providedReviewers, function(a, b)return data.reviewers[a].sortkey < data.reviewers[b].sortkeyend)table.sort(providedReviewersRu, function(a, b)return data.reviewersRu[a].sortkey < data.reviewersRu[b].sortkeyend)table.sort(providedAggregators, function(a, b)return data.aggregators[a].sortkey < data.aggregators[b].sortkeyend)return providedReviewers, providedReviewersRu, providedAggregatorsendlocal function renderTitleRow(tbl, title, colspan)local caption = tbl:tag('caption')if title thencaption:wikitext(title)elsecaption:addClass('Reception'):wikitext(data.i18n.reception)endendlocal function renderMainHeading(builder, colspan, headingText, borderTop)builder:tag('tr'):tag('th'):attr('scope', 'colgroup'):attr('colspan', colspan):attr('class', 'ts-Оценки_игры-header'):css('border-top', borderTop):wikitext(headingText)endlocal function renderHeadingRowWithSystems(builder, mainHeading, activeSystems)renderMainHeading(builder, #activeSystems + 1, mainHeading)builder:tag('tr'):tag('th'):attr('scope', 'col'):attr('rowspan', '2'):attr('class', 'ts-Оценки_игры-subheader'):wikitext(data.i18n.publication):done():tag('th'):attr('scope', 'col'):attr('colspan', #activeSystems):attr('class', 'ts-Оценки_игры-subheader'):wikitext(data.i18n.score)builder = builder:tag('tr')for _,v in ipairs(activeSystems) dobuilder:tag('th'):attr('scope', 'col'):wikitext(data.systems[v].name)endendlocal function renderHeadingRow(builder, mainHeading, nameHeading)renderMainHeading(builder, 2, mainHeading)builder:tag('tr'):tag('th'):attr('scope', 'col'):attr('class', 'ts-Оценки_игры-subheader'):wikitext(nameHeading):done():tag('th'):attr('scope', 'col'):attr('class', 'ts-Оценки_игры-subheader'):wikitext(data.i18n.score)endlocal 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) dolocal combinedCode = code .. '_' .. vlocal cell = builder:tag('td')if args[combinedCode] thencell:css('vertical-align', 'middle'):css('font-size', '105%'):wikitext(args[combinedCode])elseif na thencell:css('color', 'lightgray'):css('vertical-align','middle'):css('text-align', 'center'):css('font-size', '105%'):addClass('table-na'):wikitext(data.i18n.na)endendendlocal 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', '105%'):wikitext(rating)endlocal function renderReviews(builder, providedReviewers, providedReviewersRu, providedAggregators, activeSystems, customAggregatorKeys, customReviewerKeys, customReviewerRuKeys, args)local hasReviewers = #providedReviewers ~= 0 or #customReviewerKeys ~= 0local hasReviewersRu = #providedReviewersRu ~= 0 or #customReviewerRuKeys ~= 0local hasAggregators = #providedAggregators ~= 0 or #customAggregatorKeys ~= 0builder:css('font-size', '100%')if #activeSystems ~= 0 then--builder:wikitext(data.i18n.multiplatformCategory)builder:css('font-size', '85%')local na = yesno(args.na)local showplatforms = #activeSystems ~= 1 or yesno(args.showplatforms)if hasAggregators then--if hasReviewers then--renderMainHeading(builder, #activeSystems+1, data.i18n.aggregateScores)--endif showplatforms thenrenderHeadingRowWithSystems(builder, data.i18n.aggregateScores, activeSystems)elserenderHeadingRow(builder, data.i18n.aggregateScores, data.i18n.aggregator)endfor _,v in ipairs(providedAggregators) dorenderRatingsBySystem(builder, v, data.aggregators[v].name, activeSystems, args, na)endfor _,v in ipairs(customAggregatorKeys) dorenderRatingsBySystem(builder, v, args[v], activeSystems, args, na)endendif hasReviewers thenif showplatforms thenrenderHeadingRowWithSystems(builder, data.i18n.reviewScores, activeSystems)elserenderHeadingRow(builder, data.i18n.reviewScores, data.i18n.publication)endfor _,v in ipairs(providedReviewers) dorenderRatingsBySystem(builder, v, data.reviewers[v].name, activeSystems, args, na)endfor _,v in ipairs(customReviewerKeys) dorenderRatingsBySystem(builder, v, args[v], activeSystems, args, na)endendif hasReviewersRu thenif showplatforms thenrenderHeadingRowWithSystems(builder, data.i18n.reviewScoresRu, activeSystems)elserenderHeadingRow(builder, data.i18n.reviewScoresRu, data.i18n.publication)endfor _,v in ipairs(providedReviewersRu) dorenderRatingsBySystem(builder, v, data.reviewersRu[v].name, activeSystems, args, na)endfor _,v in ipairs(customReviewerRuKeys) dorenderRatingsBySystem(builder, v, args[v], activeSystems, args, na)endendelse--builder:wikitext(data.i18n.singleplatformCategory)builder:css('font-size', '85%')if hasAggregators thenrenderHeadingRow(builder, data.i18n.aggregateScores, data.i18n.aggregator)for _,v in ipairs(providedAggregators) dorenderRating(builder, data.aggregators[v].name, args[v])endfor _,v in ipairs(customAggregatorKeys) dorenderRating(builder, args[v], args[v .. 'Score'])endendif hasReviewers thenrenderHeadingRow(builder, data.i18n.reviewScores, data.i18n.publication)for _,v in ipairs(providedReviewers) dorenderRating(builder, data.reviewers[v].name, args[v])endfor _,v in ipairs(customReviewerKeys) dorenderRating(builder, args[v], args[v .. 'Score'])endendif hasReviewersRu thenrenderHeadingRow(builder, data.i18n.reviewScoresRu, data.i18n.publication)for _,v in ipairs(providedReviewersRu) dorenderRating(builder, data.reviewersRu[v].name, args[v])endfor _,v in ipairs(customReviewerRuKeys) dorenderRating(builder, args[v], args[v .. 'Score'])endendendendlocal function renderAwards(builder, args, awardKeys, borderTop, activeSystems)if #activeSystems == 0 thenrenderMainHeading(builder, 2, data.i18n.awards, borderTop)elserenderMainHeading(builder, #activeSystems + 1, data.i18n.awards, borderTop)endif #activeSystems == 0 thenbuilder:tag('tr'):tag('th'):attr('scope', 'col'):wikitext(data.i18n.awardpublication):done():tag('th'):attr('scope', 'col'):wikitext(data.i18n.award)for _,v in ipairs(awardKeys) doif (args[v .. 'Pub'] ~= nil) thenbuilder:tag('tr'):tag('td'):css('font-weight','bold'):wikitext(args[v .. 'Pub']):done():tag('td'):wikitext(args[v])else builder:tag('tr'):tag('td'):attr('colspan',2):wikitext(args[v]):done()endendelsebuilder:tag('tr'):tag('th'):attr('scope', 'col'):wikitext(data.i18n.awardpublication):done():tag('th'):attr('scope', 'col'):attr('colspan', #activeSystems):wikitext(data.i18n.award)for _,v in ipairs(awardKeys) doif (args[v .. 'Pub'] ~= nil) thenbuilder:tag('tr'):tag('td'):css('font-weight','bold'):wikitext(args[v .. 'Pub']):done():tag('td'):attr('colspan', #activeSystems):wikitext(args[v])else builder:tag('tr'):tag('td'):attr('colspan', #activeSystems + 1):wikitext(args[v]):done()endendendendlocal function renderMainTable(providedReviewers, providedReviewersRu, providedAggregators, awardKeys, activeSystems, customAggregatorKeys, customReviewerKeys, customReviewerRuKeys, hasObsolete, args)local tbl = mw.html.create('table'):addClass('wikitable mw-collapsible ts-Оценки_игры'):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')renderTitleRow(tbl, args.title, 2)elserenderTitleRow(tbl, args.title, #activeSystems + 1)endif args.subtitle thentbl:tag('tr'):tag('th'):attr('scope', 'col'):css('font-size', '112%'):wikitext(args.subtitle)endrenderReviews(tbl, providedReviewers, providedReviewersRu, providedAggregators, activeSystems, customAggregatorKeys, customReviewerKeys, customReviewerRuKeys, args)if #awardKeys ~= 0 thenrenderAwards(tbl, args, awardKeys, (#customAggregatorKeys ~= 0 or #customReviewerKeys ~= 0 or #providedAggregators ~= 0 or #providedReviewers ~= 0) and 'none' or nil, activeSystems)endif hasObsolete thentbl:tag('tr'):tag('td'):css('color', 'red'):attr('colspan', 2):wikitext(data.i18n.obsoleteText)if mw.title.getCurrentTitle().namespace == 0 then  tbl:wikitext(data.i18n.obsoleteCategory)endendreturn tblendfunction p._reviewbox(args)local activeSystems = getActiveSystems(args)local customReviewerKeys, customReviewerRuKeys, customAggregatorKeys, awardKeys, hasObsolete = getArgKeyTables(args)local providedReviewers, providedReviewersRu, providedAggregators = getProvidedReviewersAndAggregators(args, #activeSystems ~= 0)if #customAggregatorKeys ~= 0 or #customReviewerKeys ~= 0 or #customReviewerRuKeys ~= 0 or #providedAggregators ~= 0 or #providedReviewers ~= 0 or #providedReviewersRu ~= 0 or #awardKeys ~= 0 thenreturn renderMainTable(providedReviewers, providedReviewersRu, providedAggregators, awardKeys, activeSystems, customAggregatorKeys, customReviewerKeys, customReviewerRuKeys, hasObsolete, args)--elseif mw.title.getCurrentTitle().namespace == 0 then--return data.i18n.emptyCategoryendendfunction p.reviewbox(frame)if not getArgs thengetArgs = require('Module:Arguments').getArgsendreturn p._reviewbox(getArgs(frame, {wrappers = data.i18n.wrapper, trim = false, translate = data.argi18n}))endreturn p