Mô đun:Time ago

-- Implement [[Template:Time ago]]

local numberSpell, yesno  -- lazy load

function numberSpell(arg)
	numberSpell = require('Mô đun:NumberSpell')._main
	return numberSpell(arg)
end

function yesno(arg)
	yesno = require('Mô đun:Yesno')
	return yesno(arg)
end

local p = {}

-- Table to convert entered text values to numeric values.
local timeText = {
	['giây'] = 1,
	['phút'] = 60,
	['giờ'] = 3600,
	['ngày'] = 86400,
	['tuần'] = 604800,
	['tháng'] = 2629800,  -- 365.25 * 24 * 60 * 60 / 12
	['năm'] = 31557600
}

-- Table containing tables of possible units to use in output.
local timeUnits = {
	[1] = { 'giây' },
	[60] = { 'phút' },
	[3600] = { 'giờ' },
	[86400] = { 'ngày' },
	[604800] = { 'tuần', unit = 'w' },
	[2629800] = { 'tháng', unit = 'm' },
	[31557600] = { 'năm', unit = 'y' }
}

function p._main( args )
	-- Initialize variables
	local lang = mw.language.getContentLanguage()
	local auto_magnitude_num
	local min_magnitude_num
	local magnitude = args.magnitude
	local min_magnitude = args.min_magnitude
	local purge = args.purge

	-- Add a purge link if something (usually "yes") is entered into the purge parameter
	if purge then
		purge = ' <span class="plainlinks">([' .. mw.title.getCurrentTitle():fullUrl('action=purge') .. ' làm tươi])</span>'
	else
		purge = ''
	end

	-- Check that the entered timestamp is valid. If it isn't, then give an error message.
	local success, inputTime = pcall( lang.formatDate, lang, 'xnU', args[1] )
	if not success then
		return '<strong class="error">Lỗi: Tham số đầu tiên không thể được phân tích như một ngày hoặc thời gian.</strong>'
	end

	-- Store the difference between the current time and the inputted time, as well as its absolute value.
	local timeDiff = lang:formatDate( 'xnU' ) - inputTime
	local absTimeDiff = math.abs( timeDiff )

	if magnitude then
		auto_magnitude_num = 0
		min_magnitude_num = timeText[magnitude]
	else
		-- Calculate the appropriate unit of time if it was not specified as an argument.
		local autoMagnitudeData = {
			{ factor = 2, amn = 31557600 },
			{ factor = 2, amn = 2629800 },
			{ factor = 2, amn = 86400 },
			{ factor = 2, amn = 3600 },
			{ factor = 2, amn = 60 }
		}
		for _, t in ipairs( autoMagnitudeData ) do
			if absTimeDiff / t.amn >= t.factor then
				auto_magnitude_num = t.amn
				break
			end
		end
		auto_magnitude_num = auto_magnitude_num or 1
		if min_magnitude then
			min_magnitude_num = timeText[min_magnitude]
		else
			min_magnitude_num = -1
		end
	end

	if not min_magnitude_num then
		-- Default to seconds if an invalid magnitude is entered.
		min_magnitude_num = 1
	end

	local result_num
	local magnitude_num = math.max( min_magnitude_num, auto_magnitude_num )
	local unit = timeUnits[magnitude_num].unit
	if unit and absTimeDiff >= 864000 then
		local Date = require('Mô đun:Date')._Date
		local input = lang:formatDate('Y-m-d H:i:s', args[1])  -- Date needs a clean date
		input = Date(input)
		if input then
			local id
			if input.hour == 0 and input.minute == 0 then
				id = 'currentdate'
			else
				id = 'currentdatetime'
			end
			result_num = (Date(id) - input):age(unit)
		end
	end
	result_num = result_num or math.floor ( absTimeDiff / magnitude_num )

	local suffix
	if timeDiff >= 0 then -- Past
		if args.ago == '' then
			suffix = ''
		else
			suffix = ' ' .. (args.ago or 'trước')
		end
	else -- Future
		if args.ago == '' then
			suffix = ''
		else
			suffix = ' tới'
		end
	end
	local result_unit = timeUnits[ magnitude_num ][ 1 ]

	-- Convert numerals to words if appropriate.
	local spell_out = args.spellout
	local spell_out_max = tonumber(args.spelloutmax)
	local result_num_text
	if spell_out and (
		( spell_out == 'auto' and 1 <= result_num and result_num <= 9 and result_num <= ( spell_out_max or 9 ) ) or
		( yesno( spell_out ) and 1 <= result_num and result_num <= 100 and result_num <= ( spell_out_max or 100 ) )
		)
	then
		result_num_text = numberSpell( result_num )
	else
		result_num_text = tostring( result_num )
	end

	local result = result_num_text .. ' ' .. result_unit .. suffix -- Spaces for suffix have been added in earlier.
	return result .. purge
end

function p.main( frame )
	local args = require( 'Mô đun:Arguments' ).getArgs( frame, {
		valueFunc = function( k, v )
			if v then
				v = v:match( '^%s*(.-)%s*$' ) -- Trim whitespace.
				if k == 'ago' or v ~= '' then
					return v
				end
			end
			return nil
		end,
		wrappers = 'Bản mẫu:Thời gian trước'
	})
	return p._main( args )
end

return p
Chúng tôi bán
Bài viết liên quan
Review Phim:
Review Phim: "Gia Tài Của Ngoại" - Khi "Thời Gian" Hóa Thành "Vàng Bạc"
Chắc hẳn, dạo gần đây, "How to Make Millions Before Grandma Dies" hay "หลานม่า" (Lahn Mah) đã trở thành cơn sốt điện ảnh Đông Nam Á
Nguồn gốc Mặt Nạ Kháng Ma trong Tensura
Nguồn gốc Mặt Nạ Kháng Ma trong Tensura
Ngay từ khi bắt đầu Tensura, hẳn chúng ta đã quá quen thuộc với hình ảnh Shizu và chiếc mặt nạ, thứ mà sau này được cô để lại cho Rimuru
Silco – Ác nhân tàn bạo hay Người “cha” đáng thương cùng sự cô đơn
Silco – Ác nhân tàn bạo hay Người “cha” đáng thương cùng sự cô đơn
Silco xuất hiện và được biết đến như một kẻ độc tài máu lạnh. Là người đồng đội cũ của Vander trong công cuộc tiến công vào thành phố phồn hoa Piltover với ước mơ giải thoát dân chúng tại Zaun khỏi sự ô nhiễm
Profile và tội của mấy thầy trò Đường Tăng trong Black Myth: Wukong
Profile và tội của mấy thầy trò Đường Tăng trong Black Myth: Wukong
Trong Black Myth: Wukong thì Sa Tăng và Tam Tạng không xuất hiện trong game nhưng cũng hiện diện ở những đoạn animation