پرش به محتوا

پودمان:Time ago

از ویکی‌پدیا، دانشنامهٔ آزاد
توضیحات پودمان[ایجاد] [پاکسازی]
-- Implement [[Template:Time ago]]

local numConv = require('Module:Numeral converter').convert
local numberSpell, yesno  -- lazy load

function numberSpell(arg)
	numberSpell = require('Module:NumberSpell')._main
	return numberSpell(arg)
end

function yesno(arg)
	yesno = require('Module:Yesno')
	return yesno(arg)
end

function dateConv(d)
	local frame = mw.getCurrentFrame()
	local out
	local isError = frame:callParserFunction( '#iferror', {frame:callParserFunction('#time', {'U', d}), 'yes', 'no' })
	if yesno(isError) then
		out = frame:expandTemplate{title = 'تفبا', args = { d } }
	else
		out = d
	end
	return out
end

local p = {}

-- Table to convert entered text values to numeric values.
local timeText = {
	['seconds'] = 1,
	['ثانیه'] = 1,
	['minutes'] = 60,
	['دقیقه'] = 60,
	['hours'] = 3600,
	['ساعت'] = 3600,
	['days'] = 86400,
	['روز'] = 86400,
	['weeks'] = 604800,
	['هفته'] = 604800,
	['months'] = 2629800,  -- 365.25 * 24 * 60 * 60 / 12
	['ماه'] = 2629800,
	['years'] = 31557600,
	['سال'] = 31557600
}

-- Table containing tables of possible units to use in output.
local timeUnits = {
	[1] = { 'ثانیه', 'ثانیه', "ثانیه", "ثانیه", "ثانیه" },
	[60] = { 'دقیقه', 'دقیقه', "دقیقه", "دقیقه", "دقیقه" },
	[3600] = { 'ساعت', 'ساعت', "ساعت", "ساعت", "ساعت" },
	[86400] = { 'روز', 'روز', "روز", "روز", "روز" },
	[604800] = { 'هفته', 'هفته', "هفته", "هفته", "هفته", unit = 'w' },
	[2629800] = { 'ماه', 'ماه', "ماه", "ماه", "ماه", unit = 'm'  },
	[31557600] = { 'سال', 'سال', "سال", "سال", "سال", 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 or args['قدر']
	local min_magnitude = args.min_magnitude or args['قدر حداقل']
	local purge = args.purge or args['پاکسازی']
	
	-- args localization
	if args['پیش'] then args.ago = args['پیش'] end
	if args['هجی'] then args.spellout = args['هجی'] end
	if args['حداکثر هجی'] then args.spelloutmax = args['حداکثر هجی'] end
	if args['عددی'] then args.numeric = args['عددی'] end

	-- 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') .. ' پاکسازی])</span>'
	else
		purge = ''
	end

	-- Format the date provided to acceptable string (e.g. ۱۲ ژانویه ۲۰۲۲ to 12 January 2022)
	args[1] = dateConv(args[1])

	-- 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">خطا: ناتوان در تجزیهٔ پارامتر اول در قالب تاریخ یا زمان.</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('Module: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 punctuation_key, suffix
	if timeDiff >= 0 then -- Past
		if result_num == 1 then
			punctuation_key = 1
		else
			punctuation_key = 2
		end
		if args.ago == '' then
			suffix = ''
		else
			suffix = ' ' .. (args.ago or 'پیش')
		end
	else -- Future
		if args.ago == '' then
			suffix = ''
			if result_num == 1 then
				punctuation_key = 1
			else
				punctuation_key = 2
			end
		else
			suffix = ' آینده'
			if result_num == 1 then
				punctuation_key = 3
			else
				punctuation_key = 4
			end
		end
	end
	local result_unit = timeUnits[ magnitude_num ][ punctuation_key ]

	-- Convert numerals to words if appropriate.
	local spell_out = args.spellout
	local spell_out_max = tonumber(numConv('en', args.spelloutmax))
	local result_num_text
	if spell_out and (
		( (spell_out == 'auto' or spell_out == 'خودکار') 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( numConv( 'fa', result_num ) )
	end
	
	-- numeric or string
	local numeric_out = args.numeric
	local result = ""
	if numeric_out then
		result = tostring( numConv( 'fa', result_num ) )
	else
		result = result_num_text .. ' ' .. result_unit .. suffix -- Spaces for suffix have been added in earlier.
	end

	return result .. purge
end

function p.main( frame )
	local args = require( 'Module:Arguments' ).getArgs( frame, {
		valueFunc = function( k, v )
			if v then
				v = mw.ustring.match( v, '^%s*(.-)%s*$' ) -- Trim whitespace.
				if k == 'ago' or k == 'پیش' or v ~= '' then
					return v
				end
			end
			return nil
		end,
		wrappers = {
			'الگو:Time ago',
			'الگو:زمان گذشته'
		}
	})
	return p._main( args )
end

return p
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy