Перейти к содержимому страницы
Открыть меню
Переключить меню настроек
Открыть персональное меню
Вы не представились системе
Ваш IP-адрес будет виден всем, если вы внесёте какие-либо изменения.

Модуль:StarRating

Материал из вики «Вече»

Для документации этого модуля может быть создана страница Модуль:StarRating/doc

require( 'strict' )
local p = {}

local getArgs = require( 'Module:Arguments' ).getArgs
local currentTitle = mw.title.getCurrentTitle()

local ALT_TEXT = '%s из %s'
local ERROR_TEXT = 'Некорректно заполненный шаблон [[Шаблон:Рейтинг|Рейтинг]].'
-- [[Категория:Википедия:Страницы с некорректно заполненным шаблоном Рейтинг]]
local ERROR_CAT = 'Википедия:Страницы с некорректно заполненным шаблоном Рейтинг'

local function isEmpty( str )
	return str == nil or str == ''
end

local function showError()
	local result = mw.html.create( 'span' )
		:addClass( 'error' )
		:wikitext( ERROR_TEXT )
	
	if currentTitle.namespace == 0 and not isEmpty( ERROR_CAT ) then
		result:wikitext( string.format( '[[Category:%s]]', ERROR_CAT ) )
	end
	return tostring( result )
end

function p._main( num, to )
	local floorNum = math.floor( num )
	local ceilNum = math.ceil( num )
	local result = ''
	
	local size = '11px'
	if to > 6 then
		size = '7px'
	end

	local altText = string.format(
		ALT_TEXT, 
		tostring( num ):gsub( '%.', ',' ),
		tostring( to ):gsub( '%.', ',' )
	)
	for i = 1, to, 1 do
		local alt = i == 1 and altText or ''
		local starType = 'empty'
		if i <= floorNum then
			starType = 'full'
		elseif i > floorNum and i == ceilNum then
			starType = 'half'
		end
		
		result = result .. string.format( '[[File:Star %s.svg|%s|alt=%s|link=]]', starType, size, alt )
	end

	return string.format(
		'<span class="nowrap" title="%s">%s</span>',
		altText,
		result
	)
end

function p.main( frame )
	local args = getArgs( frame )
	local num = args[ 1 ]
	local to = args[ 2 ]

	if isEmpty( num ) or isEmpty( to ) then
		return showError()
	end

	-- Russian numeral conversion
	num = num:gsub( ',', '.' )
	to = to:gsub( ',', '.' )

	if tonumber( num ) == nil or tonumber( to ) == nil then
		return showError()
	end
	
	num = tonumber( num )
	to = tonumber( to )

	if num < 0 or to == 0 or to > 15 or num > to then
		return showError()
	end

	return p._main( num, to )
end

return p